Author: tfaber Date: Fri Sep 23 11:43:02 2011 New Revision: 53810
URL: http://svn.reactos.org/svn/reactos?rev=53810&view=rev Log: [KMTESTS/MM] - Extend MmSection test to include passing different files and mapping a view
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] Fri Sep 23 11:43:02 2011 @@ -18,6 +18,57 @@ ok_eq_hex(Status, STATUS_SUCCESS); \ ok_eq_ulong(ObjectInfo.PointerCount, Pointers); \ ok_eq_ulong(ObjectInfo.HandleCount, Handles); \ +} while (0) + +#define CheckSection(SectionObject, SectionFlag) do \ +{ \ + SECTION_BASIC_INFORMATION Sbi; \ + HANDLE SectionHandle = NULL; \ + NTSTATUS Status; \ + if (skip(SectionObject != NULL && \ + SectionObject != (PVOID)0x5555555555555555ULL, \ + "blah\n")) \ + break; \ + Status = ObOpenObjectByPointer(SectionObject, OBJ_KERNEL_HANDLE, \ + NULL, 0, MmSectionObjectType, \ + KernelMode, &SectionHandle); \ + ok_eq_hex(Status, STATUS_SUCCESS); \ + ok(SectionHandle != NULL, "Section handle null\n"); \ + if (!skip(NT_SUCCESS(Status) && SectionHandle, \ + "No section handle\n")) \ + { \ + Status = ZwQuerySection(SectionHandle, SectionBasicInformation, \ + &Sbi, sizeof Sbi, NULL); \ + ok_eq_hex(Status, STATUS_SUCCESS); \ + ok_eq_pointer(Sbi.BaseAddress, NULL); \ + ok_eq_longlong(Sbi.Size.QuadPart, 1LL); \ + ok_eq_hex(Sbi.Attributes, SectionFlag | SEC_FILE); \ + ZwClose(SectionHandle); \ + } \ +} while (0) + +#define TestMapView(SectionObject, ExpectAtBase, ExpectM) do \ +{ \ + NTSTATUS Status; \ + PVOID BaseAddress = NULL; \ + SIZE_T ViewSize = 0; \ + LARGE_INTEGER SectionOffset; \ + if (skip(SectionObject != NULL && \ + SectionObject != (PVOID)0x5555555555555555ULL, \ + "No section object\n")) \ + break; \ + \ + SectionOffset.QuadPart = 0; \ + Status = MmMapViewOfSection(SectionObject, PsGetCurrentProcess(), \ + &BaseAddress, 0, 1, &SectionOffset, \ + &ViewSize, ViewUnmap, 0, PAGE_READONLY); \ + ok_eq_hex(Status, ExpectAtBase ? STATUS_SUCCESS : STATUS_IMAGE_NOT_AT_BASE);\ + if (!skip(NT_SUCCESS(Status), "Section not mapped\n")) \ + { \ + ok_eq_uint(*(PUCHAR)BaseAddress, ExpectM ? 'M' : 0); \ + Status = MmUnmapViewOfSection(PsGetCurrentProcess(), BaseAddress); \ + ok_eq_hex(Status, STATUS_SUCCESS); \ + } \ } while (0)
static @@ -149,6 +200,8 @@ ok(SectionObject != InvalidPointer, "Section object pointer untouched\n"); ok(SectionObject != NULL, "Section object pointer NULL\n"); CheckObject(FileHandle2, PointerCount2, 1L); + CheckSection(SectionObject, SEC_IMAGE); + TestMapView(SectionObject, FALSE, TRUE);
if (SectionObject && SectionObject != InvalidPointer) ObDereferenceObject(SectionObject); @@ -165,6 +218,8 @@ ok(SectionObject != NULL, "Section object pointer NULL\n"); ++PointerCount2; CheckObject(FileHandle2, PointerCount2, 1L); + CheckSection(SectionObject, 0); + TestMapView(SectionObject, TRUE, TRUE);
if (SectionObject && SectionObject != InvalidPointer) ObDereferenceObject(SectionObject); @@ -181,6 +236,8 @@ ok(SectionObject != InvalidPointer, "Section object pointer untouched\n"); ok(SectionObject != NULL, "Section object pointer NULL\n"); CheckObject(FileHandle2, PointerCount2, 1L); + CheckSection(SectionObject, 0); + TestMapView(SectionObject, TRUE, TRUE);
if (SectionObject && SectionObject != InvalidPointer) ObDereferenceObject(SectionObject); @@ -212,6 +269,8 @@ ok(SectionObject != NULL, "Section object pointer NULL\n"); ++PointerCount1; CheckObject(FileHandle1, PointerCount1, 1L); + CheckSection(SectionObject, 0); + TestMapView(SectionObject, TRUE, FALSE);
if (SectionObject && SectionObject != InvalidPointer) ObDereferenceObject(SectionObject); @@ -228,6 +287,45 @@ ok(SectionObject != InvalidPointer, "Section object pointer untouched\n"); ok(SectionObject != NULL, "Section object pointer NULL\n"); CheckObject(FileHandle1, PointerCount1, 1L); + CheckSection(SectionObject, 0); + TestMapView(SectionObject, TRUE, FALSE); + + if (SectionObject && SectionObject != InvalidPointer) + ObDereferenceObject(SectionObject); + + /* image section with two different files */ + CheckObject(FileHandle1, PointerCount1, 1L); + SectionObject = InvalidPointer; + MaximumSize.QuadPart = 1; + StartSeh() + Status = MmCreateSection(&SectionObject, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_IMAGE, FileHandle1, FileObject2); + EndSeh(STATUS_SUCCESS); + ok_eq_hex(Status, STATUS_SUCCESS); + ok_eq_longlong(MaximumSize.QuadPart, 1LL); + ok(SectionObject != InvalidPointer, "Section object pointer untouched\n"); + ok(SectionObject != NULL, "Section object pointer NULL\n"); + CheckObject(FileHandle1, PointerCount1, 1L); + CheckObject(FileHandle2, PointerCount2, 1L); + CheckSection(SectionObject, 0); + TestMapView(SectionObject, TRUE, TRUE); + + if (SectionObject && SectionObject != InvalidPointer) + ObDereferenceObject(SectionObject); + + CheckObject(FileHandle1, PointerCount1, 1L); + SectionObject = InvalidPointer; + MaximumSize.QuadPart = 1; + StartSeh() + Status = MmCreateSection(&SectionObject, 0, NULL, &MaximumSize, PAGE_READONLY, SEC_IMAGE, FileHandle2, FileObject1); + EndSeh(STATUS_SUCCESS); + ok_eq_hex(Status, STATUS_SUCCESS); + ok_eq_longlong(MaximumSize.QuadPart, 1LL); + ok(SectionObject != InvalidPointer, "Section object pointer untouched\n"); + ok(SectionObject != NULL, "Section object pointer NULL\n"); + CheckObject(FileHandle1, PointerCount1, 1L); + CheckObject(FileHandle2, PointerCount2, 1L); + CheckSection(SectionObject, 0); + TestMapView(SectionObject, TRUE, FALSE);
if (SectionObject && SectionObject != InvalidPointer) ObDereferenceObject(SectionObject); @@ -244,6 +342,8 @@ ok(SectionObject != InvalidPointer, "Section object pointer untouched\n"); ok(SectionObject != NULL, "Section object pointer NULL\n"); CheckObject(FileHandle1, PointerCount1, 1L); + CheckSection(SectionObject, 0); + TestMapView(SectionObject, TRUE, FALSE);
if (SectionObject && SectionObject != InvalidPointer) ObDereferenceObject(SectionObject); @@ -259,6 +359,8 @@ ok(SectionObject != InvalidPointer, "Section object pointer untouched\n"); ok(SectionObject != NULL, "Section object pointer NULL\n"); CheckObject(FileHandle1, PointerCount1, 1L); + CheckSection(SectionObject, 0); + TestMapView(SectionObject, TRUE, FALSE);
if (SectionObject && SectionObject != InvalidPointer) ObDereferenceObject(SectionObject); @@ -274,6 +376,8 @@ ok(SectionObject != InvalidPointer, "Section object pointer untouched\n"); ok(SectionObject != NULL, "Section object pointer NULL\n"); CheckObject(FileHandle1, PointerCount1, 1L); + CheckSection(SectionObject, 0); + TestMapView(SectionObject, TRUE, FALSE);
if (SectionObject && SectionObject != InvalidPointer) ObDereferenceObject(SectionObject); @@ -294,6 +398,7 @@ LARGE_INTEGER FileOffset; UCHAR FileData = 0;
+ ok(ExGetPreviousMode() == UserMode, "Previous mode is kernel mode\n"); /* create a one-byte file that we can use */ InitializeObjectAttributes(&ObjectAttributes, &FileName1, OBJ_CASE_INSENSITIVE, NULL, NULL); Status = ZwCreateFile(&FileHandle1, GENERIC_ALL, &ObjectAttributes, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_SUPERSEDE, FILE_NON_DIRECTORY_FILE, NULL, 0);