added auto completion to the directory page
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4236 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
7ecd1d3185
commit
86ccf99b80
5 changed files with 49 additions and 35 deletions
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
# ifndef _WIN32_IE
|
# ifndef _WIN32_IE
|
||||||
# define _WIN32_IE 0x0400
|
# define _WIN32_IE 0x0500
|
||||||
# endif
|
# endif
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
# include <commctrl.h>
|
# include <commctrl.h>
|
||||||
|
|
|
@ -272,26 +272,22 @@ end:
|
||||||
#ifdef NSIS_SUPPORT_REBOOT
|
#ifdef NSIS_SUPPORT_REBOOT
|
||||||
if (g_exec_flags.reboot_called)
|
if (g_exec_flags.reboot_called)
|
||||||
{
|
{
|
||||||
HANDLE h=GetModuleHandle("ADVAPI32.dll");
|
BOOL (WINAPI *OPT)(HANDLE, DWORD,PHANDLE);
|
||||||
if (h)
|
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);
|
HANDLE hToken;
|
||||||
BOOL (WINAPI *LPV)(LPCTSTR,LPCTSTR,PLUID);
|
TOKEN_PRIVILEGES tkp;
|
||||||
BOOL (WINAPI *ATP)(HANDLE,BOOL,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD);
|
if (OPT(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
|
||||||
OPT=(void*)GetProcAddress(h,"OpenProcessToken");
|
|
||||||
LPV=(void*)GetProcAddress(h,"LookupPrivilegeValueA");
|
|
||||||
ATP=(void*)GetProcAddress(h,"AdjustTokenPrivileges");
|
|
||||||
if (OPT && LPV && ATP)
|
|
||||||
{
|
{
|
||||||
HANDLE hToken;
|
LPV(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
|
||||||
TOKEN_PRIVILEGES tkp;
|
tkp.PrivilegeCount = 1;
|
||||||
if (OPT(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <windowsx.h>
|
#include <windowsx.h>
|
||||||
#include <shlobj.h>
|
#include <shlobj.h>
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
|
#include <shlwapi.h>
|
||||||
|
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
|
|
||||||
|
@ -837,6 +838,8 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
}
|
}
|
||||||
if (uMsg == WM_INITDIALOG)
|
if (uMsg == WM_INITDIALOG)
|
||||||
{
|
{
|
||||||
|
HWND hDir = GetUIItem(IDC_DIR);
|
||||||
|
|
||||||
#ifdef NSIS_CONFIG_LOG
|
#ifdef NSIS_CONFIG_LOG
|
||||||
if (GetAsyncKeyState(VK_SHIFT)&0x8000)
|
if (GetAsyncKeyState(VK_SHIFT)&0x8000)
|
||||||
{
|
{
|
||||||
|
@ -847,10 +850,20 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
#endif
|
#endif
|
||||||
if (validpathspec(dir) && !skip_root(dir))
|
if (validpathspec(dir) && !skip_root(dir))
|
||||||
addtrailingslash(dir);
|
addtrailingslash(dir);
|
||||||
SetUITextNT(IDC_DIR,dir);
|
my_SetWindowText(hDir,dir);
|
||||||
SetUITextFromLang(IDC_BROWSE,this_page->parms[2]);
|
SetUITextFromLang(IDC_BROWSE,this_page->parms[2]);
|
||||||
SetUITextFromLang(IDC_SELDIRTEXT,this_page->parms[1]);
|
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)
|
if (uMsg == WM_COMMAND)
|
||||||
{
|
{
|
||||||
|
@ -902,7 +915,6 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
int error = 0;
|
int error = 0;
|
||||||
int available_set = 0;
|
int available_set = 0;
|
||||||
unsigned total, available = 0xFFFFFFFF;
|
unsigned total, available = 0xFFFFFFFF;
|
||||||
HMODULE hLib;
|
|
||||||
|
|
||||||
GetUIText(IDC_DIR,dir);
|
GetUIText(IDC_DIR,dir);
|
||||||
if (!is_valid_instpath(dir))
|
if (!is_valid_instpath(dir))
|
||||||
|
@ -914,11 +926,9 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
*p=0;
|
*p=0;
|
||||||
|
|
||||||
// Test for and use the GetDiskFreeSpaceEx API
|
// Test for and use the GetDiskFreeSpaceEx API
|
||||||
hLib = GetModuleHandle("KERNEL32.dll");
|
|
||||||
if (hLib)
|
|
||||||
{
|
{
|
||||||
BOOL (WINAPI *GDFSE)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) =
|
BOOL (WINAPI *GDFSE)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) =
|
||||||
(void*)GetProcAddress(hLib, "GetDiskFreeSpaceExA");
|
myGetProcAddress("KERNEL32.dll", "GetDiskFreeSpaceExA");
|
||||||
if (GDFSE)
|
if (GDFSE)
|
||||||
{
|
{
|
||||||
ULARGE_INTEGER available64;
|
ULARGE_INTEGER available64;
|
||||||
|
@ -929,7 +939,6 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
available_set++;
|
available_set++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!available_set)
|
if (!available_set)
|
||||||
|
|
|
@ -379,16 +379,12 @@ char * NSISCALL my_GetTempFileName(char *buf, const char *dir)
|
||||||
void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
|
void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
|
||||||
{
|
{
|
||||||
BOOL fOk = 0;
|
BOOL fOk = 0;
|
||||||
HMODULE hLib=GetModuleHandle("KERNEL32.dll");
|
typedef BOOL (WINAPI *mfea_t)(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,DWORD dwFlags);
|
||||||
if (hLib)
|
mfea_t mfea;
|
||||||
|
mfea=(mfea_t) myGetProcAddress("KERNEL32.dll","MoveFileExA");
|
||||||
|
if (mfea)
|
||||||
{
|
{
|
||||||
typedef BOOL (WINAPI *mfea_t)(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,DWORD dwFlags);
|
fOk=mfea(pszExisting, pszNew, MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING);
|
||||||
mfea_t mfea;
|
|
||||||
mfea=(mfea_t) GetProcAddress(hLib,"MoveFileExA");
|
|
||||||
if (mfea)
|
|
||||||
{
|
|
||||||
fOk=mfea(pszExisting, pszNew, MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fOk)
|
if (!fOk)
|
||||||
|
@ -789,3 +785,14 @@ WIN32_FIND_DATA * NSISCALL file_exists(char *buf)
|
||||||
}
|
}
|
||||||
return NULL;
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -70,6 +70,8 @@ void NSISCALL validate_filename(char *fn);
|
||||||
void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew);
|
void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew);
|
||||||
void NSISCALL mini_memcpy(void *out, const void *in, int len);
|
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 a pair of chars into a word
|
||||||
// Turn four chars into a dword
|
// Turn four chars into a dword
|
||||||
#ifdef __BIG_ENDIAN__ // Not very likely, but, still...
|
#ifdef __BIG_ENDIAN__ // Not very likely, but, still...
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue