Author: tfaber
Date: Sun Jul 5 19:17:50 2015
New Revision: 68351
URL:
http://svn.reactos.org/svn/reactos?rev=68351&view=rev
Log:
[KMTESTS:MM]
- Add a test for \Device\PhysicalMemory sections, which shows that we have trouble with
PAGE_NOCACHE.
CORE-9808
Modified:
trunk/rostests/kmtests/ntos_mm/MmSection.c
Modified: trunk/rostests/kmtests/ntos_mm/MmSection.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/kmtests/ntos_mm/MmSection…
==============================================================================
--- trunk/rostests/kmtests/ntos_mm/MmSection.c [iso-8859-1] (original)
+++ trunk/rostests/kmtests/ntos_mm/MmSection.c [iso-8859-1] Sun Jul 5 19:17:50 2015
@@ -381,6 +381,209 @@
}
}
+static
+VOID
+TestPhysicalMemorySection(VOID)
+{
+ NTSTATUS Status;
+ UNICODE_STRING SectionName =
RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory");
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ HANDLE SectionHandle;
+ PVOID SectionObject;
+ PUCHAR MyPage;
+ PHYSICAL_ADDRESS MyPagePhysical;
+ PUCHAR ZeroPageContents;
+ PHYSICAL_ADDRESS ZeroPagePhysical;
+ PVOID Mapping;
+ PUCHAR MappingBytes;
+ SIZE_T ViewSize;
+ SIZE_T EqualBytes;
+
+ MyPage = ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, 'MPmK');
+ if (skip(MyPage != NULL, "Out of memory\n"))
+ return;
+ MyPagePhysical = MmGetPhysicalAddress(MyPage);
+ RtlFillMemory(MyPage + 0 * PAGE_SIZE / 4, PAGE_SIZE / 4, 0x23);
+ RtlFillMemory(MyPage + 1 * PAGE_SIZE / 4, PAGE_SIZE / 4, 0x67);
+ RtlFillMemory(MyPage + 2 * PAGE_SIZE / 4, PAGE_SIZE / 4, 0xab);
+ RtlFillMemory(MyPage + 3 * PAGE_SIZE / 4, PAGE_SIZE / 4, 0xef);
+
+ ZeroPageContents = ExAllocatePoolWithTag(PagedPool, PAGE_SIZE, 'ZPmK');
+ if (skip(ZeroPageContents != NULL, "Out of memory\n"))
+ {
+ ExFreePoolWithTag(MyPage, 'MPmK');
+ return;
+ }
+ ZeroPagePhysical.QuadPart = 0;
+
+ Mapping = MmMapIoSpace(ZeroPagePhysical, PAGE_SIZE, MmCached);
+ if (skip(Mapping != NULL, "Failed to map zero page\n"))
+ {
+ ExFreePoolWithTag(ZeroPageContents, 'ZPmK');
+ ExFreePoolWithTag(MyPage, 'MPmK');
+ return;
+ }
+
+ RtlCopyMemory(ZeroPageContents, Mapping, PAGE_SIZE);
+ MmUnmapIoSpace(Mapping, PAGE_SIZE);
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &SectionName,
+ OBJ_KERNEL_HANDLE,
+ NULL,
+ NULL);
+ Status = ZwOpenSection(&SectionHandle, SECTION_ALL_ACCESS,
&ObjectAttributes);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ if (!skip(NT_SUCCESS(Status), "No section\n"))
+ {
+ /* Map zero page and compare */
+ Mapping = NULL;
+ ViewSize = PAGE_SIZE;
+ Status = ZwMapViewOfSection(SectionHandle,
+ ZwCurrentProcess(),
+ &Mapping,
+ 0,
+ 0,
+ &ZeroPagePhysical,
+ &ViewSize,
+ ViewUnmap,
+ 0,
+ PAGE_READWRITE);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ if (!skip(NT_SUCCESS(Status), "No view\n"))
+ {
+ EqualBytes = RtlCompareMemory(Mapping,
+ ZeroPageContents,
+ PAGE_SIZE);
+ ok_eq_size(EqualBytes, PAGE_SIZE);
+ Status = ZwUnmapViewOfSection(ZwCurrentProcess(), Mapping);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ }
+
+ /* Map the zero page non-cached */
+ Mapping = NULL;
+ ViewSize = PAGE_SIZE;
+ Status = ZwMapViewOfSection(SectionHandle,
+ ZwCurrentProcess(),
+ &Mapping,
+ 0,
+ 0,
+ &ZeroPagePhysical,
+ &ViewSize,
+ ViewUnmap,
+ 0,
+ PAGE_READWRITE | PAGE_NOCACHE);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ if (!skip(NT_SUCCESS(Status), "No view\n"))
+ {
+ EqualBytes = RtlCompareMemory(Mapping,
+ ZeroPageContents,
+ PAGE_SIZE);
+ ok_eq_size(EqualBytes, PAGE_SIZE);
+ Status = ZwUnmapViewOfSection(ZwCurrentProcess(), Mapping);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ }
+
+ /* Map our NP page, compare, and check that modifications are reflected */
+ Mapping = NULL;
+ ViewSize = PAGE_SIZE;
+ Status = ZwMapViewOfSection(SectionHandle,
+ ZwCurrentProcess(),
+ &Mapping,
+ 0,
+ 0,
+ &MyPagePhysical,
+ &ViewSize,
+ ViewUnmap,
+ 0,
+ PAGE_READWRITE);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ if (!skip(NT_SUCCESS(Status), "No view\n"))
+ {
+ EqualBytes = RtlCompareMemory(Mapping,
+ MyPage,
+ PAGE_SIZE);
+ ok_eq_size(EqualBytes, PAGE_SIZE);
+
+ MappingBytes = Mapping;
+ ok(MappingBytes[5] == 0x23, "Mapping[5] = 0x%x\n",
MappingBytes[5]);
+ ok(MyPage[5] == 0x23, "MyPage[5] = 0x%x\n", MyPage[5]);
+
+ MyPage[5] = 0x44;
+ ok(MappingBytes[5] == 0x44, "Mapping[5] = 0x%x\n",
MappingBytes[5]);
+ ok(MyPage[5] == 0x44, "MyPage[5] = 0x%x\n", MyPage[5]);
+
+ MappingBytes[5] = 0x88;
+ ok(MappingBytes[5] == 0x88, "Mapping[5] = 0x%x\n",
MappingBytes[5]);
+ ok(MyPage[5] == 0x88, "MyPage[5] = 0x%x\n", MyPage[5]);
+
+ Status = ZwUnmapViewOfSection(ZwCurrentProcess(), Mapping);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ }
+
+ Status = ZwClose(SectionHandle);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ }
+
+ /* Try flag 0x80000000, which ROS calls SEC_PHYSICALMEMORY */
+ InitializeObjectAttributes(&ObjectAttributes,
+ NULL,
+ OBJ_KERNEL_HANDLE,
+ NULL,
+ NULL);
+ Status = ZwCreateSection(&SectionHandle,
+ SECTION_ALL_ACCESS,
+ &ObjectAttributes,
+ NULL,
+ PAGE_READWRITE,
+ 0x80000000,
+ NULL);
+ ok_eq_hex(Status, STATUS_INVALID_PARAMETER_6);
+ if (NT_SUCCESS(Status))
+ ZwClose(SectionHandle);
+
+ /* Assertion failure: AllocationAttributes & SEC_IMAGE | SEC_RESERVE | SEC_COMMIT
*/
+ if (!KmtIsCheckedBuild)
+ {
+ InitializeObjectAttributes(&ObjectAttributes,
+ NULL,
+ OBJ_KERNEL_HANDLE,
+ NULL,
+ NULL);
+ Status = MmCreateSection(&SectionObject,
+ SECTION_ALL_ACCESS,
+ &ObjectAttributes,
+ NULL,
+ PAGE_READWRITE,
+ 0x80000000,
+ NULL,
+ NULL);
+ ok_eq_hex(Status, STATUS_INVALID_PARAMETER_6);
+ if (NT_SUCCESS(Status))
+ ObDereferenceObject(SectionObject);
+ }
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ NULL,
+ OBJ_KERNEL_HANDLE,
+ NULL,
+ NULL);
+ Status = MmCreateSection(&SectionObject,
+ SECTION_ALL_ACCESS,
+ &ObjectAttributes,
+ NULL,
+ PAGE_READWRITE,
+ SEC_RESERVE | 0x80000000,
+ NULL,
+ NULL);
+ ok_eq_hex(Status, STATUS_INVALID_PARAMETER_6);
+ if (NT_SUCCESS(Status))
+ ObDereferenceObject(SectionObject);
+
+ ExFreePoolWithTag(ZeroPageContents, 'ZPmK');
+ ExFreePoolWithTag(MyPage, 'MPmK');
+}
+
START_TEST(MmSection)
{
NTSTATUS Status;
@@ -453,4 +656,6 @@
ZwClose(FileHandle2);
if (FileHandle1)
ZwClose(FileHandle1);
+
+ TestPhysicalMemorySection();
}