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

@ -52,8 +52,8 @@ BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib nsis\pluginapi.lib /nologo /entry:"DllMain" /dll /machine:I386 /nodefaultlib /out:"../../Plugins/exdll.dll" /opt:nowin98
# ADD BASE LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib /nologo /dll /machine:I386
# ADD LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib nsis\pluginapi.lib /nologo /entry:"DllMain" /dll /machine:I386 /nodefaultlib /out:"../../Plugins/exdll.dll" /opt:nowin98
# SUBTRACT LINK32 /pdb:none
!ELSEIF "$(CFG)" == "exdll - Win32 Debug"
@ -79,8 +79,8 @@ BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib nsis\pluginapi.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD BASE LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib nsis\pluginapi.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
!ENDIF

View file

@ -5,11 +5,11 @@ files = Split("""
""")
libs = Split("""
kernel32
oleaut32
advapi32
user32
oleaut32
ole32
user32
kernel32
""")
Import('BuildUtil env GetArcCPU')

View file

@ -31,7 +31,6 @@ resources = Split("""
""")
libs = Split("""
kernel32
advapi32
user32
gdi32
@ -42,6 +41,7 @@ libs = Split("""
comctl32
wininet
winmm
kernel32
""")
docs = Split("""

View file

@ -9,10 +9,10 @@ files = Split("""
""")
libs = Split("""
kernel32
user32
advapi32
wsock32
user32
kernel32
""")
docs = Split("""

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

View file

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

View file

@ -14,12 +14,12 @@ resources = Split("""
rc = 'res.rc'
libs = Split("""
user32
gdi32
comctl32
comdlg32
advapi32
shell32
comctl32
comdlg32
user32
gdi32
z
""")

View file

@ -35,14 +35,14 @@ zlib_files = Split("""
""")
libs = Split("""
kernel32
user32
gdi32
shell32
advapi32
shell32
ole32
comdlg32
comctl32
ole32
user32
gdi32
kernel32
uuid
""")