diff --git a/dll/appcompat/shims/layer/CMakeLists.txt b/dll/appcompat/shims/layer/CMakeLists.txt index 74c7fb0c7b9..a0b9f96c214 100644 --- a/dll/appcompat/shims/layer/CMakeLists.txt +++ b/dll/appcompat/shims/layer/CMakeLists.txt @@ -6,6 +6,7 @@ spec2def(aclayers.dll layer.spec) list(APPEND SOURCE dispmode.c forcedxsetupsuccess.c + globalmemorystatus.c ignoreloadlibrary.c versionlie.c vmhorizon.c diff --git a/dll/appcompat/shims/layer/globalmemorystatus.c b/dll/appcompat/shims/layer/globalmemorystatus.c new file mode 100644 index 00000000000..0d64787cfeb --- /dev/null +++ b/dll/appcompat/shims/layer/globalmemorystatus.c @@ -0,0 +1,39 @@ +/* + * PROJECT: ReactOS 'Layers' Shim library + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: GlobalMemoryStatus2GB shim + * COPYRIGHT: Copyright 2026 Mark Jansen + */ + +#define WIN32_NO_STATUS +#include +#include +#include + +typedef VOID(NTAPI *GLOBALMEMORYSTATUSPROC)(LPMEMORYSTATUS lpBuffer); + +#define SHIM_NS GlobalMemoryStatus2GB +#include + +VOID NTAPI +SHIM_OBJ_NAME(APIHook_GlobalMemoryStatus)(LPMEMORYSTATUS lpBuffer) +{ + CALL_SHIM(0, GLOBALMEMORYSTATUSPROC)(lpBuffer); + + if (lpBuffer->dwTotalPhys > 0x3FFFFFFF) + lpBuffer->dwTotalPhys = 0x3FFFFFFF; + + if (lpBuffer->dwAvailPhys > 0x3FFFFFFF) + lpBuffer->dwAvailPhys = 0x3FFFFFFF; + + if (lpBuffer->dwTotalPageFile > 0x7FFFFFFF) + lpBuffer->dwTotalPageFile = 0x7FFFFFFF; + + if (lpBuffer->dwAvailPageFile > 0x3FFFFFFF) + lpBuffer->dwAvailPageFile = 0x3FFFFFFF; +} + +#define SHIM_NUM_HOOKS 1 +#define SHIM_SETUP_HOOKS SHIM_HOOK(0, "KERNEL32.DLL", "GlobalMemoryStatus", SHIM_OBJ_NAME(APIHook_GlobalMemoryStatus)) + +#include diff --git a/media/sdb/sysmain.xml b/media/sdb/sysmain.xml index 5fe0ffd8833..48dba9d1d88 100644 --- a/media/sdb/sysmain.xml +++ b/media/sdb/sysmain.xml @@ -238,6 +238,9 @@ + + aclayers.dll + acgenral.dll @@ -325,99 +328,119 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/modules/rostests/apitests/appshim/CMakeLists.txt b/modules/rostests/apitests/appshim/CMakeLists.txt index 61bb31069d5..b4c8964b83e 100644 --- a/modules/rostests/apitests/appshim/CMakeLists.txt +++ b/modules/rostests/apitests/appshim/CMakeLists.txt @@ -4,6 +4,7 @@ list(APPEND SOURCE dispmode.c forcedxsetup.c genral_hooks.c + globmemstatus.c ignorefreelib.c ignoreloadlib.c layer_hooks.c diff --git a/modules/rostests/apitests/appshim/globmemstatus.c b/modules/rostests/apitests/appshim/globmemstatus.c new file mode 100644 index 00000000000..bced7b5dbed --- /dev/null +++ b/modules/rostests/apitests/appshim/globmemstatus.c @@ -0,0 +1,93 @@ +/* + * PROJECT: appshim_apitest + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Tests for GlobalMemoryStatus2GB shim + * COPYRIGHT: Copyright 2026 Mark Jansen + */ + +#include +#define WIN32_NO_STATUS +#include +#include "wine/test.h" + +#include "appshim_apitest.h" + +static HMODULE g_hShimDll; +static tGETHOOKAPIS pGetHookAPIs; + +typedef VOID(NTAPI *GLOBALMEMORYSTATUSPROC)(LPMEMORYSTATUS lpBuffer); + + +VOID NTAPI +my_GlobalMemoryStatus_Low(LPMEMORYSTATUS lpBuffer) +{ + memset(lpBuffer, 0, sizeof(MEMORYSTATUS)); +} + +VOID NTAPI +my_GlobalMemoryStatus_High(LPMEMORYSTATUS lpBuffer) +{ + memset(lpBuffer, 0xff, sizeof(MEMORYSTATUS)); +} + +static void +test_GlobalMemoryStatus(PHOOKAPI hook) +{ + GLOBALMEMORYSTATUSPROC proc; + + ok_str(hook->LibraryName, "KERNEL32.DLL"); + hook->OriginalFunction = my_GlobalMemoryStatus_Low; + proc = hook->ReplacementFunction; + + + MEMORYSTATUS ms; + memset(&ms, 0x33, sizeof(ms)); + proc(&ms); + + ok_hex(ms.dwLength, 0); + ok_hex(ms.dwMemoryLoad, 0); + ok_hex(ms.dwTotalPhys, 0); + ok_hex(ms.dwAvailPhys, 0); + ok_hex(ms.dwTotalPageFile, 0); + ok_hex(ms.dwAvailPageFile, 0); + ok_hex(ms.dwTotalVirtual, 0); + ok_hex(ms.dwAvailVirtual, 0); + + + hook->OriginalFunction = my_GlobalMemoryStatus_High; + + memset(&ms, 0x33, sizeof(ms)); + proc(&ms); + ok_hex(ms.dwLength, 0xffffffff); // not touched + ok_hex(ms.dwMemoryLoad, 0xffffffff); // not touched + ok_hex(ms.dwTotalPhys, 0x3fffffff); + ok_hex(ms.dwAvailPhys, 0x3fffffff); + ok_hex(ms.dwTotalPageFile, 0x7fffffff); + ok_hex(ms.dwAvailPageFile, 0x3fffffff); + ok_hex(ms.dwTotalVirtual, 0xffffffff); // not touched + ok_hex(ms.dwAvailVirtual, 0xffffffff); // not touched +} + + +START_TEST(globalmemorystatus) +{ + DWORD num_shims = 0, n; + PHOOKAPI hook; + + if (!LoadShimDLL(L"aclayers.dll", &g_hShimDll, &pGetHookAPIs)) + return; + + hook = pGetHookAPIs("", L"GlobalMemoryStatus2GB", &num_shims); + + ok(hook != NULL, "Expected hook to be a valid pointer\n"); + ok(num_shims == 1, "Expected num_shims to be 1, was: %u\n", num_shims); + + if (!hook || !num_shims) + return; + + for (n = 0; n < num_shims; ++n) + { + if (!_stricmp(hook[n].FunctionName, "GlobalMemoryStatus")) + test_GlobalMemoryStatus(hook + n); + } +} diff --git a/modules/rostests/apitests/appshim/testlist.c b/modules/rostests/apitests/appshim/testlist.c index 672ecb7b329..780cb369662 100644 --- a/modules/rostests/apitests/appshim/testlist.c +++ b/modules/rostests/apitests/appshim/testlist.c @@ -6,6 +6,7 @@ extern void func_dispmode(void); extern void func_forcedxsetup(void); extern void func_genral_hooks(void); +extern void func_globalmemorystatus(void); extern void func_ignorefreelib(void); extern void func_ignoreloadlib(void); extern void func_layer_hooks(void); @@ -16,6 +17,7 @@ const struct test winetest_testlist[] = { "dispmode", func_dispmode }, { "forcedxsetup", func_forcedxsetup }, { "genral_hooks", func_genral_hooks }, + { "globalmemorystatus", func_globalmemorystatus }, { "ignorefreelib", func_ignorefreelib }, { "ignoreloadlib", func_ignoreloadlib }, { "layer_hooks", func_layer_hooks },