Alexandre Julliard : ntdll/tests: Add some tests for NtQueryVirtualMemory(MemorySectionName).

Alexandre Julliard julliard at winehq.org
Wed Feb 10 15:34:02 CST 2021


Module: wine
Branch: master
Commit: 27b9a2c62140a45020e79254841c56e691a5874e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=27b9a2c62140a45020e79254841c56e691a5874e

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Feb 10 11:30:34 2021 +0100

ntdll/tests: Add some tests for NtQueryVirtualMemory(MemorySectionName).

Partly based on a patch by Dmitry Timoshkov.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/tests/info.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 79 insertions(+), 1 deletion(-)

diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 405b628d712..c848248fae3 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -2196,7 +2196,7 @@ static void test_threadstack(void)
 static void test_queryvirtualmemory(void)
 {
     NTSTATUS status;
-    SIZE_T readcount;
+    SIZE_T readcount, prev;
     static const char teststring[] = "test string";
     static char datatestbuf[42] = "abc";
     static char rwtestbuf[42];
@@ -2204,6 +2204,8 @@ static void test_queryvirtualmemory(void)
     char stackbuf[42];
     HMODULE module;
     void *user_shared_data = (void *)0x7ffe0000;
+    char buffer[1024];
+    MEMORY_SECTION_NAME *name = (MEMORY_SECTION_NAME *)buffer;
 
     module = GetModuleHandleA( "ntdll.dll" );
     status = pNtQueryVirtualMemory(NtCurrentProcess(), module, MemoryBasicInformation, &mbi, sizeof(MEMORY_BASIC_INFORMATION), &readcount);
@@ -2286,6 +2288,82 @@ static void test_queryvirtualmemory(void)
     /* check error code when len is less than MEMORY_BASIC_INFORMATION size */
     status = pNtQueryVirtualMemory(NtCurrentProcess(), GetProcessHeap(), MemoryBasicInformation, &mbi, sizeof(MEMORY_BASIC_INFORMATION) - 1, &readcount);
     ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
+
+    module = GetModuleHandleA( "ntdll.dll" );
+    memset(buffer, 0xcc, sizeof(buffer));
+    readcount = 0xdeadbeef;
+    status = pNtQueryVirtualMemory(NtCurrentProcess(), module, MemorySectionName,
+                                   name, sizeof(*name) + 16, &readcount);
+    ok(status == STATUS_BUFFER_OVERFLOW, "got %08x\n", status);
+    ok(name->SectionFileName.Length == 0xcccc || broken(!name->SectionFileName.Length),  /* vista64 */
+       "Wrong len %u\n", name->SectionFileName.Length);
+    ok(readcount > sizeof(*name), "Wrong count %lu\n", readcount);
+
+    memset(buffer, 0xcc, sizeof(buffer));
+    readcount = 0xdeadbeef;
+    status = pNtQueryVirtualMemory(NtCurrentProcess(), (char *)module + 1234, MemorySectionName,
+                                   name, sizeof(buffer), &readcount);
+    ok(status == STATUS_SUCCESS, "got %08x\n", status);
+    ok(name->SectionFileName.Buffer == (WCHAR *)(name + 1), "Wrong ptr %p/%p\n",
+       name->SectionFileName.Buffer, name + 1 );
+    ok(name->SectionFileName.Length != 0xcccc, "Wrong len %u\n", name->SectionFileName.Length);
+    ok(name->SectionFileName.MaximumLength == name->SectionFileName.Length + sizeof(WCHAR),
+       "Wrong maxlen %u/%u\n", name->SectionFileName.MaximumLength, name->SectionFileName.Length);
+    ok(readcount == sizeof(name->SectionFileName) + name->SectionFileName.MaximumLength,
+       "Wrong count %lu/%u\n", readcount, name->SectionFileName.MaximumLength);
+    ok( !name->SectionFileName.Buffer[name->SectionFileName.Length / sizeof(WCHAR)],
+        "buffer not null-terminated\n" );
+
+    memset(buffer, 0xcc, sizeof(buffer));
+    status = pNtQueryVirtualMemory(NtCurrentProcess(), (char *)module + 1234, MemorySectionName,
+                                   name, sizeof(buffer), NULL);
+    ok(status == STATUS_SUCCESS, "got %08x\n", status);
+
+    status = pNtQueryVirtualMemory(NtCurrentProcess(), (char *)module + 1234, MemorySectionName,
+                                   NULL, sizeof(buffer), NULL);
+    ok(status == STATUS_ACCESS_VIOLATION, "got %08x\n", status);
+
+    memset(buffer, 0xcc, sizeof(buffer));
+    prev = readcount;
+    readcount = 0xdeadbeef;
+    status = pNtQueryVirtualMemory(NtCurrentProcess(), (char *)module + 321, MemorySectionName,
+                                   name, sizeof(*name) - 1, &readcount);
+    ok(status == STATUS_INFO_LENGTH_MISMATCH, "got %08x\n", status);
+    ok(name->SectionFileName.Length == 0xcccc, "Wrong len %u\n", name->SectionFileName.Length);
+    ok(readcount == prev, "Wrong count %lu\n", readcount);
+
+    memset(buffer, 0xcc, sizeof(buffer));
+    readcount = 0xdeadbeef;
+    status = pNtQueryVirtualMemory((HANDLE)0xdead, (char *)module + 1234, MemorySectionName,
+                                   name, sizeof(buffer), &readcount);
+    ok(status == STATUS_INVALID_HANDLE, "got %08x\n", status);
+    ok(readcount == 0xdeadbeef || broken(readcount == 1024 + sizeof(*name)), /* wow64 */
+       "Wrong count %lu\n", readcount);
+
+    memset(buffer, 0xcc, sizeof(buffer));
+    readcount = 0xdeadbeef;
+    status = pNtQueryVirtualMemory(NtCurrentProcess(), buffer, MemorySectionName,
+                                   name, sizeof(buffer), &readcount);
+    ok(status == STATUS_INVALID_ADDRESS, "got %08x\n", status);
+    ok(name->SectionFileName.Length == 0xcccc, "Wrong len %u\n", name->SectionFileName.Length);
+    ok(readcount == 0xdeadbeef || broken(readcount == 1024 + sizeof(*name)), /* wow64 */
+       "Wrong count %lu\n", readcount);
+
+    readcount = 0xdeadbeef;
+    status = pNtQueryVirtualMemory(NtCurrentProcess(), (void *)0x1234, MemorySectionName,
+                                   name, sizeof(buffer), &readcount);
+    ok(status == STATUS_INVALID_ADDRESS, "got %08x\n", status);
+    ok(name->SectionFileName.Length == 0xcccc, "Wrong len %u\n", name->SectionFileName.Length);
+    ok(readcount == 0xdeadbeef || broken(readcount == 1024 + sizeof(*name)), /* wow64 */
+       "Wrong count %lu\n", readcount);
+
+    readcount = 0xdeadbeef;
+    status = pNtQueryVirtualMemory(NtCurrentProcess(), (void *)0x1234, MemorySectionName,
+                                   name, sizeof(*name) - 1, &readcount);
+    ok(status == STATUS_INVALID_ADDRESS, "got %08x\n", status);
+    ok(name->SectionFileName.Length == 0xcccc, "Wrong len %u\n", name->SectionFileName.Length);
+    ok(readcount == 0xdeadbeef || broken(readcount == 15), /* wow64 */
+       "Wrong count %lu\n", readcount);
 }
 
 static void test_affinity(void)




More information about the wine-cvs mailing list