[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