Fix WoW64 detection on ARM64 so we can avoid using the CUI helper application

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7087 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2019-03-04 22:15:41 +00:00
parent 217f250466
commit 8b652965b1

View file

@ -82,21 +82,38 @@ BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved
#define TAB_REPLACE _T(" ") #define TAB_REPLACE _T(" ")
#define TAB_REPLACE_SIZE (sizeof(TAB_REPLACE)-1) #define TAB_REPLACE_SIZE (sizeof(TAB_REPLACE)-1)
BOOL IsWOW64() { static BOOL IsWOW64() {
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); #ifdef _WIN64
BOOL wow64; return FALSE;
LPFN_ISWOW64PROCESS fnIsWow64Process; #else
typedef BOOL (WINAPI*ISWOW64PROCESS)(HANDLE, BOOL*);
fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( ISWOW64PROCESS pfIsWow64Process;
GetModuleHandle(_T("kernel32")), "IsWow64Process"); typedef BOOL (WINAPI*ISWOW64PROCESS2)(HANDLE, USHORT*, USHORT*);
ISWOW64PROCESS2 pfIsWow64Process2;
if (fnIsWow64Process != NULL) { HANDLE hProcess = GetCurrentProcess();
if (fnIsWow64Process(GetCurrentProcess(), &wow64)) { HMODULE hK32 = GetModuleHandleA("KERNEL32");
return wow64; UINT_PTR retval;
USHORT appmach, image_file_machine_unknown = 0;
CHAR funcnam[16]
#if defined(_MSC_VER) && (_MSC_VER-0 <= 1400)
= "IsWow64Process2"; // MOVSD * 4
#else
; lstrcpyA(funcnam, "IsWow64Process2");
#endif
pfIsWow64Process2 = (ISWOW64PROCESS2) GetProcAddress(hK32, funcnam);
if (pfIsWow64Process2 && pfIsWow64Process2(hProcess, &appmach, NULL)) {
retval = image_file_machine_unknown != appmach;
}
else {
BOOL wow64;
pfIsWow64Process = (ISWOW64PROCESS) GetProcAddress(hK32, (funcnam[14] = '\0', funcnam));
retval = (UINT_PTR) pfIsWow64Process;
if (pfIsWow64Process && (retval = pfIsWow64Process(hProcess, &wow64))) {
retval = wow64;
} }
} }
return (BOOL) (UINT) retval;
return FALSE; #endif
} }
/** /**