Author: tkreuzer
Date: Wed Mar 27 19:10:51 2013
New Revision: 58613
URL:
http://svn.reactos.org/svn/reactos?rev=58613&view=rev
Log:
[NTDLL_APITEST]
Add more tests for NtAllocateVirtualMemory and NtMapViewOfSection
Added:
trunk/rostests/apitests/ntdll/NtMapViewOfSection.c (with props)
trunk/rostests/apitests/testdata/test.dll (with props)
Modified:
trunk/rostests/apitests/ntdll/CMakeLists.txt
trunk/rostests/apitests/ntdll/NtAllocateVirtualMemory.c
trunk/rostests/apitests/ntdll/testlist.c
Modified: trunk/rostests/apitests/ntdll/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ntdll/CMakeLists…
==============================================================================
--- trunk/rostests/apitests/ntdll/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/rostests/apitests/ntdll/CMakeLists.txt [iso-8859-1] Wed Mar 27 19:10:51 2013
@@ -3,6 +3,7 @@
LdrEnumResources.c
NtAllocateVirtualMemory.c
NtFreeVirtualMemory.c
+ NtMapViewOfSection.c
NtQuerySystemEnvironmentValue.c
RtlBitmap.c
RtlDetermineDosPathNameType.c
Modified: trunk/rostests/apitests/ntdll/NtAllocateVirtualMemory.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ntdll/NtAllocate…
==============================================================================
--- trunk/rostests/apitests/ntdll/NtAllocateVirtualMemory.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/ntdll/NtAllocateVirtualMemory.c [iso-8859-1] Wed Mar 27
19:10:51 2013
@@ -9,6 +9,7 @@
#include <wine/test.h>
#include <ndk/rtlfuncs.h>
#include <ndk/mmfuncs.h>
+#include <pseh/pseh2.h>
static PVOID Allocations[4096] = { NULL };
static ULONG CurrentAllocation = 0;
@@ -198,6 +199,275 @@
return TRUE;
}
+VOID
+CheckSize(ULONG_PTR Base, SIZE_T InSize, SIZE_T ExpectedSize)
+{
+ NTSTATUS Status;
+ PVOID BaseAddress;
+ SIZE_T Size;
+
+ /* Reserve memory */
+ BaseAddress = UlongToPtr(Base);
+ Size = InSize;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_RESERVE,
+ PAGE_NOACCESS);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed!\n");
+ ok(BaseAddress == UlongToPtr(Base & ~0xFFFF), "Got back wrong base address:
%p\n", BaseAddress);
+ ok(Size == ExpectedSize, "Alloc of 0x%Ix: got back wrong size: 0x%Ix, expected
0x%Ix\n", InSize, Size, ExpectedSize);
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(NT_SUCCESS(Status), "NtFreeVirtualMemory failed!\n");
+}
+
+VOID
+CheckAlignment()
+{
+ NTSTATUS Status;
+ PVOID BaseAddress;
+ SIZE_T Size;
+
+ CheckSize(0x50000000, 0x0001, 0x1000);
+ CheckSize(0x50008000, 0x0001, 0x9000);
+ CheckSize(0x50000010, 0x1000, 0x2000);
+ CheckSize(0x50010000, 0x2000, 0x2000);
+ CheckSize(0x5000FFFF, 0x3000, 0x13000);
+ CheckSize(0x50001010, 0x7000, 0x9000);
+ CheckSize(0x50001010, 0xC000, 0xe000);
+
+ /* Reserve memory not aligned to allocation granularity */
+ BaseAddress = UlongToPtr(0x50001010);
+ Size = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_RESERVE,
+ PAGE_NOACCESS);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed!\n");
+ ok(BaseAddress == UlongToPtr(0x50000000), "Got back wrong base address:
%p", BaseAddress);
+ ok(Size == 0x3000, "Got back wrong size: 0x%Ix", Size);
+
+ /* Try to reserve again in the same 64k region */
+ BaseAddress = UlongToPtr(0x50008000);
+ Size = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_RESERVE,
+ PAGE_NOACCESS);
+ ok(!NT_SUCCESS(Status), "NtAllocateVirtualMemory should fail!\n");
+
+ /* Commit memory */
+ BaseAddress = UlongToPtr(0x50002000);
+ Size = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_COMMIT,
+ PAGE_NOACCESS);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed!\n");
+ ok(BaseAddress == UlongToPtr(0x50002000), "Got back wrong base address:
%p", BaseAddress);
+ ok(Size == 0x1000, "Got back wrong size: 0x%Ix", Size);
+
+ /* Commit memory */
+ BaseAddress = UlongToPtr(0x50003000);
+ Size = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_COMMIT,
+ PAGE_NOACCESS);
+ ok(!NT_SUCCESS(Status), "NtAllocateVirtualMemory should fail!\n");
+
+ /* Try to release memory in a different 64k region */
+ BaseAddress = UlongToPtr(0x50010000);
+ Size = 0x1000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(!NT_SUCCESS(Status), "NtFreeVirtualMemory should fail!\n");
+
+ /* Release the memory in the same 64k region at a different address */
+ BaseAddress = UlongToPtr(0x50008000);
+ Size = 0x1000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(!NT_SUCCESS(Status), "NtFreeVirtualMemory failed!\n");
+
+ /* Release the memory at the correct address but with wrong size */
+ BaseAddress = UlongToPtr(0x50000000);
+ Size = 0x4000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(!NT_SUCCESS(Status), "NtFreeVirtualMemory should fail!\n");
+
+ /* Release the memory */
+ BaseAddress = UlongToPtr(0x50000000);
+ Size = 0x3000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(NT_SUCCESS(Status), "NtFreeVirtualMemory failed!\n");
+
+ /* Reserve and commit at once */
+ BaseAddress = UlongToPtr(0x50004080);
+ Size = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_RESERVE | MEM_COMMIT,
+ PAGE_READWRITE);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed!\n");
+ ok(BaseAddress == UlongToPtr(0x50000000), "Got back wrong base address:
%p", BaseAddress);
+ ok(Size == 0x6000, "Got back wrong size: 0x%Ix", Size);
+
+ _SEH2_TRY
+ {
+ *(int*)UlongToPtr(BaseAddress) = 1;
+ *(int*)UlongToPtr(0x50004080) = 1;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ ok(0, "Got exception\n");
+ }
+ _SEH2_END;
+
+ /* Release the memory */
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(NT_SUCCESS(Status), "NtFreeVirtualMemory failed!\n");
+
+}
+
+static
+VOID
+CheckAdjacentVADs()
+{
+ NTSTATUS Status;
+ PVOID BaseAddress;
+ SIZE_T Size;
+
+ /* Reserve a full 64k region */
+ BaseAddress = UlongToPtr(0x50000000);
+ Size = 0x10000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_RESERVE,
+ PAGE_NOACCESS);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed!\n");
+ if (!NT_SUCCESS(Status))
+ return;
+
+ /* Reserve another 64k region, but with 64k between */
+ BaseAddress = UlongToPtr(0x50020000);
+ Size = 0x10000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_RESERVE,
+ PAGE_NOACCESS);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed!\n");
+ if (!NT_SUCCESS(Status))
+ return;
+
+ /* Try to free the whole at once */
+ BaseAddress = UlongToPtr(0x50000000);
+ Size = 0x30000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(!NT_SUCCESS(Status), "NtFreeVirtualMemory should fail!\n");
+
+ /* Reserve the part in the middle */
+ BaseAddress = UlongToPtr(0x50010000);
+ Size = 0x10000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_RESERVE,
+ PAGE_NOACCESS);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed!\n");
+
+ /* Try to commit memory covering 2 allocations */
+ BaseAddress = UlongToPtr(0x50004000);
+ Size = 0x10000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_COMMIT,
+ PAGE_NOACCESS);
+ ok(!NT_SUCCESS(Status), "NtAllocateVirtualMemory should fail!\n");
+
+ /* Allocate a page */
+ BaseAddress = UlongToPtr(0x50000000);
+ Size = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed!\n");
+
+ /* Allocate another page */
+ BaseAddress = UlongToPtr(0x50002000);
+ Size = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_COMMIT,
+ PAGE_NOACCESS);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed!\n");
+
+ _SEH2_TRY
+ {
+ *(int*)UlongToPtr(0x50000000) = 1;
+ //*(int*)UlongToPtr(0x50002000) = 1;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ ok(0, "Got exception\n");
+ }
+ _SEH2_END;
+
+ /* Allocate 3 pages, on top of the previous 2 */
+ BaseAddress = UlongToPtr(0x50000000);
+ Size = 0x3000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &Size,
+ MEM_COMMIT,
+ PAGE_NOACCESS);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed!\n");
+
+ /* Try to free the whole region at once */
+ BaseAddress = UlongToPtr(0x50000000);
+ Size = 0x30000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(!NT_SUCCESS(Status), "NtFreeVirtualMemory should fail!\n");
+
+ BaseAddress = UlongToPtr(0x50000000);
+ Size = 0x10000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(NT_SUCCESS(Status), "NtFreeVirtualMemory failed!\n");
+
+ BaseAddress = UlongToPtr(0x50010000);
+ Size = 0x10000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(NT_SUCCESS(Status), "NtFreeVirtualMemory failed!\n");
+
+ BaseAddress = UlongToPtr(0x50020000);
+ Size = 0x10000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &BaseAddress, &Size,
MEM_RELEASE);
+ ok(NT_SUCCESS(Status), "NtFreeVirtualMemory failed!\n");
+
+}
+
#define RUNS 32
START_TEST(NtAllocateVirtualMemory)
@@ -205,6 +475,9 @@
PVOID Mem1, Mem2;
SIZE_T Size1, Size2;
ULONG i;
+
+ CheckAlignment();
+ CheckAdjacentVADs();
Size1 = 32;
Mem1 = Allocate(Size1);
Added: trunk/rostests/apitests/ntdll/NtMapViewOfSection.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ntdll/NtMapViewO…
==============================================================================
--- trunk/rostests/apitests/ntdll/NtMapViewOfSection.c (added)
+++ trunk/rostests/apitests/ntdll/NtMapViewOfSection.c [iso-8859-1] Wed Mar 27 19:10:51
2013
@@ -1,0 +1,390 @@
+
+#define WIN32_NO_STATUS
+#include <wine/test.h>
+#include <ndk/ntndk.h>
+#include <pseh/pseh2.h>
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+NtMapViewOfSection(
+ HANDLE SectionHandle,
+ HANDLE ProcessHandle,
+ PVOID *BaseAddress,
+ ULONG_PTR ZeroBits,
+ SIZE_T CommitSize,
+ PLARGE_INTEGER SectionOffset,
+ PSIZE_T ViewSize,
+ SECTION_INHERIT InheritDisposition,
+ ULONG AllocationType,
+ ULONG Protect);
+
+void
+Test_PageFileSection(void)
+{
+ NTSTATUS Status;
+ HANDLE SectionHandle;
+ LARGE_INTEGER MaximumSize, SectionOffset;
+ PVOID BaseAddress;
+ SIZE_T ViewSize;
+
+ /* Create a page file backed section */
+ MaximumSize.QuadPart = 0x20000;
+ Status = NtCreateSection(&SectionHandle,
+ SECTION_ALL_ACCESS,
+ NULL,
+ &MaximumSize,
+ PAGE_READWRITE,
+ SEC_COMMIT,
+ NULL);
+ ok(NT_SUCCESS(Status), "NtCreateSection failed with Status %lx\n",
Status);
+ if (!NT_SUCCESS(Status))
+ return;
+
+ /* Try to map a page at an address that is not 64k aligned */
+ BaseAddress = (PVOID)0x30001000;
+ SectionOffset.QuadPart = 0;
+ ViewSize = 0x1000;
+ Status = NtMapViewOfSection(SectionHandle,
+ NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ 0,
+ &SectionOffset,
+ &ViewSize,
+ ViewShare,
+ 0,
+ PAGE_READWRITE);
+ ok(Status == STATUS_MAPPED_ALIGNMENT,
+ "NtMapViewOfSection returned wrong Status %lx\n", Status);
+
+ /* Try to map a page with execute rights */
+ BaseAddress = (PVOID)0x30000000;
+ SectionOffset.QuadPart = 0;
+ ViewSize = 0x1000;
+ Status = NtMapViewOfSection(SectionHandle,
+ NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ 0,
+ &SectionOffset,
+ &ViewSize,
+ ViewShare,
+ 0,
+ PAGE_EXECUTE_READWRITE);
+ ok(Status == STATUS_SECTION_PROTECTION,
+ "NtMapViewOfSection returned wrong Status %lx\n", Status);
+
+ /* Map 2 pages, not comitting them */
+ BaseAddress = (PVOID)0x30000000;
+ SectionOffset.QuadPart = 0;
+ ViewSize = 0x2000;
+ Status = NtMapViewOfSection(SectionHandle,
+ NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ 0,
+ &SectionOffset,
+ &ViewSize,
+ ViewShare,
+ 0,
+ PAGE_READWRITE);
+ ok(NT_SUCCESS(Status), "NtMapViewOfSection failed with Status %lx\n",
Status);
+ if (!NT_SUCCESS(Status))
+ return;
+
+ /* Commit a page in the section */
+ BaseAddress = (PVOID)0x30000000;
+ ViewSize = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &ViewSize,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed with Status %lx\n",
Status);
+
+ /* Try to commit a range larger than the section */
+ BaseAddress = (PVOID)0x30000000;
+ ViewSize = 0x3000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &ViewSize,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ ok(Status == STATUS_CONFLICTING_ADDRESSES,
+ "NtAllocateVirtualMemory failed with wrong Status %lx\n", Status);
+
+ /* Try to commit a page after the section */
+ BaseAddress = (PVOID)0x30002000;
+ ViewSize = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &ViewSize,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ ok(!NT_SUCCESS(Status), "NtAllocateVirtualMemory Should fail\n");
+
+ /* Try to allocate a page after the section */
+ BaseAddress = (PVOID)0x30002000;
+ ViewSize = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &ViewSize,
+ MEM_RESERVE | MEM_COMMIT,
+ PAGE_READWRITE);
+ ok(!NT_SUCCESS(Status), "NtAllocateVirtualMemory should fail\n");
+
+ /* Need to go to next 64k boundary */
+ BaseAddress = (PVOID)0x30010000;
+ ViewSize = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &ViewSize,
+ MEM_RESERVE | MEM_COMMIT,
+ PAGE_READWRITE);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed with Status %lx\n",
Status);
+ if (!NT_SUCCESS(Status))
+ return;
+
+ /* Free the allocation */
+ BaseAddress = (PVOID)0x30010000;
+ ViewSize = 0x1000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ &ViewSize,
+ MEM_RELEASE);
+ ok(NT_SUCCESS(Status), "NtFreeVirtualMemory failed with Status %lx\n",
Status);
+
+ /* Free the section mapping */
+ BaseAddress = (PVOID)0x30000000;
+ ViewSize = 0x1000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ &ViewSize,
+ MEM_RELEASE);
+ ok(Status == STATUS_UNABLE_TO_DELETE_SECTION,
+ "NtFreeVirtualMemory failed with wrong Status %lx\n", Status);
+
+ /* Commit a page in the section */
+ BaseAddress = (PVOID)0x30001000;
+ ViewSize = 0x1000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &ViewSize,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed with Status %lx\n",
Status);
+
+ /* Try to decommit the page */
+ BaseAddress = (PVOID)0x30001000;
+ ViewSize = 0x1000;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ &ViewSize,
+ MEM_DECOMMIT);
+ ok(Status == STATUS_UNABLE_TO_DELETE_SECTION,
+ "NtFreeVirtualMemory failed with wrong Status %lx\n", Status);
+
+ BaseAddress = (PVOID)0x40000000;
+ SectionOffset.QuadPart = 0;
+ ViewSize = 0x1000;
+ Status = NtMapViewOfSection(SectionHandle,
+ NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ 0,
+ &SectionOffset,
+ &ViewSize,
+ ViewShare,
+ 0,
+ PAGE_READWRITE);
+ ok(NT_SUCCESS(Status), "NtMapViewOfSection failed with Status %lx\n",
Status);
+ if (!NT_SUCCESS(Status))
+ return;
+
+ ok(BaseAddress == (PVOID)0x40000000, "Invalid BaseAddress: %p",
BaseAddress);
+
+ BaseAddress = (PVOID)0x40080000;
+ SectionOffset.QuadPart = 0x10000;
+ ViewSize = 0x1000;
+ Status = NtMapViewOfSection(SectionHandle,
+ NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ 0,
+ &SectionOffset,
+ &ViewSize,
+ ViewShare,
+ 0,
+ PAGE_READWRITE);
+ ok(NT_SUCCESS(Status), "NtMapViewOfSection failed with Status %lx\n",
Status);
+ if (!NT_SUCCESS(Status))
+ return;
+
+ ok(BaseAddress == (PVOID)0x40080000, "Invalid BaseAddress: %p",
BaseAddress);
+
+ /* Commit a page in the section */
+ BaseAddress = (PVOID)0x40000000;
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(),
+ &BaseAddress,
+ 0,
+ &ViewSize,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed with Status %lx\n",
Status);
+ if (!NT_SUCCESS(Status))
+ return;
+
+}
+
+void
+Test_ImageSection(void)
+{
+ UNICODE_STRING FileName;
+ NTSTATUS Status;
+ OBJECT_ATTRIBUTES FileObjectAttributes;
+ IO_STATUS_BLOCK IoStatusBlock;
+ HANDLE FileHandle, DataSectionHandle, ImageSectionHandle;
+ PVOID DataBase, ImageBase;
+ SIZE_T ViewSize;
+
+ if (!RtlDosPathNameToNtPathName_U(L"testdata\\test.dll",
+ &FileName,
+ NULL,
+ NULL))
+ {
+ ok(0, "RtlDosPathNameToNtPathName_U failed\n");
+ return;
+ }
+
+ InitializeObjectAttributes(&FileObjectAttributes,
+ &FileName,
+ 0,
+ NULL,
+ NULL);
+
+ Status = NtOpenFile(&FileHandle,
+ GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,
+ &FileObjectAttributes,
+ &IoStatusBlock,
+ FILE_SHARE_READ,
+ FILE_SYNCHRONOUS_IO_NONALERT);
+ ok(Status == STATUS_SUCCESS, "NtOpenFile failed, Status 0x%lx\n", Status);
+
+ /* Create a data section with write access */
+ Status = NtCreateSection(&DataSectionHandle,
+ SECTION_ALL_ACCESS, // DesiredAccess
+ NULL, // ObjectAttributes
+ NULL, // MaximumSize
+ PAGE_READWRITE, // SectionPageProtection
+ SEC_COMMIT, // AllocationAttributes
+ FileHandle);
+ ok(Status == STATUS_SUCCESS, "NtCreateSection failed, Status 0x%lx\n",
Status);
+
+ /* Map the data section */
+ DataBase = NULL;
+ ViewSize = 0;
+ Status = NtMapViewOfSection(DataSectionHandle,
+ NtCurrentProcess(),
+ &DataBase,
+ 0,
+ 0,
+ NULL,
+ &ViewSize,
+ ViewShare,
+ 0,
+ PAGE_READWRITE);
+ ok(Status == STATUS_SUCCESS, "NtMapViewOfSection failed, Status 0x%lx\n",
Status);
+
+ /* Check the original data */
+ ok(*(ULONG*)DataBase == 0x00905a4d, "Header not ok\n");
+
+ /* Now modify the data in the data section */
+ *(ULONG*)DataBase = 0xdeadbabe;
+
+ /* Check the data */
+ ok(*(ULONG*)DataBase == 0xdeadbabe, "Header not ok\n");
+
+ /* Now try to create an image section */
+ Status = NtCreateSection(&ImageSectionHandle,
+ SECTION_ALL_ACCESS, // DesiredAccess
+ NULL, // ObjectAttributes
+ NULL, // MaximumSize
+ PAGE_READWRITE, // SectionPageProtection
+ SEC_IMAGE, // AllocationAttributes
+ FileHandle);
+ ok(Status == STATUS_INVALID_IMAGE_NOT_MZ, "NtCreateSection failed, Status
0x%lx\n", Status);
+
+ /* Restore the original data */
+ *(ULONG*)DataBase = 0x00905a4d;
+
+ /* Try to create an image section again */
+ Status = NtCreateSection(&ImageSectionHandle,
+ SECTION_ALL_ACCESS, // DesiredAccess
+ NULL, // ObjectAttributes
+ NULL, // MaximumSize
+ PAGE_READWRITE, // SectionPageProtection
+ SEC_IMAGE, // AllocationAttributes
+ FileHandle);
+ ok(Status == STATUS_SUCCESS, "NtCreateSection failed, Status 0x%lx\n",
Status);
+
+ /* Map the image section */
+ ImageBase = NULL;
+ ViewSize = 0;
+ Status = NtMapViewOfSection(ImageSectionHandle,
+ NtCurrentProcess(),
+ &ImageBase,
+ 0,
+ 0,
+ NULL,
+ &ViewSize,
+ ViewShare,
+ 0,
+ PAGE_READONLY);
+ ok(Status == STATUS_SUCCESS, "NtMapViewOfSection failed, Status 0x%lx\n",
Status);
+
+ /* Check the data */
+ ok(*(ULONG*)DataBase == 0x00905a4d, "Header not ok\n");
+ ok(*(ULONG*)ImageBase == 0x00905a4d, "Header not ok\n");
+
+ /* Now modify the data again */
+ *(ULONG*)DataBase = 0xdeadbabe;
+
+ /* Check the data */
+ ok(*(ULONG*)DataBase == 0xdeadbabe, "Header not ok\n");
+ ok(*(ULONG*)ImageBase == 0x00905a4d, "Data should not be synced!\n");
+
+ /* Flush the view */
+ ViewSize = 0x1000;
+ Status = NtFlushVirtualMemory(NtCurrentProcess(),
+ &DataBase,
+ &ViewSize,
+ &IoStatusBlock);
+ ok(Status == STATUS_SUCCESS, "NtFlushVirtualMemory failed, Status 0x%lx\n",
Status);
+
+ /* Check the data again */
+ ok(*(ULONG*)ImageBase == 0x00905a4d, "Data should not be synced!\n");
+
+ /* Restore the original data */
+ *(ULONG*)DataBase = 0x00905a4d;
+ ok(*(ULONG*)DataBase == 0x00905a4d, "Header not ok\n");
+
+ /* Cleanup */
+ NtUnmapViewOfSection(NtCurrentProcess(), ImageBase);
+ NtUnmapViewOfSection(NtCurrentProcess(), DataBase);
+ NtClose(ImageSectionHandle);
+ NtClose(DataSectionHandle);
+ NtClose(FileHandle);
+}
+
+START_TEST(NtMapViewOfSection)
+{
+ //Test_PageFileSection();
+ Test_ImageSection();
+}
Propchange: trunk/rostests/apitests/ntdll/NtMapViewOfSection.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/rostests/apitests/ntdll/testlist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ntdll/testlist.c…
==============================================================================
--- trunk/rostests/apitests/ntdll/testlist.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/ntdll/testlist.c [iso-8859-1] Wed Mar 27 19:10:51 2013
@@ -6,6 +6,7 @@
extern void func_LdrEnumResources(void);
extern void func_NtAllocateVirtualMemory(void);
extern void func_NtFreeVirtualMemory(void);
+extern void func_NtMapViewOfSection(void);
extern void func_NtQuerySystemEnvironmentValue(void);
extern void func_NtSystemInformation(void);
extern void func_RtlBitmap(void);
@@ -26,6 +27,7 @@
{ "LdrEnumResources", func_LdrEnumResources },
{ "NtAllocateVirtualMemory", func_NtAllocateVirtualMemory },
{ "NtFreeVirtualMemory", func_NtFreeVirtualMemory },
+ { "NtMapViewOfSection", func_NtMapViewOfSection },
{ "NtQuerySystemEnvironmentValue", func_NtQuerySystemEnvironmentValue },
{ "NtSystemInformation", func_NtSystemInformation },
{ "RtlBitmapApi", func_RtlBitmap },
Added: trunk/rostests/apitests/testdata/test.dll
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/testdata/test.dl…
==============================================================================
Binary file - no diff available.
Propchange: trunk/rostests/apitests/testdata/test.dll
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream