size optimization

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5109 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2007-04-20 20:32:04 +00:00
parent ec2d800d42
commit acbd53f905
6 changed files with 65 additions and 36 deletions

View file

@ -2116,8 +2116,8 @@ void CEXEBuild::AddStandardStrings()
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
if (uninstall_mode)
{
cur_header->str_uninstchild = add_string("$TEMP\\$1");
cur_header->str_uninstcmd = add_string("\"$TEMP\\$1\" $0 _?=$INSTDIR\\");
cur_header->str_uninstchild = add_string("$TEMP\\$1u_.exe");
cur_header->str_uninstcmd = add_string("\"$TEMP\\$1u_.exe\" $0 _?=$INSTDIR\\");
}
#endif//NSIS_CONFIG_UNINSTALL_SUPPORT
#ifdef NSIS_SUPPORT_MOVEONREBOOT

View file

@ -197,7 +197,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
else
{
int x;
char s[] = "Au_.exe";
mystrcat(state_temp_dir,"~nsu.tmp");
@ -213,13 +212,13 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
mystrcpy(state_install_directory,state_exe_directory);
mystrcpy(g_usrvars[0], realcmds);
mystrcpy(g_usrvars[1], s);
*(LPWORD)g_usrvars[1] = CHAR2_TO_WORD('A',0);
for (x = 0; x < 26; x ++)
{
static char buf2[NSIS_MAX_STRLEN];
GetNSISString(buf2,g_header->str_uninstchild); // $TEMP\$1
GetNSISString(buf2,g_header->str_uninstchild); // $TEMP\$1u_.exe
DeleteFile(buf2); // clean up after all the other ones if they are there
@ -233,7 +232,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
MoveFileOnReboot(buf2,NULL);
MoveFileOnReboot(state_temp_dir,NULL);
#endif
GetNSISString(buf2,g_header->str_uninstcmd); // '"$TEMP\$1" $0 _?=$INSTDIR\'
GetNSISString(buf2,g_header->str_uninstcmd); // '"$TEMP\$1u_.exe" $0 _?=$INSTDIR\'
hProc=myCreateProcess(buf2);
if (hProc)
{
@ -279,9 +278,9 @@ end:
BOOL (WINAPI *OPT)(HANDLE, DWORD,PHANDLE);
BOOL (WINAPI *LPV)(LPCTSTR,LPCTSTR,PLUID);
BOOL (WINAPI *ATP)(HANDLE,BOOL,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD);
OPT=myGetProcAddress("ADVAPI32","OpenProcessToken");
LPV=myGetProcAddress("ADVAPI32","LookupPrivilegeValueA");
ATP=myGetProcAddress("ADVAPI32","AdjustTokenPrivileges");
OPT=myGetProcAddress(MGA_OpenProcessToken);
LPV=myGetProcAddress(MGA_LookupPrivilegeValueA);
ATP=myGetProcAddress(MGA_AdjustTokenPrivileges);
if (OPT && LPV && ATP)
{
HANDLE hToken;

View file

@ -232,9 +232,8 @@ FORCE_INLINE int NSISCALL ui_doinstall(void)
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_0xrn.asp
LANGID (WINAPI *GUDUIL)();
static const char guduil[] = "GetUserDefaultUILanguage";
GUDUIL = myGetProcAddress("KERNEL32", guduil);
GUDUIL = myGetProcAddress(MGA_GetUserDefaultUILanguage);
if (GUDUIL)
{
// Windows ME/2000+
@ -374,21 +373,20 @@ FORCE_INLINE int NSISCALL ui_doinstall(void)
#ifdef NSIS_CONFIG_LICENSEPAGE
{ // load richedit DLL
static char str1[]="RichEd20";
static char str2[]="RichEdit20A";
if (!LoadLibrary(str1))
static const char riched20[]="RichEd20";
static const char riched32[]="RichEd32";
static const char richedit20a[]="RichEdit20A";
static const char richedit[]="RichEdit";
if (!LoadLibrary(riched20))
{
*(WORD*)(str1+6) = CHAR2_TO_WORD('3','2');
LoadLibrary(str1);
LoadLibrary(riched32);
}
// make richedit20a point to RICHEDIT
if (!GetClassInfo(NULL,str2,&wc))
if (!GetClassInfo(NULL,richedit20a,&wc))
{
str2[8]=0;
GetClassInfo(NULL,str2,&wc);
wc.lpszClassName = str2;
str2[8]='2';
GetClassInfo(NULL,richedit,&wc);
wc.lpszClassName = richedit20a;
RegisterClass(&wc);
}
}
@ -920,9 +918,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
{
typedef HRESULT (WINAPI *SHAutoCompletePtr)(HWND, DWORD);
SHAutoCompletePtr fSHAutoComplete;
static const char shlwapi[] = "shlwapi";
static const char shac[] = "SHAutoComplete";
fSHAutoComplete = (SHAutoCompletePtr) myGetProcAddress(shlwapi, shac);
fSHAutoComplete = (SHAutoCompletePtr) myGetProcAddress(MGA_SHAutoComplete);
if (fSHAutoComplete)
{
fSHAutoComplete(hDir, SHACF_FILESYSTEM);
@ -996,7 +992,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
// Test for and use the GetDiskFreeSpaceEx API
{
BOOL (WINAPI *GDFSE)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) =
myGetProcAddress("KERNEL32", "GetDiskFreeSpaceExA");
myGetProcAddress(MGA_GetDiskFreeSpaceExA);
if (GDFSE)
{
ULARGE_INTEGER available64;

View file

@ -158,7 +158,7 @@ static LONG NSISCALL myRegDeleteKeyEx(HKEY thiskey, LPCTSTR lpSubKey, int onlyif
{
typedef LONG (WINAPI * RegDeleteKeyExAPtr)(HKEY, LPCTSTR, REGSAM, DWORD);
RegDeleteKeyExAPtr RDKE = (RegDeleteKeyExAPtr)
myGetProcAddress("ADVAPI32","RegDeleteKeyExA");
myGetProcAddress(MGA_RegDeleteKeyExA);
if (RDKE)
retval=RDKE(thiskey,lpSubKey,AlterRegistrySAM(0),0);

View file

@ -348,7 +348,7 @@ int NSISCALL is_valid_instpath(char *s)
return 1;
}
char * NSISCALL mystrstri(char *a, char *b)
char * NSISCALL mystrstri(char *a, const char *b)
{
int l = mystrlen(b);
while (mystrlen(a) >= l)
@ -418,7 +418,7 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
BOOL fOk = 0;
typedef BOOL (WINAPI *mfea_t)(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,DWORD dwFlags);
mfea_t mfea;
mfea=(mfea_t) myGetProcAddress("KERNEL32","MoveFileExA");
mfea=(mfea_t) myGetProcAddress(MGA_MoveFileExA);
if (mfea)
{
fOk=mfea(pszExisting, pszNew, MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING);
@ -430,7 +430,7 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
static char wininit[1024];
static char tmpbuf[1024];
int cchRenameLine;
char *szRenameSec = "[Rename]\r\n";
static const char szRenameSec[] = "[Rename]\r\n";
HANDLE hfile;
DWORD dwFileSize;
DWORD dwBytes;
@ -591,7 +591,8 @@ char * NSISCALL mystrcat(char *out, const char *concat)
char ps_tmpbuf[NSIS_MAX_STRLEN*2];
#define SYSREGKEY "Software\\Microsoft\\Windows\\CurrentVersion"
const char SYSREGKEY[] = "Software\\Microsoft\\Windows\\CurrentVersion";
const char QUICKLAUNCH[] = "\\Microsoft\\Internet Explorer\\Quick Launch";
// Based on Dave Laundon's simplified process_string
char * NSISCALL GetNSISString(char *outbuf, int strtab)
@ -666,7 +667,7 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
// for normal $APPDATA, it'd be CSIDL_APPDATA_COMMON
if (fldrs[2] == CSIDL_APPDATA)
{
mystrcat(out, "\\Microsoft\\Internet Explorer\\Quick Launch");
mystrcat(out, QUICKLAUNCH);
}
}
@ -882,15 +883,32 @@ WIN32_FIND_DATA * NSISCALL file_exists(char *buf)
return NULL;
}
void * NSISCALL myGetProcAddress(const char *dll, const char *func)
struct MGA_FUNC
{
HMODULE hModule = GetModuleHandle(dll);
const char *dll;
const char *func;
};
struct MGA_FUNC MGA_FUNCS[] = {
{"KERNEL32", "GetDiskFreeSpaceExA"},
{"KERNEL32", "MoveFileExA"},
{"ADVAPI32", "RegDeleteKeyExA"},
{"ADVAPI32", "OpenProcessToken"},
{"ADVAPI32", "LookupPrivilegeValueA"},
{"ADVAPI32", "AdjustTokenPrivileges"},
{"KERNEL32", "GetUserDefaultUILanguage"},
{"SHLWAPI", "SHAutoComplete"}
};
void * NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func)
{
HMODULE hModule = GetModuleHandle(MGA_FUNCS[func].dll);
if (!hModule)
hModule = LoadLibrary(dll);
hModule = LoadLibrary(MGA_FUNCS[func].dll);
if (!hModule)
return NULL;
return GetProcAddress(hModule, func);
return GetProcAddress(hModule, MGA_FUNCS[func].func);
}
void NSISCALL MessageLoop(UINT uCheckedMsg)

View file

@ -14,6 +14,9 @@
* warranty.
*/
#ifndef ___NSIS_UTIL_H___
#define ___NSIS_UTIL_H___
#include "../Platform.h"
#include "config.h"
#include <shlobj.h>
@ -91,7 +94,18 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew);
void NSISCALL mini_memcpy(void *out, const void *in, int len);
void NSISCALL remove_ro_attr(char *file);
void * NSISCALL myGetProcAddress(const char *dll, const char *func);
enum myGetProcAddressFunctions {
MGA_GetDiskFreeSpaceExA,
MGA_MoveFileExA,
MGA_RegDeleteKeyExA,
MGA_OpenProcessToken,
MGA_LookupPrivilegeValueA,
MGA_AdjustTokenPrivileges,
MGA_GetUserDefaultUILanguage,
MGA_SHAutoComplete
};
void * NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func);
void NSISCALL MessageLoop(UINT uCheckedMsg);
// Turn a pair of chars into a word
@ -103,3 +117,5 @@ void NSISCALL MessageLoop(UINT uCheckedMsg);
#define CHAR2_TO_WORD(a,b) (((WORD)(a))|((b)<<8))
#define CHAR4_TO_DWORD(a,b,c,d) (((DWORD)CHAR2_TO_WORD(a,b))|(CHAR2_TO_WORD(c,d)<<16))
#endif
#endif//!___NSIS_UTIL_H___