Files
BCompat/config.c
2026-03-28 23:26:49 +01:00

179 lines
6.8 KiB
C

#include <windows.h>
#include <windowsx.h>
#include <prsht.h>
#define MAX_FUNCTION_COUNT 8
struct ReportedVersion {
LPCSTR name;
DWORD major;
DWORD minor;
DWORD build;
DWORD platform;
};
typedef struct ReportedVersion ReportedVersion;
struct FunctionVersion {
LPCSTR name;
LPCSTR functions[MAX_FUNCTION_COUNT];
};
typedef struct FunctionVersion FunctionVersion;
ReportedVersion reportedVersions[] = {
{ "Win32s", 1, 0, 0, VER_PLATFORM_WIN32s },
{ "Windows NT 3.1", 3, 10, 511, VER_PLATFORM_WIN32_NT },
{ "Windows NT 3.50", 3, 50, 807, VER_PLATFORM_WIN32_NT },
{ "Windows NT 3.51", 3, 51, 1057, VER_PLATFORM_WIN32_NT },
{ "Windows 95", 4, 0, 950, VER_PLATFORM_WIN32_WINDOWS },
{ "Windows NT 4.0", 4, 0, 1381, VER_PLATFORM_WIN32_NT },
{ "Windows 2000", 5, 0, 2195, VER_PLATFORM_WIN32_NT }
};
LPCSTR csdVersions[] = {
"None",
"Service Pack 1",
"Service Pack 2",
"Service Pack 3",
"Service Pack 4",
"Service Pack 5",
"Service Pack 6"
};
BOOL reportedChanged;
BOOL functionChanged ;
INT_PTR CALLBACK GlobalPageProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_INITDIALOG:
reportedChanged = FALSE;
functionChanged = FALSE;
HWND reportedBox = GetDlgItem(hWnd, 1);
for (int i = 0; i < ARRAYSIZE(reportedVersions); i++) {
ListBox_AddString(reportedBox, reportedVersions[i].name);
}
HWND functionBox = GetDlgItem(hWnd, 2);
for (int i = 0; i < ARRAYSIZE(csdVersions); i++) {
ListBox_AddString(functionBox, csdVersions[i]);
}
HKEY key;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\BCompat"), 0, KEY_READ, &key) == ERROR_SUCCESS) {
DWORD size;
DWORD major = 0;
RegQueryValueEx(key, TEXT("ReportedMajor"), NULL, NULL, (LPBYTE) &major, &size);
DWORD minor = 0;
RegQueryValueEx(key, TEXT("ReportedMinor"), NULL, NULL, (LPBYTE) &minor, &size);
DWORD build = 0;
RegQueryValueEx(key, TEXT("ReportedBuild"), NULL, NULL, (LPBYTE) &build, &size);
DWORD platform = 0;
RegQueryValueEx(key, TEXT("ReportedPlatform"), NULL, NULL, (LPBYTE) &platform, &size);
for (int i = 0; i < ARRAYSIZE(reportedVersions); i++) {
ReportedVersion version = reportedVersions[i];
if (major == version.major && minor == version.minor && build == version.build && platform == version.platform) {
ListBox_SetCurSel(reportedBox, i);
}
}
TCHAR csd[128];
size = sizeof(csd);
RegQueryValueEx(key, TEXT("ReportedServicePack"), NULL, NULL, (LPBYTE) &csd, &size);
if (strlen(csd) == 0) {
strcpy(csd, "None");
}
for (int i = 0; i < ARRAYSIZE(csdVersions); i++) {
LPCSTR version = csdVersions[i];
if (strcmp(csd, version) == 0) {
ListBox_SetCurSel(reportedBox, i);
}
}
RegCloseKey(key);
}
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case 1:
switch (HIWORD(wParam)) {
case LBN_SELCHANGE:
PropSheet_Changed(GetParent(hWnd), hWnd);
reportedChanged = TRUE;
break;
}
break;
case 2:
switch (HIWORD(wParam)) {
case LBN_SELCHANGE:
PropSheet_Changed(GetParent(hWnd), hWnd);
functionChanged = TRUE;
break;
}
break;
}
break;
case WM_NOTIFY:
switch (((NMHDR *)lParam)->code) {
case PSN_APPLY:
if (reportedChanged) {
reportedChanged = FALSE;
ReportedVersion version = reportedVersions[ListBox_GetCurSel(GetDlgItem(hWnd, 1))];
HKEY key;
RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\BCompat"), 0, NULL, 0, KEY_WRITE, NULL, &key, NULL);
RegSetValueEx(key, "ReportedMajor", 0, REG_DWORD, (LPBYTE) &version.major, sizeof(DWORD));
RegSetValueEx(key, "ReportedMinor", 0, REG_DWORD, (LPBYTE) &version.minor, sizeof(DWORD));
RegSetValueEx(key, "ReportedBuild", 0, REG_DWORD, (LPBYTE) &version.build, sizeof(DWORD));
RegSetValueEx(key, "ReportedPlatform", 0, REG_DWORD, (LPBYTE) &version.platform, sizeof(DWORD));
RegCloseKey(key);
}
if (functionChanged) {
functionChanged = FALSE;
LPCSTR version = csdVersions[ListBox_GetCurSel(GetDlgItem(hWnd, 2))];
HKEY key;
RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\BCompat"), 0, NULL, 0, KEY_WRITE, NULL, &key, NULL);
if (strcmp(version, "None") == 0) {
version = "";
}
RegSetValueEx(key, "ReportedServicePack", 0, REG_SZ, (LPBYTE) version, strlen(version) + 1);
RegCloseKey(key);
}
}
}
return FALSE;
}
int main() {
HMODULE instance = GetModuleHandle(NULL);
PROPSHEETPAGE psp[1];
PROPSHEETHEADER psh;
psp[0].dwSize = sizeof(PROPSHEETPAGE);
psp[0].dwFlags = PSP_USETITLE;
psp[0].hInstance = instance;
psp[0].pszTemplate = MAKEINTRESOURCE(1);
psp[0].pszIcon = NULL;
psp[0].pfnDlgProc = GlobalPageProc;
psp[0].pszTitle = "Global";
psp[0].lParam = 0;
psp[0].pfnCallback = NULL;
/*psp[1].dwSize = sizeof(PROPSHEETPAGE);
psp[1].dwFlags = PSP_USETITLE;
psp[1].hInstance = instance;
psp[1].pszTemplate = MAKEINTRESOURCE(2);
psp[1].pszIcon = NULL;
psp[1].pfnDlgProc = AboutPageProc;
psp[1].pszTitle = "About";
psp[1].lParam = 0;
psp[1].pfnCallback = NULL;*/
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE;
psh.hwndParent = NULL;
psh.hInstance = instance;
psh.pszIcon = NULL;
psh.pszCaption = "BCompat Settings";
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
psh.nStartPage = 0;
psh.ppsp = (LPCPROPSHEETPAGE) &psp;
psh.pfnCallback = NULL;
PropertySheet(&psh);
}