diff --git a/Source/Platform.h b/Source/Platform.h index 9aed59da..f0351642 100644 --- a/Source/Platform.h +++ b/Source/Platform.h @@ -7,7 +7,7 @@ #ifdef _WIN32 # ifndef _WIN32_IE -# define _WIN32_IE 0x0400 +# define _WIN32_IE 0x0500 # endif # include # include diff --git a/Source/exehead/Main.c b/Source/exehead/Main.c index a84b2570..a597a3bc 100644 --- a/Source/exehead/Main.c +++ b/Source/exehead/Main.c @@ -272,26 +272,22 @@ end: #ifdef NSIS_SUPPORT_REBOOT if (g_exec_flags.reboot_called) { - HANDLE h=GetModuleHandle("ADVAPI32.dll"); - if (h) + 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.dll","OpenProcessToken"); + LPV=myGetProcAddress("ADVAPI32.dll","LookupPrivilegeValueA"); + ATP=myGetProcAddress("ADVAPI32.dll","AdjustTokenPrivileges"); + if (OPT && LPV && ATP) { - BOOL (WINAPI *OPT)(HANDLE, DWORD,PHANDLE); - BOOL (WINAPI *LPV)(LPCTSTR,LPCTSTR,PLUID); - BOOL (WINAPI *ATP)(HANDLE,BOOL,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD); - OPT=(void*)GetProcAddress(h,"OpenProcessToken"); - LPV=(void*)GetProcAddress(h,"LookupPrivilegeValueA"); - ATP=(void*)GetProcAddress(h,"AdjustTokenPrivileges"); - if (OPT && LPV && ATP) + HANDLE hToken; + TOKEN_PRIVILEGES tkp; + if (OPT(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { - HANDLE hToken; - TOKEN_PRIVILEGES tkp; - if (OPT(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) - { - LPV(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); - tkp.PrivilegeCount = 1; - tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - ATP(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); - } + LPV(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); + tkp.PrivilegeCount = 1; + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + ATP(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); } } diff --git a/Source/exehead/Ui.c b/Source/exehead/Ui.c index ce68865f..35c344f2 100644 --- a/Source/exehead/Ui.c +++ b/Source/exehead/Ui.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "resource.h" @@ -837,6 +838,8 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar } if (uMsg == WM_INITDIALOG) { + HWND hDir = GetUIItem(IDC_DIR); + #ifdef NSIS_CONFIG_LOG if (GetAsyncKeyState(VK_SHIFT)&0x8000) { @@ -847,10 +850,20 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar #endif if (validpathspec(dir) && !skip_root(dir)) addtrailingslash(dir); - SetUITextNT(IDC_DIR,dir); + my_SetWindowText(hDir,dir); SetUITextFromLang(IDC_BROWSE,this_page->parms[2]); SetUITextFromLang(IDC_SELDIRTEXT,this_page->parms[1]); - SetActiveCtl(GetUIItem(IDC_DIR)); + SetActiveCtl(hDir); + + { + typedef HRESULT (WINAPI *SHAutoCompletePtr)(HWND, DWORD); + SHAutoCompletePtr fSHAutoComplete; + fSHAutoComplete = (SHAutoCompletePtr) myGetProcAddress("SHLWAPI.dll", "SHAutoComplete"); + if (fSHAutoComplete) + { + fSHAutoComplete(hDir, SHACF_FILESYSTEM); + } + } } if (uMsg == WM_COMMAND) { @@ -902,7 +915,6 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar int error = 0; int available_set = 0; unsigned total, available = 0xFFFFFFFF; - HMODULE hLib; GetUIText(IDC_DIR,dir); if (!is_valid_instpath(dir)) @@ -914,11 +926,9 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar *p=0; // Test for and use the GetDiskFreeSpaceEx API - hLib = GetModuleHandle("KERNEL32.dll"); - if (hLib) { BOOL (WINAPI *GDFSE)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) = - (void*)GetProcAddress(hLib, "GetDiskFreeSpaceExA"); + myGetProcAddress("KERNEL32.dll", "GetDiskFreeSpaceExA"); if (GDFSE) { ULARGE_INTEGER available64; @@ -929,7 +939,6 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar available_set++; } } - } if (!available_set) diff --git a/Source/exehead/util.c b/Source/exehead/util.c index c3c3714b..1432749b 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -379,16 +379,12 @@ char * NSISCALL my_GetTempFileName(char *buf, const char *dir) void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew) { BOOL fOk = 0; - HMODULE hLib=GetModuleHandle("KERNEL32.dll"); - if (hLib) + typedef BOOL (WINAPI *mfea_t)(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,DWORD dwFlags); + mfea_t mfea; + mfea=(mfea_t) myGetProcAddress("KERNEL32.dll","MoveFileExA"); + if (mfea) { - typedef BOOL (WINAPI *mfea_t)(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,DWORD dwFlags); - mfea_t mfea; - mfea=(mfea_t) GetProcAddress(hLib,"MoveFileExA"); - if (mfea) - { - fOk=mfea(pszExisting, pszNew, MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING); - } + fOk=mfea(pszExisting, pszNew, MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING); } if (!fOk) @@ -789,3 +785,14 @@ WIN32_FIND_DATA * NSISCALL file_exists(char *buf) } return NULL; } + +void * NSISCALL myGetProcAddress(char *dll, char *func) +{ + HMODULE hModule = GetModuleHandle(dll); + if (!hModule) + hModule = LoadLibrary(dll); + if (!hModule) + return NULL; + + return GetProcAddress(hModule, func); +} diff --git a/Source/exehead/util.h b/Source/exehead/util.h index cbeb5b7e..db99f2be 100644 --- a/Source/exehead/util.h +++ b/Source/exehead/util.h @@ -70,6 +70,8 @@ void NSISCALL validate_filename(char *fn); void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew); void NSISCALL mini_memcpy(void *out, const void *in, int len); +void * NSISCALL myGetProcAddress(char *dll, char *func); + // Turn a pair of chars into a word // Turn four chars into a dword #ifdef __BIG_ENDIAN__ // Not very likely, but, still...