Nikolay Sivov : ntdll/tests: Some tests for NtQuerySystemInformationEx().

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jan 5 12:18:33 CST 2016


Module: wine
Branch: master
Commit: c9c138f53fb1b673602502fb9bde861bb092e120
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c9c138f53fb1b673602502fb9bde861bb092e120

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Jan  4 01:56:46 2016 +0300

ntdll/tests: Some tests for NtQuerySystemInformationEx().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/process.c | 36 ++++++++++++++++++++++++++++-
 dlls/ntdll/tests/info.c       | 53 ++++++++++++++++++++++++++++++++++++++++++-
 include/winternl.h            |  1 +
 3 files changed, 88 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index b88db45..e50efed 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -87,7 +87,7 @@ static BOOL   (WINAPI *pProcess32First)(HANDLE, PROCESSENTRY32*);
 static BOOL   (WINAPI *pProcess32Next)(HANDLE, PROCESSENTRY32*);
 static BOOL   (WINAPI *pThread32First)(HANDLE, THREADENTRY32*);
 static BOOL   (WINAPI *pThread32Next)(HANDLE, THREADENTRY32*);
-
+static BOOL   (WINAPI *pGetLogicalProcessorInformationEx)(LOGICAL_PROCESSOR_RELATIONSHIP,SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*,DWORD*);
 
 /* ############################### */
 static char     base[MAX_PATH];
@@ -251,6 +251,7 @@ static BOOL init(void)
     pProcess32Next = (void *)GetProcAddress(hkernel32, "Process32Next");
     pThread32First = (void *)GetProcAddress(hkernel32, "Thread32First");
     pThread32Next = (void *)GetProcAddress(hkernel32, "Thread32Next");
+    pGetLogicalProcessorInformationEx = (void *)GetProcAddress(hkernel32, "GetLogicalProcessorInformationEx");
 
     return TRUE;
 }
@@ -3107,6 +3108,37 @@ todo_wine
     CloseHandle(hproc);
 }
 
+static void test_GetLogicalProcessorInformationEx(void)
+{
+    SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *info;
+    DWORD len;
+    BOOL ret;
+
+    if (!pGetLogicalProcessorInformationEx)
+    {
+        win_skip("GetLogicalProcessorInformationEx() is not supported\n");
+        return;
+    }
+
+    ret = pGetLogicalProcessorInformationEx(RelationAll, NULL, NULL);
+    ok(!ret, "got %d, error %d\n", ret, GetLastError());
+
+    len = 0;
+    ret = pGetLogicalProcessorInformationEx(RelationAll, NULL, &len);
+todo_wine {
+    ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %d, error %d\n", ret, GetLastError());
+    ok(len > 0, "got %u\n", len);
+}
+
+if (len) {
+    info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
+    ret = pGetLogicalProcessorInformationEx(RelationAll, info, &len);
+    ok(ret, "got %d, error %d\n", ret, GetLastError());
+    ok(info->Size > 0, "got %u\n", info->Size);
+    HeapFree(GetProcessHeap(), 0, info);
+}
+}
+
 START_TEST(process)
 {
     HANDLE job;
@@ -3153,6 +3185,7 @@ START_TEST(process)
         ok(0, "Unexpected command %s\n", myARGV[2]);
         return;
     }
+
     test_process_info();
     test_TerminateProcess();
     test_Startup();
@@ -3177,6 +3210,7 @@ START_TEST(process)
     test_StartupNoConsole();
     test_GetNumaProcessorNode();
     test_session_info();
+    test_GetLogicalProcessorInformationEx();
 
     /* things that can be tested:
      *  lookup:         check the way program to be executed is searched
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index da509aa..199fb2d 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -23,6 +23,7 @@
 #include <stdio.h>
 
 static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
+static NTSTATUS (WINAPI * pNtQuerySystemInformationEx)(SYSTEM_INFORMATION_CLASS, void*, ULONG, void*, ULONG, ULONG*);
 static NTSTATUS (WINAPI * pNtPowerInformation)(POWER_INFORMATION_LEVEL, PVOID, ULONG, PVOID, ULONG);
 static NTSTATUS (WINAPI * pNtQueryInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);
 static NTSTATUS (WINAPI * pNtQueryInformationThread)(HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG);
@@ -36,6 +37,7 @@ static NTSTATUS (WINAPI * pNtUnmapViewOfSection)(HANDLE,PVOID);
 static NTSTATUS (WINAPI * pNtClose)(HANDLE);
 static ULONG    (WINAPI * pNtGetCurrentProcessorNumber)(void);
 static BOOL     (WINAPI * pIsWow64Process)(HANDLE, PBOOL);
+static BOOL     (WINAPI * pGetLogicalProcessorInformationEx)(LOGICAL_PROCESSOR_RELATIONSHIP,SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*,DWORD*);
 
 static BOOL is_wow64;
 
@@ -56,6 +58,8 @@ static BOOL InitFunctionPtrs(void)
 {
     /* All needed functions are NT based, so using GetModuleHandle is a good check */
     HMODULE hntdll = GetModuleHandleA("ntdll");
