[PATCH v2 2/8] ntdll/tests: Move several NtMapViewOfSection tests from kernel32/tests

Rémi Bernon rbernon at codeweavers.com
Fri Jun 14 08:11:11 CDT 2019


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/kernel32/tests/virtual.c | 159 ----------------------------
 dlls/ntdll/tests/virtual.c    | 188 ++++++++++++++++++++++++++++++++++
 2 files changed, 188 insertions(+), 159 deletions(-)

diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index 47e61566c9c..4b37dbcadc5 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -1260,165 +1260,6 @@ static void test_NtMapViewOfSection(void)
     ok( result == sizeof(buffer), "ReadProcessMemory didn't read all data (%lx)\n", result );
     ok( !memcmp( buffer, data, sizeof(buffer) ), "Wrong data read\n" );
 
-    /* for some unknown reason NtMapViewOfSection fails with STATUS_NO_MEMORY when zero_bits != 0 ? */
-    ptr2 = NULL;
-    size = 0;
-    offset.QuadPart = 0;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 12, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_SUCCESS || status == STATUS_NO_MEMORY,
-        "NtMapViewOfSection returned %x\n", status );
-    if (status == STATUS_SUCCESS)
-    {
-        status = pNtUnmapViewOfSection( hProcess, ptr2 );
-        ok( !status, "NtUnmapViewOfSection failed status %x\n", status );
-    }
-
-    ptr2 = NULL;
-    size = 0;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 16, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    todo_wine
-    ok( status == STATUS_NO_MEMORY, "NtMapViewOfSection returned %x\n", status );
-    if (status == STATUS_SUCCESS)
-    {
-        status = pNtUnmapViewOfSection( hProcess, ptr2 );
-        ok( !status, "NtUnmapViewOfSection failed status %x\n", status );
-    }
-
-    /* 22 zero bits isn't acceptable */
-    ptr2 = NULL;
-    size = 0;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 22, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER,
-        "NtMapViewOfSection returned %x\n", status );
-    if (status == STATUS_SUCCESS)
-    {
-        status = pNtUnmapViewOfSection( hProcess, ptr2 );
-        ok( !status, "NtUnmapViewOfSection failed status %x\n", status );
-    }
-
-    /* mapping at the same page conflicts */
-    ptr2 = ptr;
-    size = 0;
-    offset.QuadPart = 0;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_CONFLICTING_ADDRESSES, "NtMapViewOfSection returned %x\n", status );
-
-    /* offset has to be aligned */
-    ptr2 = ptr;
-    size = 0;
-    offset.QuadPart = 1;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_MAPPED_ALIGNMENT, "NtMapViewOfSection returned %x\n", status );
-
-    /* ptr has to be aligned */
-    ptr2 = (char *)ptr + 42;
-    size = 0;
-    offset.QuadPart = 0;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_MAPPED_ALIGNMENT, "NtMapViewOfSection returned %x\n", status );
-
-    /* still not 64k aligned */
-    ptr2 = (char *)ptr + 0x1000;
-    size = 0;
-    offset.QuadPart = 0;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_MAPPED_ALIGNMENT, "NtMapViewOfSection returned %x\n", status );
-
-    /* zero_bits != 0 is not allowed when an address is set */
-    ptr2 = (char *)ptr + 0x1000;
-    size = 0;
-    offset.QuadPart = 0;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 12, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER ||
-        broken(STATUS_MAPPED_ALIGNMENT) /* w1064v1809 inconsistently returns STATUS_MAPPED_ALIGNMENT or STATUS_INVALID_PARAMETER */,
-        "NtMapViewOfSection returned %x\n", status );
-
-    ptr2 = (char *)ptr + 0x1000;
-    size = 0;
-    offset.QuadPart = 0;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 16, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER,
-        "NtMapViewOfSection returned %x\n", status );
-
-    ptr2 = (char *)ptr + 0x1001;
-    size = 0;
-    offset.QuadPart = 0;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 16, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER,
-        "NtMapViewOfSection returned %x\n", status );
-
-    ptr2 = (char *)ptr + 0x1000;
-    size = 0;
-    offset.QuadPart = 1;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 16, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER,
-        "NtMapViewOfSection returned %x\n", status );
-
-    if (sizeof(void *) == sizeof(int) && (!pIsWow64Process ||
-        !pIsWow64Process( GetCurrentProcess(), &is_wow64 ) || !is_wow64))
-    {
-        /* new memory region conflicts with previous mapping */
-        ptr2 = ptr;
-        size = 0;
-        offset.QuadPart = 0;
-        status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset,
-                                      &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE );
-        ok( status == STATUS_CONFLICTING_ADDRESSES, "NtMapViewOfSection returned %x\n", status );
-
-        ptr2 = (char *)ptr + 42;
-        size = 0;
-        offset.QuadPart = 0;
-        status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset,
-                                      &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE );
-        ok( status == STATUS_CONFLICTING_ADDRESSES, "NtMapViewOfSection returned %x\n", status );
-
-        /* in contrary to regular NtMapViewOfSection, only 4kb align is enforced */
-        ptr2 = (char *)ptr + 0x1000;
-        size = 0;
-        offset.QuadPart = 0;
-        status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset,
-                                      &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE );
-        ok( status == STATUS_SUCCESS, "NtMapViewOfSection returned %x\n", status );
-        ok( (char *)ptr2 == (char *)ptr + 0x1000,
-            "expected address %p, got %p\n", (char *)ptr + 0x1000, ptr2 );
-        status = pNtUnmapViewOfSection( hProcess, ptr2 );
-        ok( !status, "NtUnmapViewOfSection failed status %x\n", status );
-
-        /* the address is rounded down if not on a page boundary */
-        ptr2 = (char *)ptr + 0x1001;
-        size = 0;
-        offset.QuadPart = 0;
-        status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset,
-                                      &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE );
-        ok( status == STATUS_SUCCESS, "NtMapViewOfSection returned %x\n", status );
-        ok( (char *)ptr2 == (char *)ptr + 0x1000,
-            "expected address %p, got %p\n", (char *)ptr + 0x1000, ptr2 );
-        status = pNtUnmapViewOfSection( hProcess, ptr2 );
-        ok( !status, "NtUnmapViewOfSection failed status %x\n", status );
-
-        ptr2 = (char *)ptr + 0x2000;
-        size = 0;
-        offset.QuadPart = 0;
-        status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset,
-                                      &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE );
-        ok( status == STATUS_SUCCESS, "NtMapViewOfSection returned %x\n", status );
-        ok( (char *)ptr2 == (char *)ptr + 0x2000,
-            "expected address %p, got %p\n", (char *)ptr + 0x2000, ptr2 );
-        status = pNtUnmapViewOfSection( hProcess, ptr2 );
-        ok( !status, "NtUnmapViewOfSection failed status %x\n", status );
-    }
-    else
-    {
-        ptr2 = (char *)ptr + 0x1000;
-        size = 0;
-        offset.QuadPart = 0;
-        status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset,
-                                      &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE );
-        todo_wine
-        ok( status == STATUS_INVALID_PARAMETER_9 || status == STATUS_INVALID_PARAMETER,
-            "NtMapViewOfSection returned %x\n", status );
-    }
-
     status = pNtUnmapViewOfSection( hProcess, ptr );
     ok( !status, "NtUnmapViewOfSection failed status %x\n", status );
 
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
index ff10508a604..26d058185fd 100644
--- a/dlls/ntdll/tests/virtual.c
+++ b/dlls/ntdll/tests/virtual.c
@@ -167,6 +167,193 @@ static void test_AllocateVirtualMemory(void)
     ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory failed\n");
 }
 
