[PATCH v3 01/10] kernel32/tests: Fix some NtMapViewOfSection tests expectations, and add results for w1064v1809

Rémi Bernon rbernon at codeweavers.com
Tue Jun 18 11:39:25 CDT 2019


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/kernel32/tests/virtual.c | 72 ++++++++++++++++++-----------------
 1 file changed, 38 insertions(+), 34 deletions(-)

diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index 0b718606d0e..e72192477c8 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -73,6 +73,30 @@ static HANDLE create_target_process(const char *arg)
     return pi.hProcess;
 }
 
+static inline UINT_PTR get_zero_bits(UINT_PTR p)
+{
+    UINT_PTR z;
+
+    if (p == 0)
+        return 32;
+#ifdef __x86_64__
+    if (p > 0xffffffff)
+        return (~(UINT_PTR)0) >> get_zero_bits(p >> 32);
+#endif
+
+#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)))
+    z = __builtin_clz((UINT32)p);
+#else
+    z = 31;
+    if (p >> 16) { z -= 16; p >>= 16; }
+    if (p >> 8) { z -= 8; p >>= 8; }
+    if (p >> 4) { z -= 4; p >>= 4; }
+    if (p >> 2) { z -= 2; p >>= 2; }
+    if (p >> 1) z -= 1;
+#endif
+    return z;
+}
+
 static void test_VirtualAllocEx(void)
 {
     const unsigned int alloc_size = 1<<15;
@@ -1260,24 +1284,12 @@ 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 );
-    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 );
-    }
-
-    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 );
+    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 1, 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 );
@@ -1288,7 +1300,8 @@ static void test_NtMapViewOfSection(void)
     ptr2 = NULL;
     size = 0;
     status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 22, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_INVALID_PARAMETER_4, "NtMapViewOfSection returned %x\n", status );
+    ok( status == STATUS_INVALID_PARAMETER_4 || status == STATUS_INVALID_PARAMETER,
+        "NtMapViewOfSection returned %x\n", status );
     if (status == STATUS_SUCCESS)
     {
         status = pNtUnmapViewOfSection( hProcess, ptr2 );
@@ -1323,30 +1336,20 @@ static void test_NtMapViewOfSection(void)
     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 */
+    /* when an address is passed, it has to satisfy the provided number of zero bits */
     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, "NtMapViewOfSection returned %x\n", status );
+    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, get_zero_bits((UINT_PTR)ptr2) + 1, 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 = 0;
-    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 16, 0, &offset, &size, 1, 0, PAGE_READWRITE );
-    ok( status == STATUS_INVALID_PARAMETER_4, "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, "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, "NtMapViewOfSection returned %x\n", status );
+    status = pNtMapViewOfSection( mapping, hProcess, &ptr2, get_zero_bits((UINT_PTR)ptr2), 0, &offset, &size, 1, 0, PAGE_READWRITE );
+    todo_wine
+    ok( status == STATUS_MAPPED_ALIGNMENT, "NtMapViewOfSection returned %x\n", status );
 
     if (sizeof(void *) == sizeof(int) && (!pIsWow64Process ||
         !pIsWow64Process( GetCurrentProcess(), &is_wow64 ) || !is_wow64))
@@ -1409,7 +1412,8 @@ static void test_NtMapViewOfSection(void)
         status = pNtMapViewOfSection( mapping, hProcess, &ptr2, 0, 0, &offset,
                                       &size, 1, AT_ROUND_TO_PAGE, PAGE_READWRITE );
         todo_wine
-        ok( status == STATUS_INVALID_PARAMETER_9, "NtMapViewOfSection returned %x\n", status );
+        ok( status == STATUS_INVALID_PARAMETER_9 || status == STATUS_INVALID_PARAMETER,
+            "NtMapViewOfSection returned %x\n", status );
     }
 
     status = pNtUnmapViewOfSection( hProcess, ptr );
-- 
2.20.1




More information about the wine-devel mailing list