[APITESTS]
authorJérôme Gardou <jerome.gardou@reactos.org>
Mon, 11 Jul 2011 19:31:34 +0000 (19:31 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Mon, 11 Jul 2011 19:31:34 +0000 (19:31 +0000)
- add simple tests for NtFreeVirtualMemory

svn path=/trunk/; revision=52642

rostests/apitests/ntdll/CMakeLists.txt
rostests/apitests/ntdll/NtFreeVirtualMemory.c [new file with mode: 0644]
rostests/apitests/ntdll/ntdll_apitest.rbuild
rostests/apitests/ntdll/testlist.c

index 71dc759..46bbba7 100644 (file)
@@ -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 (file)
index 0000000..a2b5dab
--- /dev/null
@@ -0,0 +1,118 @@
+#define WIN32_NO_STATUS
+#include <stdio.h>
+#include <wine/test.h>
+#include <ndk/ntndk.h>
+
+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
index bde4c9e..b62e126 100644 (file)
@@ -1,13 +1,15 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
 <group>
-<module name="ntdll_apitest" type="win32cui" installbase="bin" installname="ntdll_apitest.exe">
+<module name="ntdll_apitest" type="win32cui" installbase="bin" installname="ntdll_apitest.exe"
+    allowwarnings="true">
        <include base="ntdll_apitest">.</include>
        <library>wine</library>
        <library>ntdll</library>
        <library>pseh</library>
        <file>testlist.c</file>
 
+    <file>NtFreeVirtualMemory.c</file>
        <file>RtlInitializeBitMap.c</file>
        <file>ZwContinue.c</file>
        <if property="ARCH" value="i386">
index 29c2002..0674e16 100644 (file)
@@ -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 }
 };