From: Michael Müller michael@fds-team.de
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45961 Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- https://github.com/wine-staging/wine-staging/blob/master/patches/kernel32-Pr... --- dlls/kernel32/cpu.c | 17 +++++++++++++++++ dlls/kernel32/kernel32.spec | 2 +- dlls/kernel32/tests/process.c | 23 +++++++++++++++++++++++ include/winnt.h | 2 ++ 4 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c index 1e99951993..452f3789c0 100644 --- a/dlls/kernel32/cpu.c +++ b/dlls/kernel32/cpu.c @@ -328,6 +328,23 @@ DWORD WINAPI GetActiveProcessorCount(WORD group) return cpus; }
+/*********************************************************************** + * GetMaximumProcessorCount (KERNEL32.@) + */ +DWORD WINAPI GetMaximumProcessorCount(WORD group) +{ + TRACE("(%u)\n", group); + + if (group && group != ALL_PROCESSOR_GROUPS) + { + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + /* Wine only counts active processors so far */ + return system_info.NumberOfProcessors; +} + /*********************************************************************** * GetEnabledXStateFeatures (KERNEL32.@) */ diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 74af2a4570..c370a068c2 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -718,7 +718,7 @@ # @ stub GetLongPathNameTransactedW @ stdcall GetLongPathNameW (wstr long long) @ stdcall GetMailslotInfo(long ptr ptr ptr ptr) -# @ stub GetMaximumProcessorCount +@ stdcall GetMaximumProcessorCount(long) # @ stub GetMaximumProcessorGroupCount @ stdcall GetModuleFileNameA(long ptr long) @ stdcall GetModuleFileNameW(long ptr long) diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 9f99720f32..850495bff7 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -91,6 +91,7 @@ static SIZE_T (WINAPI *pGetLargePageMinimum)(void); static BOOL (WINAPI *pInitializeProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*, DWORD, DWORD, SIZE_T*); static BOOL (WINAPI *pUpdateProcThreadAttribute)(struct _PROC_THREAD_ATTRIBUTE_LIST*, DWORD, DWORD_PTR, void *,SIZE_T,void*,SIZE_T*); static void (WINAPI *pDeleteProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*); +static DWORD (WINAPI *pGetActiveProcessorCount)(WORD);
/* ############################### */ static char base[MAX_PATH]; @@ -258,6 +259,7 @@ static BOOL init(void) pInitializeProcThreadAttributeList = (void *)GetProcAddress(hkernel32, "InitializeProcThreadAttributeList"); pUpdateProcThreadAttribute = (void *)GetProcAddress(hkernel32, "UpdateProcThreadAttribute"); pDeleteProcThreadAttributeList = (void *)GetProcAddress(hkernel32, "DeleteProcThreadAttributeList"); + pGetActiveProcessorCount = (void *)GetProcAddress(hkernel32, "GetActiveProcessorCount");
return TRUE; } @@ -3655,6 +3657,26 @@ static void test_GetLogicalProcessorInformationEx(void) HeapFree(GetProcessHeap(), 0, info); }
+static void test_GetActiveProcessorCount(void) +{ + DWORD count; + + if (!pGetActiveProcessorCount) + { + win_skip("GetActiveProcessorCount not available, skipping test\n"); + return; + } + + count = pGetActiveProcessorCount(0); + ok(count, "GetActiveProcessorCount failed, error %u\n", GetLastError()); + + /* Test would fail on systems with more than 6400 processors */ + SetLastError(0xdeadbeef); + count = pGetActiveProcessorCount(101); + ok(count == 0, "Expeced GetActiveProcessorCount to fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); +} + static void test_largepages(void) { SIZE_T size; @@ -3868,6 +3890,7 @@ START_TEST(process) test_GetNumaProcessorNode(); test_session_info(); test_GetLogicalProcessorInformationEx(); + test_GetActiveProcessorCount(); test_largepages(); test_ProcThreadAttributeList(); test_SuspendProcessState(); diff --git a/include/winnt.h b/include/winnt.h index b8a630e6d3..d801de9df9 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -6089,6 +6089,8 @@ typedef struct _GROUP_AFFINITY WORD Reserved[3]; } GROUP_AFFINITY, *PGROUP_AFFINITY;
+#define ALL_PROCESSOR_GROUPS 0xffff + typedef struct _PROCESSOR_NUMBER { WORD Group;
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=44213
Your paranoid android.
=== debian9 (32 bit Wine report) ===
kernel32: process.c:3676: Test failed: Expeced GetActiveProcessorCount to fail process.c:3677: Test failed: Expected ERROR_INVALID_PARAMETER, got 3735928559
=== debian9 (32 bit WoW Wine report) ===
kernel32: process.c:3676: Test failed: Expeced GetActiveProcessorCount to fail process.c:3677: Test failed: Expected ERROR_INVALID_PARAMETER, got 3735928559
=== debian9 (64 bit Wow Wine report) ===
kernel32: process.c:3676: Test failed: Expeced GetActiveProcessorCount to fail process.c:3677: Test failed: Expected ERROR_INVALID_PARAMETER, got 3735928559