[PATCH 2/3] ntdll/tests: Add more tests for SystemModuleInformation[Ex].
Zebediah Figura
z.figura12 at gmail.com
Mon Oct 26 18:40:07 CDT 2020
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/ntdll/tests/info.c | 71 ++++++++++++++++++++++++++++-------------
include/winternl.h | 9 ++++++
2 files changed, 58 insertions(+), 22 deletions(-)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index b09c57b97a7..6805cfb6a8e 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -469,37 +469,64 @@ static void test_query_procperf(void)
static void test_query_module(void)
{
+ const RTL_PROCESS_MODULE_INFORMATION_EX *infoex;
+ SYSTEM_MODULE_INFORMATION *info;
NTSTATUS status;
- ULONG ReturnLength;
- ULONG ModuleCount, i;
+ ULONG size, i;
+ char *buffer;
- ULONG SystemInformationLength = sizeof(SYSTEM_MODULE_INFORMATION);
- SYSTEM_MODULE_INFORMATION* smi = HeapAlloc(GetProcessHeap(), 0, SystemInformationLength);
- SYSTEM_MODULE* sm;
+ status = pNtQuerySystemInformation(SystemModuleInformation, NULL, 0, &size);
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "got %#x\n", status);
+ ok(size > 0, "expected nonzero size\n");
- /* Request the needed length */
- status = pNtQuerySystemInformation(SystemModuleInformation, smi, 0, &ReturnLength);
- ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
- ok( ReturnLength > 0, "Expected a ReturnLength to show the needed length\n");
+ info = malloc(size);
+ status = pNtQuerySystemInformation(SystemModuleInformation, info, size, &size);
+ ok(!status, "got %#x\n", status);
- SystemInformationLength = ReturnLength;
- smi = HeapReAlloc(GetProcessHeap(), 0, smi , SystemInformationLength);
- status = pNtQuerySystemInformation(SystemModuleInformation, smi, SystemInformationLength, &ReturnLength);
- ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status);
+ ok(info->ModulesCount > 0, "Expected some modules to be loaded\n");
- ModuleCount = smi->ModulesCount;
- sm = &smi->Modules[0];
- /* our implementation is a stub for now */
- ok( ModuleCount > 0, "Expected some modules to be loaded\n");
+ for (i = 0; i < info->ModulesCount; i++)
+ {
+ const SYSTEM_MODULE *module = &info->Modules[i];
- /* Loop through all the modules/drivers, Wine doesn't get here (yet) */
- for (i = 0; i < ModuleCount ; i++)
+ ok(module->LoadOrderIndex == i, "%u: got index %u\n", i, module->LoadOrderIndex);
+ ok(!!module->ImageBaseAddress, "%u: got NULL address\n", i);
+ ok(module->ImageSize, "%u: got 0 size\n", i);
+ ok(module->LoadCount, "%u: got 0 load count\n", i);
+ }
+
+ free(info);
+
+ status = pNtQuerySystemInformation(SystemModuleInformationEx, NULL, 0, &size);
+ if (status == STATUS_INVALID_INFO_CLASS)
{
- ok( i == sm->LoadOrderIndex, "LoadOrderIndex (%d) should have matched %u\n", sm->LoadOrderIndex, i);
- sm++;
+ todo_wine win_skip("SystemModuleInformationEx is not supported.\n");
+ return;
+ }
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "got %#x\n", status);
+ ok(size > 0, "expected nonzero size\n");
+
+ buffer = malloc(size);
+ status = pNtQuerySystemInformation(SystemModuleInformationEx, buffer, size, &size);
+ ok(!status, "got %#x\n", status);
+
+ infoex = (const void *)buffer;
+ for (i = 0; infoex->NextOffset; i++)
+ {
+ const SYSTEM_MODULE *module = &infoex->BaseInfo;
+
+ ok(module->LoadOrderIndex == i, "%u: got index %u\n", i, module->LoadOrderIndex);
+ ok(!!module->ImageBaseAddress, "%u: got NULL address\n", i);
+ ok(module->ImageSize, "%u: got 0 size\n", i);
+ ok(module->LoadCount, "%u: got 0 load count\n", i);
+
+ infoex = (const void *)((const char *)infoex + infoex->NextOffset);
}
+ ok(((char *)infoex - buffer) + sizeof(infoex->NextOffset) == size,
+ "got size %u, null terminator %u\n", size, (char *)infoex - buffer);
+
+ free(buffer);
- HeapFree( GetProcessHeap(), 0, smi);
}
static void test_query_handle(void)
diff --git a/include/winternl.h b/include/winternl.h
index 2f70f2f3f47..6756ed6c060 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -2805,6 +2805,15 @@ typedef struct _SYSTEM_MODULE_INFORMATION
#define PROCESS_CREATE_FLAGS_SUSPENDED 0x00000200
#define PROCESS_CREATE_FLAGS_EXTENDED_UNKNOWN 0x00000400
+typedef struct _RTL_PROCESS_MODULE_INFORMATION_EX
+{
+ USHORT NextOffset;
+ SYSTEM_MODULE BaseInfo;
+ ULONG ImageCheckSum;
+ ULONG TimeDateStamp;
+ void *DefaultBase;
+} RTL_PROCESS_MODULE_INFORMATION_EX;
+
#define THREAD_CREATE_FLAGS_CREATE_SUSPENDED 0x00000001
#define THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH 0x00000002
#define THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER 0x00000004
--
2.28.0
More information about the wine-devel
mailing list