From 0a8af6df7ca644dd314960f82a0e8bad73792f4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Mon, 11 Jul 2011 19:31:34 +0000 Subject: [PATCH] [APITESTS] - add simple tests for NtFreeVirtualMemory svn path=/trunk/; revision=52642 --- rostests/apitests/ntdll/CMakeLists.txt | 1 + rostests/apitests/ntdll/NtFreeVirtualMemory.c | 118 ++++++++++++++++++ rostests/apitests/ntdll/ntdll_apitest.rbuild | 4 +- rostests/apitests/ntdll/testlist.c | 2 + 4 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 rostests/apitests/ntdll/NtFreeVirtualMemory.c diff --git a/rostests/apitests/ntdll/CMakeLists.txt b/rostests/apitests/ntdll/CMakeLists.txt index 71dc759aa4d..46bbba744d8 100644 --- a/rostests/apitests/ntdll/CMakeLists.txt +++ b/rostests/apitests/ntdll/CMakeLists.txt @@ -2,6 +2,7 @@ add_definitions(-D_DLL -D__USE_CRTIMP) list(APPEND SOURCE + NtFreeVirtualMemory.c RtlInitializeBitMap.c ZwContinue.c testlist.c) diff --git a/rostests/apitests/ntdll/NtFreeVirtualMemory.c b/rostests/apitests/ntdll/NtFreeVirtualMemory.c new file mode 100644 index 00000000000..a2b5dabf698 --- /dev/null +++ b/rostests/apitests/ntdll/NtFreeVirtualMemory.c @@ -0,0 +1,118 @@ +#define WIN32_NO_STATUS +#include +#include +#include + +static void Test_NtFreeVirtualMemory(void) +{ + PVOID Buffer = NULL, Buffer2; + SIZE_T Length = PAGE_SIZE; + NTSTATUS Status; + + Status = NtAllocateVirtualMemory(NtCurrentProcess(), + &Buffer, + 0, + &Length, + MEM_RESERVE, + PAGE_READWRITE); + ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed : 0x%08x\n", Status); + ok(Length == PAGE_SIZE, "Length mismatch : 0x08x\n", Length); + ok(((ULONG_PTR)Buffer % PAGE_SIZE) == 0, "The buffer is not aligned to PAGE_SIZE.\n"); + + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &Buffer, + &Length, + MEM_DECOMMIT); + ok(Status == STATUS_SUCCESS, "NtFreeVirtualMemory failed : 0x%08x\n", Status); + + /* Now try to free more than we got */ + Length++; + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &Buffer, + &Length, + MEM_DECOMMIT); + ok(Status == STATUS_UNABLE_TO_FREE_VM, "NtFreeVirtualMemory returned status : 0x%08x\n", Status); + + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &Buffer, + &Length, + MEM_RELEASE); + ok(Status == STATUS_UNABLE_TO_FREE_VM, "NtFreeVirtualMemory returned status : 0x%08x\n", Status); + + /* Free out of bounds from the wrong origin */ + Length = PAGE_SIZE; + Buffer2 = (PVOID)((ULONG_PTR)Buffer+1); + + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &Buffer2, + &Length, + MEM_DECOMMIT); + ok(Status == STATUS_UNABLE_TO_FREE_VM, "NtFreeVirtualMemory returned status : 0x%08x\n", Status); + + Buffer2 = (PVOID)((ULONG_PTR)Buffer+1); + Length = PAGE_SIZE; + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &Buffer2, + &Length, + MEM_RELEASE); + ok(Status == STATUS_UNABLE_TO_FREE_VM, "NtFreeVirtualMemory returned status : 0x%08x\n", Status); + + /* Same but in bounds */ + Length = PAGE_SIZE - 1; + Buffer2 = (PVOID)((ULONG_PTR)Buffer+1); + + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &Buffer2, + &Length, + MEM_DECOMMIT); + ok(Status == STATUS_SUCCESS, "NtFreeVirtualMemory returned status : 0x%08x\n", Status); + ok(Buffer2 == Buffer, "NtFreeVirtualMemory set wrong buffer.\n"); + ok(Length == PAGE_SIZE, "NtFreeVirtualMemory did not round Length to PAGE_SIZE.\n"); + + Buffer2 = (PVOID)((ULONG_PTR)Buffer+1); + Length = PAGE_SIZE-1; + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &Buffer2, + &Length, + MEM_RELEASE); + ok(Status == STATUS_SUCCESS, "NtFreeVirtualMemory returned status : 0x%08x\n", Status); + ok(Buffer2 == Buffer, "NtFreeVirtualMemory set wrong buffer.\n"); + ok(Length == PAGE_SIZE, "NtFreeVirtualMemory did not round Length to PAGE_SIZE.\n"); + + /* Now allocate two pages and try to free them one after the other */ + Length = 2*PAGE_SIZE; + Status = NtAllocateVirtualMemory(NtCurrentProcess(), + &Buffer, + 0, + &Length, + MEM_RESERVE, + PAGE_READWRITE); + ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed : 0x%08x\n", Status); + ok(Length == 2*PAGE_SIZE, "Length mismatch : 0x08x\n", Length); + ok(((ULONG_PTR)Buffer % PAGE_SIZE) == 0, "The buffer is not aligned to PAGE_SIZE.\n"); + + Buffer2 = Buffer; + Length = PAGE_SIZE; + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &Buffer2, + &Length, + MEM_RELEASE); + ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed : 0x%08x\n", Status); + ok(Length == PAGE_SIZE, "Length mismatch : 0x08x\n", Length); + ok(Buffer2 == Buffer, "The buffer is not aligned to PAGE_SIZE.\n"); + + Buffer2 = (PVOID)((ULONG_PTR)Buffer+PAGE_SIZE); + Length = PAGE_SIZE; + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &Buffer2, + &Length, + MEM_RELEASE); + ok(NT_SUCCESS(Status), "NtFreeVirtualMemory failed : 0x%08x\n", Status); + ok(Length == PAGE_SIZE, "Length mismatch : 0x08x\n", Length); + ok(Buffer2 == (PVOID)((ULONG_PTR)Buffer+PAGE_SIZE), "The buffer is not aligned to PAGE_SIZE.\n"); +} + +START_TEST(NtFreeVirtualMemory) +{ + Test_NtFreeVirtualMemory(); +} \ No newline at end of file diff --git a/rostests/apitests/ntdll/ntdll_apitest.rbuild b/rostests/apitests/ntdll/ntdll_apitest.rbuild index bde4c9e105b..b62e1263d33 100644 --- a/rostests/apitests/ntdll/ntdll_apitest.rbuild +++ b/rostests/apitests/ntdll/ntdll_apitest.rbuild @@ -1,13 +1,15 @@ - + . wine ntdll pseh testlist.c + NtFreeVirtualMemory.c RtlInitializeBitMap.c ZwContinue.c diff --git a/rostests/apitests/ntdll/testlist.c b/rostests/apitests/ntdll/testlist.c index 29c2002361a..0674e16b4aa 100644 --- a/rostests/apitests/ntdll/testlist.c +++ b/rostests/apitests/ntdll/testlist.c @@ -7,11 +7,13 @@ extern void func_RtlInitializeBitMap(void); extern void func_ZwContinue(void); +extern void func_NtFreeVirtualMemory(void); const struct test winetest_testlist[] = { { "RtlInitializeBitMap", func_RtlInitializeBitMap }, { "ZwContinue", func_ZwContinue }, + { "NtFreeVirtualMemory", func_NtFreeVirtualMemory }, { 0, 0 } };