From acbd53f905ac893166a7b702c58a28e84cfa869b Mon Sep 17 00:00:00 2001 From: kichik Date: Fri, 20 Apr 2007 20:32:04 +0000 Subject: [PATCH] size optimization git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5109 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/build.cpp | 4 ++-- Source/exehead/Main.c | 13 ++++++------- Source/exehead/Ui.c | 28 ++++++++++++---------------- Source/exehead/exec.c | 2 +- Source/exehead/util.c | 36 +++++++++++++++++++++++++++--------- Source/exehead/util.h | 18 +++++++++++++++++- 6 files changed, 65 insertions(+), 36 deletions(-) diff --git a/Source/build.cpp b/Source/build.cpp index 57316cdc..119ad33f 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -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 diff --git a/Source/exehead/Main.c b/Source/exehead/Main.c index 489a1d2f..797f57c9 100644 --- a/Source/exehead/Main.c +++ b/Source/exehead/Main.c @@ -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; diff --git a/Source/exehead/Ui.c b/Source/exehead/Ui.c index c9e56f2d..eec7e1ba 100644 --- a/Source/exehead/Ui.c +++ b/Source/exehead/Ui.c @@ -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; diff --git a/Source/exehead/exec.c b/Source/exehead/exec.c index 4a7eb962..1bfff151 100644 --- a/Source/exehead/exec.c +++ b/Source/exehead/exec.c @@ -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); diff --git a/Source/exehead/util.c b/Source/exehead/util.c index e3c6c99c..473caa92 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -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) diff --git a/Source/exehead/util.h b/Source/exehead/util.h index 74dca8d3..5ca15ed4 100644 --- a/Source/exehead/util.h +++ b/Source/exehead/util.h @@ -14,6 +14,9 @@ * warranty. */ +#ifndef ___NSIS_UTIL_H___ +#define ___NSIS_UTIL_H___ + #include "../Platform.h" #include "config.h" #include @@ -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___