+    HMODULE hkernel32 = GetModuleHandleA("kernel32");
+
     if (!hntdll)
     {
         win_skip("Not running on NT\n");
@@ -78,8 +82,16 @@ static BOOL InitFunctionPtrs(void)
     /* not present before XP */
     pNtGetCurrentProcessorNumber = (void *) GetProcAddress(hntdll, "NtGetCurrentProcessorNumber");
 
-    pIsWow64Process = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsWow64Process");
+    pIsWow64Process = (void *)GetProcAddress(hkernel32, "IsWow64Process");
     if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE;
+
+    /* starting with Win7 */
+    pNtQuerySystemInformationEx = (void *) GetProcAddress(hntdll, "NtQuerySystemInformationEx");
+    if (!pNtQuerySystemInformationEx)
+        skip("NtQuerySystemInformationEx() is not supported, some tests will be skipped.\n");
+
+    pGetLogicalProcessorInformationEx = (void *) GetProcAddress(hkernel32, "GetLogicalProcessorInformationEx");
+
     return TRUE;
 }
 
@@ -696,6 +708,44 @@ static void test_query_logicalproc(void)
     HeapFree(GetProcessHeap(), 0, slpi);
 }
 
+static void test_query_logicalprocex(void)
+{
+    SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *infoex, *infoex2;
+    DWORD relationship, len2, len;
+    NTSTATUS status;
+    BOOL ret;
+
+    if (!pNtQuerySystemInformationEx)
+        return;
+
+    len = 0;
+    relationship = RelationAll;
+    status = pNtQuerySystemInformationEx(SystemLogicalProcessorInformationEx, &relationship, sizeof(relationship), NULL, 0, &len);
+    ok(status == STATUS_INFO_LENGTH_MISMATCH, "got 0x%08x\n", status);
+    ok(len > 0, "got %u\n", len);
+
+    len2 = 0;
+    ret = pGetLogicalProcessorInformationEx(RelationAll, NULL, &len2);
+    ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %d, error %d\n", ret, GetLastError());
+    ok(len == len2, "got %u, expected %u\n", len2, len);
+
+    if (len == len2) {
+        infoex = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
+        infoex2 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
+
+        status = pNtQuerySystemInformationEx(SystemLogicalProcessorInformationEx, &relationship, sizeof(relationship), infoex, len, &len);
+        ok(status == STATUS_SUCCESS, "got 0x%08x\n", status);
+        ok(infoex->Size > 0, "got %u\n", infoex->Size);
+
+        ret = pGetLogicalProcessorInformationEx(RelationAll, infoex2, &len2);
+        ok(ret, "got %d, error %d\n", ret, GetLastError());
+        ok(!memcmp(infoex, infoex2, len), "returned info data mismatch\n");
+
+        HeapFree(GetProcessHeap(), 0, infoex);
+        HeapFree(GetProcessHeap(), 0, infoex2);
+    }
+}
+
 static void test_query_processor_power_info(void)
 {
     NTSTATUS status;
@@ -1934,6 +1984,7 @@ START_TEST(info)
     /* 0x49 SystemLogicalProcessorInformation */
     trace("Starting test_query_logicalproc()\n");
     test_query_logicalproc();
+    test_query_logicalprocex();
 
     /* NtPowerInformation */
 
diff --git a/include/winternl.h b/include/winternl.h
index ecd5791..788e15a 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -842,6 +842,7 @@ typedef enum _SYSTEM_INFORMATION_CLASS {
     Unknown71,
     Unknown72,
     SystemLogicalProcessorInformation = 73,
+    SystemLogicalProcessorInformationEx = 107,
     SystemInformationClassMax
 } SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS;
 




More information about the wine-cvs mailing list