+static void test_MapViewOfSection(void)
+{
+    HANDLE mapping, process = NtCurrentProcess();
+    void *ptr, *ptr2;
+    BOOL is_wow64;
+    DWORD status;
+    SIZE_T size;
+    LARGE_INTEGER offset, map_size;
+
+    map_size.QuadPart = 0x1000;
+    status = NtCreateSection(&mapping, SECTION_MAP_READ | SECTION_MAP_WRITE, NULL,
+                             &map_size, PAGE_READWRITE, SEC_COMMIT, NULL);
+    ok(status == STATUS_SUCCESS, "NtCreateSection returned %08x\n", status);
+    ok(mapping != 0, "NtCreateSection failed\n");
+
+    ptr = NULL;
+    size = 0;
+    offset.QuadPart = 0;
+    status = NtMapViewOfSection(mapping, process, &ptr, 0, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_SUCCESS, "NtMapViewOfSection returned %08x\n", status);
+    ok(!((ULONG_PTR)ptr & 0xffff), "returned memory %p is not aligned to 64k\n", ptr);
+
+    /* for some unknown reason NtMapViewOfSection fails with STATUS_NO_MEMORY when zero_bits != 0 ? */
+    ptr2 = NULL;
+    size = 0;
+    offset.QuadPart = 0;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 12, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_SUCCESS || status == STATUS_NO_MEMORY,
+       "NtMapViewOfSection returned %08x\n", status);
+    if (status == STATUS_SUCCESS)
+    {
+        status = NtUnmapViewOfSection(process, ptr2);
+        ok(status == STATUS_SUCCESS, "NtUnmapViewOfSection returned %08x\n", status);
+    }
+
+    ptr2 = NULL;
+    size = 0;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 16, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    todo_wine
+    ok(status == STATUS_NO_MEMORY, "NtMapViewOfSection returned %08x\n", status);
+    if (status == STATUS_SUCCESS)
+    {
+        status = NtUnmapViewOfSection(process, ptr2);
+        ok(status == STATUS_SUCCESS, "NtUnmapViewOfSection returned %08x\n", status);
+    }
+
+    /* 22 zero bits isn't acceptable */
+    ptr2 = NULL;
+    size = 0;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 22, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER,
+       "NtMapViewOfSection returned %08x\n", status);
+
+    /* mapping at the same page conflicts */
+    ptr2 = ptr;
+    size = 0;
+    offset.QuadPart = 0;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 0, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_CONFLICTING_ADDRESSES, "NtMapViewOfSection returned %08x\n", status);
+
+    /* offset has to be aligned */
+    ptr2 = ptr;
+    size = 0;
+    offset.QuadPart = 1;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 0, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_MAPPED_ALIGNMENT, "NtMapViewOfSection returned %08x\n", status);
+
+    /* ptr has to be aligned */
+    ptr2 = (char *)ptr + 42;
+    size = 0;
+    offset.QuadPart = 0;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 0, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_MAPPED_ALIGNMENT, "NtMapViewOfSection returned %08x\n", status);
+
+    /* still not 64k aligned */
+    ptr2 = (char *)ptr + 0x1000;
+    size = 0;
+    offset.QuadPart = 0;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 0, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_MAPPED_ALIGNMENT, "NtMapViewOfSection returned %08x\n", status);
+
+    /* zero_bits != 0 is not allowed when an address is set */
+    ptr2 = (char *)ptr + 0x1000;
+    size = 0;
+    offset.QuadPart = 0;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 12, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER ||
+       broken(STATUS_MAPPED_ALIGNMENT) /* w1064v1809 inconsistently returns STATUS_MAPPED_ALIGNMENT or STATUS_INVALID_PARAMETER */,
+       "NtMapViewOfSection returned %08x\n", status);
+
+    ptr2 = (char *)ptr + 0x1000;
+    size = 0;
+    offset.QuadPart = 0;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 16, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER,
+       "NtMapViewOfSection returned %08x\n", status);
+
+    ptr2 = (char *)ptr + 0x1001;
+    size = 0;
+    offset.QuadPart = 0;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 16, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER,
+       "NtMapViewOfSection returned %08x\n", status);
+
+    ptr2 = (char *)ptr + 0x1000;
+    size = 0;
+    offset.QuadPart = 1;
+    status = NtMapViewOfSection(mapping, process, &ptr2, 16, 0, &offset, &size, 1, 0, PAGE_READWRITE);
+    ok(status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER,
+       "NtMapViewOfSection returned %08x\n", status);
+
+    if (sizeof(void *) == sizeof(int) && (!pIsWow64Process ||
+        !pIsWow64Process(NtCurrentProcess(), &is_wow64) || !is_wow64))
+    {
+        /* new memory region conflicts with previous mapping */
+        ptr2 = ptr;
+        size = 0;
+        offset.QuadPart = 0;
+        status = NtMapViewOfSection(mapping, process, &ptr2, 0, 0, &offset,
+                                    &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE);
+        ok(status == STATUS_CONFLICTING_ADDRESSES, "NtMapViewOfSection returned %08x\n", status);
+
+        ptr2 = (char *)ptr + 42;
+        size = 0;
+        offset.QuadPart = 0;
+        status = NtMapViewOfSection(mapping, process, &ptr2, 0, 0, &offset,
+                                    &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE);
+        ok(status == STATUS_CONFLICTING_ADDRESSES, "NtMapViewOfSection returned %08x\n", status);
+
+        /* in contrary to regular NtMapViewOfSection, only 4kb align is enforced */
+        ptr2 = (char *)ptr + 0x1000;
+        size = 0;
+        offset.QuadPart = 0;
+        status = NtMapViewOfSection(mapping, process, &ptr2, 0, 0, &offset,
+                                    &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE);
+        ok(status == STATUS_SUCCESS, "NtMapViewOfSection returned %08x\n", status);
+        ok((char *)ptr2 == (char *)ptr + 0x1000,
+           "expected address %p, got %p\n", (char *)ptr + 0x1000, ptr2);
+        status = NtUnmapViewOfSection(process, ptr2);
+        ok(status == STATUS_SUCCESS, "NtUnmapViewOfSection returned %08x\n", status);
+
+        /* the address is rounded down if not on a page boundary */
+        ptr2 = (char *)ptr + 0x1001;
+        size = 0;
+        offset.QuadPart = 0;
+        status = NtMapViewOfSection(mapping, process, &ptr2, 0, 0, &offset,
+                                    &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE);
+        ok(status == STATUS_SUCCESS, "NtMapViewOfSection returned %08x\n", status);
+        ok((char *)ptr2 == (char *)ptr + 0x1000,
+           "expected address %p, got %p\n", (char *)ptr + 0x1000, ptr2);
+        status = NtUnmapViewOfSection(process, ptr2);
+        ok(status == STATUS_SUCCESS, "NtUnmapViewOfSection returned %08x\n", status);
+
+        ptr2 = (char *)ptr + 0x2000;
+        size = 0;
+        offset.QuadPart = 0;
+        status = NtMapViewOfSection(mapping, process, &ptr2, 0, 0, &offset,
+                                    &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE);
+        ok(status == STATUS_SUCCESS, "NtMapViewOfSection returned %08x\n", status);
+        ok((char *)ptr2 == (char *)ptr + 0x2000,
+           "expected address %p, got %p\n", (char *)ptr + 0x2000, ptr2);
+        status = NtUnmapViewOfSection(process, ptr2);
+        ok(status == STATUS_SUCCESS, "NtUnmapViewOfSection returned %08x\n", status);
+    }
+    else
+    {
+        ptr2 = (char *)ptr + 0x1000;
+        size = 0;
+        offset.QuadPart = 0;
+        status = NtMapViewOfSection(mapping, process, &ptr2, 0, 0, &offset,
+                                    &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE);
+        todo_wine
+        ok(status == STATUS_INVALID_PARAMETER_9 || status == STATUS_INVALID_PARAMETER,
+           "NtMapViewOfSection returned %08x\n", status);
+        if (status == STATUS_SUCCESS)
+        {
+            status = NtUnmapViewOfSection(process, ptr2);
+            ok(status == STATUS_SUCCESS, "NtUnmapViewOfSection returned %08x\n", status);
+        }
+    }
+
+    status = NtUnmapViewOfSection(process, ptr);
+    ok(status == STATUS_SUCCESS, "NtUnmapViewOfSection returned %08x\n", status);
+
+    NtClose(mapping);
+}
+
 START_TEST(virtual)
 {
     SYSTEM_BASIC_INFORMATION sbi;
@@ -179,4 +366,5 @@ START_TEST(virtual)
     trace("system page size %#x\n", sbi.PageSize);
 
     test_AllocateVirtualMemory();
+    test_MapViewOfSection();
 }
-- 
2.20.1




More information about the wine-devel mailing list