Fully migrate to wrapper DLLs
This commit is contained in:
1 parent
a190787f3b
commit
4bfb5b958e
8 files changed
+854
-69
No files matched your search
+86
@@ -0,0 +1,86 @@
|
||||
#include "common.h"
|
||||
#include "kernel32.h"
|
||||
|
||||
typedef LPWCH (__cdecl *wcscpyPtr)(LPWCH dest, LPWCH source);
|
||||
typedef size_t (__cdecl *wcstombsPtr)(LPSTR dest, LPWCH source, size_t maxCount);
|
||||
typedef LONG (WINAPI *RegOpenKeyExWPtr)(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);
|
||||
typedef LONG (WINAPI *RegQueryValueExWPtr)(HKEY hKey, LPCWSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
|
||||
typedef LONG (WINAPI *RegCloseKeyPtr)(HKEY hKey);
|
||||
|
||||
DLL_EXPORT WINAPI BOOL GetVersionExW(LPOSVERSIONINFOW version) {
|
||||
if (version->dwOSVersionInfoSize == sizeof(OSVERSIONINFOW)) {
|
||||
version->dwMajorVersion = 4;
|
||||
version->dwMinorVersion = 0;
|
||||
version->dwBuildNumber = 1381;
|
||||
version->dwPlatformId = VER_PLATFORM_WIN32_NT;
|
||||
version->szCSDVersion[0] = L'\0';
|
||||
//wcscpyPtr wcscpy = (wcscpyPtr) getFunction("msvcrt.dll", "wcscpy");
|
||||
//wcscpy(version->szCSDVersion, L"Befator Inc gruesst Sie!");
|
||||
|
||||
RegOpenKeyExWPtr regOpenKeyExW = (RegOpenKeyExWPtr) getFunction("advapi32.dll", "RegOpenKeyExW");
|
||||
RegQueryValueExWPtr regQueryValueExW = (RegQueryValueExWPtr) getFunction("advapi32.dll", "RegQueryValueExW");
|
||||
RegCloseKeyPtr regCloseKey = (RegCloseKeyPtr) getFunction("advapi32.dll", "RegCloseKey");
|
||||
HKEY key;
|
||||
if (regOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\BCompat", 0, KEY_READ, &key) == ERROR_SUCCESS) {
|
||||
DWORD size;
|
||||
DWORD major = 0;
|
||||
if (regQueryValueExW(key, L"ReportedMajor", NULL, NULL, (LPBYTE) &major, &size) == ERROR_SUCCESS) {
|
||||
version->dwMajorVersion = major;
|
||||
}
|
||||
DWORD minor = 0;
|
||||
if (regQueryValueExW(key, L"ReportedMinor", NULL, NULL, (LPBYTE) &minor, &size) == ERROR_SUCCESS) {
|
||||
version->dwMinorVersion = minor;
|
||||
}
|
||||
DWORD build = 0;
|
||||
if (regQueryValueExW(key, L"ReportedBuild", NULL, NULL, (LPBYTE) &build, &size) == ERROR_SUCCESS) {
|
||||
version->dwBuildNumber = build;
|
||||
}
|
||||
DWORD platform = 0;
|
||||
if (regQueryValueExW(key, L"ReportedPlatform", NULL, NULL, (LPBYTE) &platform, &size) == ERROR_SUCCESS) {
|
||||
version->dwPlatformId = platform;
|
||||
}
|
||||
size = sizeof(version->szCSDVersion);
|
||||
if (regQueryValueExW(key, L"ReportedServicePack", NULL, NULL, (LPBYTE) &version->szCSDVersion, &size) == ERROR_SUCCESS) {
|
||||
version->szCSDVersion[127] = L'\0';
|
||||
}
|
||||
regCloseKey(key);
|
||||
}
|
||||
return TRUE;
|
||||
} else {
|
||||
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
DLL_EXPORT WINAPI BOOL GetVersionExA(LPOSVERSIONINFOA version) {
|
||||
if (version->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA)) {
|
||||
OSVERSIONINFOW versionW;
|
||||
versionW.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
||||
if (GetVersionExW(&versionW)) {
|
||||
version->dwMajorVersion = versionW.dwMajorVersion;
|
||||
version->dwMinorVersion = versionW.dwMinorVersion;
|
||||
version->dwBuildNumber = versionW.dwBuildNumber;
|
||||
version->dwPlatformId = versionW.dwPlatformId;
|
||||
version->szCSDVersion[0] = '\0';
|
||||
wcstombsPtr wcstombs = (wcstombsPtr) getFunction("msvcrt.dll", "wcstombs");
|
||||
wcstombs(version->szCSDVersion, versionW.szCSDVersion, ARRAYSIZE(version->szCSDVersion));
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
} else {
|
||||
SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
DLL_EXPORT WINAPI DWORD GetVersion() {
|
||||
OSVERSIONINFOW versionW;
|
||||
if (GetVersionExW(&versionW)) {
|
||||
return (versionW.dwPlatformId ^ 2) << 30 |
|
||||
versionW.dwBuildNumber << 16 |
|
||||
versionW.dwMinorVersion << 8 |
|
||||
versionW.dwMajorVersion;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user