The MinGW builds failed with:
In file included from gtasa.cpp:6:0:
../mumble_plugin_main.h: In instantiation of 'T peekProc(const procptr_t&) [with T = unsigned char; procptr_t = long long unsigned int]':
gtasa.cpp:25:59: required from here
../mumble_plugin_main.h:47:9: error: 'memset' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
memset(&ret, 0, sizeof(ret));
^
In file included from /usr/lib/mxe/usr/x86_64-w64-mingw32.static/include/guiddef.h:154:0,
from /usr/lib/mxe/usr/x86_64-w64-mingw32.static/include/winnt.h:635,
from /usr/lib/mxe/usr/x86_64-w64-mingw32.static/include/minwindef.h:163,
from /usr/lib/mxe/usr/x86_64-w64-mingw32.static/include/windef.h:8,
from /usr/lib/mxe/usr/x86_64-w64-mingw32.static/include/windows.h:69,
from ./../mumble_plugin_win32.h:21,
from ../mumble_plugin_main.h:95,
from gtasa.cpp:6:
/usr/lib/mxe/usr/x86_64-w64-mingw32.static/include/string.h:53:18: note: 'void* memset(void*, int, size_t)' declared here, later in the translation unit
void * __cdecl memset(void *_Dst,int _Val,size_t _Size);
^
Aside from being faster, it also requires less code.
This commit also changes the way architecture is detected for Win32 processes.
Previously, we relied on the Wine's preloader binary's architecture because we read its ELF header; now we read the NT header(s) by calling isWin32Process64Bit() (implemented in 86154c8234).
This is better than our current method because:
1. We don't need an extra handle (IsWow64Process() requires PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION).
2. It's more reliable: our current method consists in checking the result of IsWow64Process() (true if the process is 32 bit on 64 bit Windows) and the size of void * (4 bytes if 32 bit, 8 bytes if 64 bit).
It works correctly with a 32 bit plugin on 32 bit Windows and with a 64 bit plugin on 64 bit Windows; it doesn't work correctly when the plugin is 32 bit on 64 bit Windows: 64 bit processes are detected as 32 bit.
3. We can use the same method on Linux (the NT image is loaded in memory by Wine).
This is in preparation for the new Source Engine plugin which will add a few common functions.
This commit also improves the functions arguments so that they are passed by reference and marked as const (when possible).
A new data type called procid_t is created, intended to be a replacement for pid_t (Linux) and DWORD (Windows).