From: Akihiro Sagawa Subject: [PATCH 2/2] kernel32: Return the list of module handles even if needed argument is null. Message-Id: <20180112002706.FA18.375B48EC@gmail.com> Date: Fri, 12 Jan 2018 00:27:47 +0900 Touhou Shinpiroku relays on this behaviour. Fixes Bug 44347. Signed-off-by: Akihiro Sagawa --- dlls/kernel32/module.c | 14 ++++++++++---- dlls/psapi/tests/psapi_main.c | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c index d068f2a..b97c79b 100644 --- a/dlls/kernel32/module.c +++ b/dlls/kernel32/module.c @@ -1489,19 +1489,18 @@ BOOL WINAPI K32EnumProcessModules(HANDLE process, HMODULE *lphModule, DWORD cb, DWORD *needed) { MODULE_ITERATOR iter; + DWORD size = 0; INT ret; if (!init_module_iterator(&iter, process)) return FALSE; - if ((cb && !lphModule) || !needed) + if (cb && !lphModule) { SetLastError(ERROR_NOACCESS); return FALSE; } - *needed = 0; - while ((ret = module_iterator_next(&iter)) > 0) { if (cb >= sizeof(HMODULE)) @@ -1509,8 +1508,15 @@ BOOL WINAPI K32EnumProcessModules(HANDLE process, HMODULE *lphModule, *lphModule++ = iter.ldr_module.BaseAddress; cb -= sizeof(HMODULE); } - *needed += sizeof(HMODULE); + size += sizeof(HMODULE); + } + + if (!needed) + { + SetLastError(ERROR_NOACCESS); + return FALSE; } + *needed = size; return ret == 0; } diff --git a/dlls/psapi/tests/psapi_main.c b/dlls/psapi/tests/psapi_main.c index 30059c5..8638d73 100644 --- a/dlls/psapi/tests/psapi_main.c +++ b/dlls/psapi/tests/psapi_main.c @@ -132,7 +132,7 @@ static void test_EnumProcessModules(void) ret = pEnumProcessModules(hpQV, &hMod, sizeof(HMODULE), NULL); ok(!ret, "succeeded\n"); ok(GetLastError() == ERROR_NOACCESS, "expected error=ERROR_NOACCESS but got %d\n", GetLastError()); - todo_wine ok(hMod == GetModuleHandleA(NULL), + ok(hMod == GetModuleHandleA(NULL), "hMod=%p GetModuleHandleA(NULL)=%p\n", hMod, GetModuleHandleA(NULL)); SetLastError(0xdeadbeef);