[PATCH 3/6] ntdll: Add tests for NtSetInformationVirtualMemory.
Jinoh Kang
jinoh.kang.kr at gmail.com
Thu Nov 25 12:25:39 CST 2021
Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
---
dlls/ntdll/tests/virtual.c | 117 +++++++++++++++++++++++++++++++++++++
1 file changed, 117 insertions(+)
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
index adc9b1ae6dc..93be6a1006b 100644
--- a/dlls/ntdll/tests/virtual.c
+++ b/dlls/ntdll/tests/virtual.c
@@ -39,6 +39,9 @@ static void * (WINAPI *pRtlFindExportedRoutineByName)(HMODULE,const char*);
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
static NTSTATUS (WINAPI *pNtAllocateVirtualMemoryEx)(HANDLE, PVOID *, SIZE_T *, ULONG, ULONG,
MEM_EXTENDED_PARAMETER *, ULONG);
+static NTSTATUS (WINAPI *pNtSetInformationVirtualMemory)(HANDLE, VIRTUAL_MEMORY_INFORMATION_CLASS,
+ ULONG_PTR, PMEMORY_RANGE_ENTRY,
+ PVOID, ULONG);
static const BOOL is_win64 = sizeof(void*) != sizeof(int);
static BOOL is_wow64;
@@ -1132,6 +1135,118 @@ static void test_syscalls(void)
UnmapViewOfFile( ptr );
}
+static void test_prefetch(void)
+{
+ NTSTATUS status;
+ MEMORY_RANGE_ENTRY entries[2] = {{ 0 }};
+ ULONG reservedarg = 0;
+ char stackmem[] = "Test stack mem";
+ static char testmem[] = "Test memory range data";
+
+ if (!pNtSetInformationVirtualMemory)
+ {
+ skip("no NtSetInformationVirtualMemory in ntdll");
+ return;
+ }
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), -1UL, 0, NULL, NULL, 0);
+ ok( status == STATUS_INVALID_PARAMETER_2,
+ "NtSetInformationVirtualMemory unexpected status on invalid info class (1): %08x\n", status);
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), -1UL, 1, NULL, NULL, 32);
+ ok( status == STATUS_INVALID_PARAMETER_2,
+ "NtSetInformationVirtualMemory unexpected status on invalid info class (2): %08x\n", status);
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 1, entries, NULL, 0 );
+ ok( status == STATUS_INVALID_PARAMETER_5,
+ "NtSetInformationVirtualMemory unexpected status on NULL info data (1): %08x\n", status);
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 1, NULL, NULL, 0 );
+ ok( status == STATUS_INVALID_PARAMETER_5,
+ "NtSetInformationVirtualMemory unexpected status on NULL info data (2): %08x\n", status);
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 0, NULL, NULL, 0 );
+ ok( status == STATUS_INVALID_PARAMETER_5,
+ "NtSetInformationVirtualMemory unexpected status on NULL info data (3): %08x\n", status);
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 1, entries, &reservedarg, sizeof(reservedarg) * 2 );
+ ok( status == STATUS_INVALID_PARAMETER_6,
+ "NtSetInformationVirtualMemory unexpected status on extended info data (1): %08x\n", status);
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 0, NULL, &reservedarg, sizeof(reservedarg) * 2 );
+ ok( status == STATUS_INVALID_PARAMETER_6,
+ "NtSetInformationVirtualMemory unexpected status on extended info data (2): %08x\n", status);
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 1, entries, &reservedarg, sizeof(reservedarg) / 2 );
+ ok( status == STATUS_INVALID_PARAMETER_6,
+ "NtSetInformationVirtualMemory unexpected status on shrunk info data (1): %08x\n", status);
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 0, NULL, &reservedarg, sizeof(reservedarg) / 2 );
+ ok( status == STATUS_INVALID_PARAMETER_6,
+ "NtSetInformationVirtualMemory unexpected status on shrunk info data (2): %08x\n", status);
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 0, NULL, &reservedarg, sizeof(reservedarg) );
+ ok( status == STATUS_INVALID_PARAMETER_3,
+ "NtSetInformationVirtualMemory unexpected status on 0 entries: %08x\n", status);
+
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 1, NULL, &reservedarg, sizeof(reservedarg) );
+ ok( status == STATUS_ACCESS_VIOLATION,
+ "NtSetInformationVirtualMemory unexpected status on NULL entries: %08x\n", status);
+
+ entries[0].VirtualAddress = NULL;
+ entries[0].NumberOfBytes = 0;
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 1, entries, &reservedarg, sizeof(reservedarg) );
+ ok( status == STATUS_INVALID_PARAMETER_4,
+ "NtSetInformationVirtualMemory unexpected status on 1 empty entry: %08x\n", status);
+
+ entries[0].VirtualAddress = NULL;
+ entries[0].NumberOfBytes = page_size;
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 1, entries, &reservedarg, sizeof(reservedarg) );
+ ok( status == STATUS_SUCCESS,
+ "NtSetInformationVirtualMemory unexpected status on 1 NULL address entry: %08x\n", status);
+
+ entries[0].VirtualAddress = (PVOID)((ULONG_PTR)testmem & -(ULONG_PTR)page_size);
+ entries[0].NumberOfBytes = page_size;
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 1, entries, &reservedarg, sizeof(reservedarg) );
+ ok( status == STATUS_SUCCESS,
+ "NtSetInformationVirtualMemory unexpected status on 1 page-aligned entry: %08x\n", status);
+
+ entries[0].VirtualAddress = testmem;
+ entries[0].NumberOfBytes = sizeof(testmem);
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 1, entries, &reservedarg, sizeof(reservedarg) );
+ ok( status == STATUS_SUCCESS,
+ "NtSetInformationVirtualMemory unexpected status on 1 entry: %08x\n", status);
+
+ entries[0].VirtualAddress = NULL;
+ entries[0].NumberOfBytes = page_size;
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 1, entries, &reservedarg, sizeof(reservedarg) );
+ ok( status == STATUS_SUCCESS,
+ "NtSetInformationVirtualMemory unexpected status on 1 unmapped entry: %08x\n", status);
+
+ entries[0].VirtualAddress = (PVOID)((ULONG_PTR)testmem & -(ULONG_PTR)page_size);
+ entries[0].NumberOfBytes = page_size;
+ entries[1].VirtualAddress = (PVOID)((ULONG_PTR)stackmem & -(ULONG_PTR)page_size);
+ entries[1].NumberOfBytes = page_size;
+ status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
+ 2, entries, &reservedarg, sizeof(reservedarg) );
+ ok( status == STATUS_SUCCESS,
+ "NtSetInformationVirtualMemory unexpected status on 2 page-aligned entries: %08x\n", status);
+}
+
START_TEST(virtual)
{
HMODULE mod;
@@ -1160,6 +1275,7 @@ START_TEST(virtual)
pRtlFindExportedRoutineByName = (void *)GetProcAddress(mod, "RtlFindExportedRoutineByName");
pRtlGetEnabledExtendedFeatures = (void *)GetProcAddress(mod, "RtlGetEnabledExtendedFeatures");
pNtAllocateVirtualMemoryEx = (void *)GetProcAddress(mod, "NtAllocateVirtualMemoryEx");
+ pNtSetInformationVirtualMemory = (void *)GetProcAddress(mod, "NtSetInformationVirtualMemory");
NtQuerySystemInformation(SystemBasicInformation, &sbi, sizeof(sbi), NULL);
trace("system page size %#x\n", sbi.PageSize);
@@ -1171,4 +1287,5 @@ START_TEST(virtual)
test_NtMapViewOfSection();
test_user_shared_data();
test_syscalls();
+ test_prefetch();
}
--
2.31.1
More information about the wine-devel
mailing list