Try to work around the mingw-w64 kernel32:OpenThreadToken library issue

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7192 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2020-06-29 23:08:12 +00:00
parent 8f0822bc5a
commit 5c78d6fafe
9 changed files with 41 additions and 24 deletions

View file

@ -5,9 +5,9 @@ files = Split("""
""")
libs = Split("""
kernel32
advapi32
user32
kernel32
""")
examples = Split("""

View file

@ -13,6 +13,24 @@ FORCEINLINE DWORD NoDepr_GetVersion() { __pragma(warning(push))__pragma(warning(
typedef BOOL (WINAPI*CHECKTOKENMEMBERSHIP)(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember);
CHECKTOKENMEMBERSHIP _CheckTokenMembership=NULL;
static FARPROC GetAA32ProcAddress(LPCSTR FuncName)
{
return GetProcAddress(GetModuleHandleA("ADVAPI32"), FuncName);
}
#if defined(NSIS_FORCERUNTIMELINKING) //__MINGW64_VERSION_MAJOR+0 >= 1
// OpenThreadToken is exported by kernel32.lib in mingw-w64 breaking < Win7 where it only exists in advapi32.
// sourceforge.net/p/mingw-w64/bugs/235/# & 821 with fix adapted from the negrutiu NSIS fork.
// We try to work around this by specifying advapi32 before kernel32 in the list of libraries but if that fails, set the preceding define.
#define OpenThreadToken DelayedOpenThreadToken
static BOOL WINAPI DelayedOpenThreadToken(HANDLE Thread, DWORD Access, BOOL OpenAsSelf, HANDLE*Token)
{
typedef BOOL (WINAPI*OTT)(HANDLE, DWORD, BOOL, HANDLE*);
OTT func = (OTT) GetAA32ProcAddress("OpenThreadToken");
return func(Thread, Access, OpenAsSelf, Token);
}
#endif
void __declspec(dllexport) GetName(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
@ -74,8 +92,7 @@ TCHAR* GetAccountTypeHelper(BOOL CheckTokenForGroupDeny)
// GetUserName is in advapi32.dll so we can avoid Load/Freelibrary
_CheckTokenMembership=
#ifndef _WIN64
(CHECKTOKENMEMBERSHIP) GetProcAddress(
GetModuleHandle(_T("ADVAPI32")), "CheckTokenMembership");
(CHECKTOKENMEMBERSHIP) GetAA32ProcAddress("CheckTokenMembership");
#else
CheckTokenMembership;
#endif