| 108 | } |
| 109 | |
| 110 | static BOOL IsWOW64(void) { |
| 111 | #ifdef _WIN64 |
| 112 | return FALSE; |
| 113 | #else |
| 114 | typedef BOOL (WINAPI*ISWOW64PROCESS)(HANDLE, BOOL*); |
| 115 | ISWOW64PROCESS pfIsWow64Process; |
| 116 | typedef BOOL (WINAPI*ISWOW64PROCESS2)(HANDLE, USHORT*, USHORT*); |
| 117 | ISWOW64PROCESS2 pfIsWow64Process2; |
| 118 | HANDLE hProcess = GetCurrentProcess(); |
| 119 | HMODULE hK32 = GetModuleHandleA("KERNEL32"); |
| 120 | UINT_PTR retval; |
| 121 | USHORT appmach, image_file_machine_unknown = 0; |
| 122 | CHAR funcnam[16] |
| 123 | #if defined(_MSC_VER) && (_MSC_VER-0 <= 1400) |
| 124 | = "IsWow64Process2"; // MOVSD * 4 |
| 125 | #else |
| 126 | ; lstrcpyA(funcnam, "IsWow64Process2"); |
| 127 | #endif |
| 128 | pfIsWow64Process2 = (ISWOW64PROCESS2) GetProcAddress(hK32, funcnam); |
| 129 | if (pfIsWow64Process2 && pfIsWow64Process2(hProcess, &appmach, NULL)) { |
| 130 | retval = image_file_machine_unknown != appmach; |
| 131 | } |
| 132 | else { |
| 133 | BOOL wow64; |
| 134 | pfIsWow64Process = (ISWOW64PROCESS) GetProcAddress(hK32, (funcnam[14] = '\0', funcnam)); |
| 135 | retval = (UINT_PTR) pfIsWow64Process; |
| 136 | if (pfIsWow64Process && (retval = pfIsWow64Process(hProcess, &wow64))) { |
| 137 | retval = wow64; |
| 138 | } |
| 139 | } |
| 140 | return (BOOL) (UINT) retval; |
| 141 | #endif |
| 142 | } |
| 143 | |
| 144 | // Tim Kosse's LogMessage |
| 145 | #ifdef UNICODE |