[PATCH 1/2] ntdll/tests: Test NtMapViewOfSection with a DLL and zero_bits.

Brendan Shanks bshanks at codeweavers.com
Tue Apr 26 18:26:24 CDT 2022


Signed-off-by: Brendan Shanks <bshanks at codeweavers.com>
---

The zero_bits mask test always passes on 32-bit (the pointer is either
truncated, or version.dll is itself 32-bit).

 dlls/ntdll/tests/virtual.c | 41 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
index 30a97ba9d94..cd374cf2ea4 100644
--- a/dlls/ntdll/tests/virtual.c
+++ b/dlls/ntdll/tests/virtual.c
@@ -37,6 +37,8 @@ static ULONG64 (WINAPI *pRtlGetEnabledExtendedFeatures)(ULONG64);
 static NTSTATUS (WINAPI *pRtlFreeUserStack)(void *);
 static void * (WINAPI *pRtlFindExportedRoutineByName)(HMODULE,const char*);
 static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
+static BOOL (WINAPI *pWow64DisableWow64FsRedirection)(PVOID*);
+static BOOL (WINAPI *pWow64RevertWow64FsRedirection)(PVOID);
 static NTSTATUS (WINAPI *pNtAllocateVirtualMemoryEx)(HANDLE, PVOID *, SIZE_T *, ULONG, ULONG,
                                                      MEM_EXTENDED_PARAMETER *, ULONG);
 static const BOOL is_win64 = sizeof(void*) != sizeof(int);
@@ -904,6 +906,43 @@ static void test_NtMapViewOfSection(void)
     CloseHandle(file);
     DeleteFileA(testfile);
 
+    /* test zero_bits > 31 with a 64-bit DLL if possible */
+    if (is_wow64)
+        pWow64DisableWow64FsRedirection(&ptr2);
+
+    file = CreateFileA("c:\\windows\\system32\\version.dll", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
+    ok(file != INVALID_HANDLE_VALUE, "Failed to open version.dll\n");
+
+    if (is_wow64)
+        pWow64RevertWow64FsRedirection(ptr2);
+
+    mapping = CreateFileMappingA(file, NULL, PAGE_READONLY|SEC_IMAGE, 0, 0, NULL);
+    ok(mapping != 0, "CreateFileMapping failed\n");
+
+    ptr = NULL;
+    size = 0;
+    offset.QuadPart = 0;
+    zero_bits = 0x7fffffff;
+    status = NtMapViewOfSection(mapping, process, &ptr, zero_bits, 0, &offset, &size, 1, 0, PAGE_READONLY);
+
+    if (!is_win64 && !is_wow64)
+    {
+        ok(status == STATUS_INVALID_PARAMETER_4, "NtMapViewOfSection returned %08lx\n", status);
+    }
+    else
+    {
+        ok(status == STATUS_SUCCESS || status == STATUS_IMAGE_NOT_AT_BASE, "NtMapViewOfSection returned %08lx\n", status);
+        ok(!((ULONG_PTR)ptr & 0xffff), "returned memory %p is not aligned to 64k\n", ptr);
+        todo_wine
+        ok(((UINT_PTR)ptr & ~get_zero_bits_mask(zero_bits)) == 0, "NtMapViewOfSection returned address %p\n", ptr);
+
+        status = NtUnmapViewOfSection(process, ptr);
+        ok(status == STATUS_SUCCESS, "NtUnmapViewOfSection returned %08lx\n", status);
+    }
+
+    NtClose(mapping);
+    CloseHandle(file);
+
     TerminateProcess(process, 0);
     CloseHandle(process);
 }
@@ -1152,6 +1191,8 @@ START_TEST(virtual)
 
     mod = GetModuleHandleA("kernel32.dll");
     pIsWow64Process = (void *)GetProcAddress(mod, "IsWow64Process");
+    pWow64DisableWow64FsRedirection = (void *)GetProcAddress(mod, "Wow64DisableWow64FsRedirection");
+    pWow64RevertWow64FsRedirection = (void *)GetProcAddress(mod, "Wow64RevertWow64FsRedirection");
     pGetEnabledXStateFeatures = (void *)GetProcAddress(mod, "GetEnabledXStateFeatures");
     mod = GetModuleHandleA("ntdll.dll");
     pRtlCreateUserStack = (void *)GetProcAddress(mod, "RtlCreateUserStack");
-- 
2.35.1




More information about the wine-devel mailing list