[PATCH v5 3/6] ntdll: Add tests for NtSetInformationVirtualMemory.
Jinoh Kang
jinoh.kang.kr at gmail.com
Sat Nov 27 23:12:17 CST 2021
On 11/28/21 11:25, Jinoh Kang wrote:
> Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
> ---
>
> Notes:
> v2 -> v3: Guard wow64 status code tests with todo_wine
> v4 -> v5: fix one wow64 test item
>
> dlls/ntdll/tests/virtual.c | 164 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 164 insertions(+)
>
> diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
> index adc9b1ae6dc..0b1c2d62d23 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,165 @@ 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\n");
> + return;
> + }
> +
> + status = pNtSetInformationVirtualMemory( NtCurrentProcess(), -1UL, 1, entries, NULL, 32);
> + ok( status == STATUS_INVALID_PARAMETER_2,
> + "NtSetInformationVirtualMemory unexpected status on invalid info class (1): %08x\n", status);
> +
> + status = pNtSetInformationVirtualMemory( NtCurrentProcess(), -1UL, 0, NULL, NULL, 0);
> + ok( status == STATUS_INVALID_PARAMETER_2 || (is_wow64 && status == STATUS_INVALID_PARAMETER_3),
> + "NtSetInformationVirtualMemory unexpected status on invalid info class (2): %08x\n", status);
> + if (is_wow64)
> + {
> + todo_wine
> + ok( status == STATUS_INVALID_PARAMETER_3,
> + "wow64 NtSetInformationVirtualMemory unexpected status on invalid info class (2): %08x\n", status);
> + }
> +
> + status = pNtSetInformationVirtualMemory( NtCurrentProcess(), -1UL, 1, NULL, NULL, 32);
> + ok( status == STATUS_INVALID_PARAMETER_2 || (is_wow64 && status == STATUS_ACCESS_VIOLATION),
> + "NtSetInformationVirtualMemory unexpected status on invalid info class (3): %08x\n", status);
> + if (is_wow64)
> + {
> + todo_wine
> + ok( status == STATUS_ACCESS_VIOLATION,
> + "wow64 NtSetInformationVirtualMemory unexpected status on invalid info class (3): %08x\n", status);
> + }
> +
> + status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
> + 1, entries, NULL, 0 );
> + ok( status == STATUS_INVALID_PARAMETER_5 ||
> + broken( is_wow64 && status == STATUS_INVALID_PARAMETER_6 ) /* win10 1507 */,
> + "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 || (is_wow64 && status == STATUS_ACCESS_VIOLATION),
> + "NtSetInformationVirtualMemory unexpected status on NULL info data (2): %08x\n", status);
> + if (is_wow64)
> + {
> + todo_wine
> + ok( status == STATUS_ACCESS_VIOLATION,
> + "wow64 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 || (is_wow64 && status == STATUS_INVALID_PARAMETER_3),
> + "NtSetInformationVirtualMemory unexpected status on NULL info data (3): %08x\n", status);
> + if (is_wow64)
> + {
> + todo_wine
> + ok( status == STATUS_INVALID_PARAMETER_3,
> + "wow64 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 || (is_wow64 && status == STATUS_INVALID_PARAMETER_3),
> + "NtSetInformationVirtualMemory unexpected status on extended info data (2): %08x\n", status);
> + if (is_wow64)
> + {
> + todo_wine
> + ok( status == STATUS_INVALID_PARAMETER_3,
> + "wow64 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 || (is_wow64 && status == STATUS_INVALID_PARAMETER_3),
> + "NtSetInformationVirtualMemory unexpected status on shrunk info data (2): %08x\n", status);
> + if (is_wow64)
> + {
> + todo_wine
> + ok( status == STATUS_INVALID_PARAMETER_3,
> + "wow64 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 ||
> + broken( is_wow64 && status == STATUS_INVALID_PARAMETER_6 ) /* win10 1507 */,
> + "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 ||
> + broken( is_wow64 && status == STATUS_INVALID_PARAMETER_6 ) /* win10 1507 */,
> + "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 ||
> + broken( is_wow64 && status == STATUS_INVALID_PARAMETER_6 ) /* win10 1507 */,
> + "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 ||
> + broken( is_wow64 && status == STATUS_INVALID_PARAMETER_6 ) /* win10 1507 */,
> + "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 ||
> + broken( is_wow64 && status == STATUS_INVALID_PARAMETER_6 ) /* win10 1507 */,
> + "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;
Use ULongToPtr().
> + status = pNtSetInformationVirtualMemory( NtCurrentProcess(), VmPrefetchInformation,
> + 2, entries, &reservedarg, sizeof(reservedarg) );
> + ok( status == STATUS_SUCCESS ||
> + broken( is_wow64 && status == STATUS_INVALID_PARAMETER_6 ) /* win10 1507 */,
> + "NtSetInformationVirtualMemory unexpected status on 2 page-aligned entries: %08x\n", status);
> +}
> +
> START_TEST(virtual)
> {
> HMODULE mod;
> @@ -1160,6 +1322,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 +1334,5 @@ START_TEST(virtual)
> test_NtMapViewOfSection();
> test_user_shared_data();
> test_syscalls();
> + test_prefetch();
> }
>
--
Sincerely,
Jinoh Kang
More information about the wine-devel
mailing list