From: Thomas Faber Date: Thu, 10 Sep 2015 11:16:53 +0000 (+0000) Subject: [KMTESTS:MM] X-Git-Tag: ReactOS-0.4.0~878 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=317b564ba046551b61e5307fb6eb56eda38baaa5 [KMTESTS:MM] - Add some more reserved mapping tests for special pool tags and unaligned addresses - Validate MDL pages in MmMdl test svn path=/trunk/; revision=69169 --- diff --git a/rostests/kmtests/ntos_mm/MmMdl.c b/rostests/kmtests/ntos_mm/MmMdl.c index 986a17a6023..7afd4a62ce2 100644 --- a/rostests/kmtests/ntos_mm/MmMdl.c +++ b/rostests/kmtests/ntos_mm/MmMdl.c @@ -19,6 +19,8 @@ TestMmAllocatePagesForMdl(VOID) PMDL Mdls[32]; PVOID SystemVas[32]; ULONG i; + PPFN_NUMBER MdlPages; + ULONG MdlPageCount; LowAddress.QuadPart = 0; HighAddress.QuadPart = -1; @@ -34,6 +36,14 @@ TestMmAllocatePagesForMdl(VOID) ok(MmGetMdlByteCount(Mdl) == 2 * 1024 * 1024, "Byte count: %lu\n", MmGetMdlByteCount(Mdl)); ok(MmGetMdlVirtualAddress(Mdl) == NULL, "Virtual address: %p\n", MmGetMdlVirtualAddress(Mdl)); ok(!(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA), "MdlFlags: %lx\n", Mdl->MdlFlags); + MdlPages = MmGetMdlPfnArray(Mdl); + MdlPageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(Mdl), MmGetMdlByteCount(Mdl)); + ok(MdlPageCount == 2 * 1024 * 1024 / PAGE_SIZE, "MdlPageCount = %lu\n", MdlPageCount); + for (i = 0; i < MdlPageCount; i++) + { + ok(MdlPages[i] != 0 && MdlPages[i] != (PFN_NUMBER)-1, + "MdlPages[%lu] = 0x%I64x\n", i, (ULONGLONG)MdlPages[i]); + } MmFreePagesFromMdl(Mdl); ExFreePoolWithTag(Mdl, 0); @@ -105,6 +115,14 @@ TestMmAllocatePagesForMdl(VOID) ok(MmGetMdlByteCount(Mdl) != 2UL * 1024 * 1024 * 1024, "Byte count: %lu\n", MmGetMdlByteCount(Mdl)); ok(MmGetMdlVirtualAddress(Mdl) == NULL, "Virtual address: %p\n", MmGetMdlVirtualAddress(Mdl)); ok(!(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA), "MdlFlags: %lx\n", Mdl->MdlFlags); + MdlPages = MmGetMdlPfnArray(Mdl); + MdlPageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(Mdl), MmGetMdlByteCount(Mdl)); + ok(MdlPageCount < 2UL * 1024 * 1024 * 1024 / PAGE_SIZE, "MdlPageCount = %lu\n", MdlPageCount); + for (i = 0; i < MdlPageCount; i++) + { + ok(MdlPages[i] != 0 && MdlPages[i] != (PFN_NUMBER)-1, + "MdlPages[%lu] = 0x%I64x\n", i, (ULONGLONG)MdlPages[i]); + } SystemVa = MmMapLockedPagesSpecifyCache(Mdl, KernelMode, MmCached, diff --git a/rostests/kmtests/ntos_mm/MmReservedMapping.c b/rostests/kmtests/ntos_mm/MmReservedMapping.c index 2e437f23930..8a0dbdb7f3d 100644 --- a/rostests/kmtests/ntos_mm/MmReservedMapping.c +++ b/rostests/kmtests/ntos_mm/MmReservedMapping.c @@ -35,6 +35,7 @@ BOOLEAN ValidateMapping( _In_ PVOID BaseAddress, _In_ ULONG TotalPtes, + _In_ ULONG PoolTag, _In_ ULONG ValidPtes, _In_ PPFN_NUMBER Pfns) { @@ -61,7 +62,7 @@ ValidateMapping( ok_eq_hex(PointerPte[i].u.Long, 0UL); } Valid = Valid && - ok_eq_tag(PointerPte[-1].u.Long, 'MRmK' & ~1); + ok_eq_tag(PointerPte[-1].u.Long, PoolTag & ~1); Valid = Valid && ok_eq_ulong(PointerPte[-2].u.Long, (TotalPtes + 2) * 2); #endif @@ -72,7 +73,9 @@ ValidateMapping( static VOID TestMap( - _In_ PVOID Mapping) + _In_ PVOID Mapping, + _In_ ULONG TotalPtes, + _In_ ULONG PoolTag) { PMDL Mdl; PHYSICAL_ADDRESS ZeroPhysical; @@ -99,14 +102,40 @@ TestMap( MdlPages = (PVOID)(Mdl + 1); BaseAddress = MmMapLockedPagesWithReservedMapping(Mapping, - 'MRmK', + PoolTag, Mdl, MmCached); - if (BaseAddress) + ok(BaseAddress != NULL, "MmMapLockedPagesWithReservedMapping failed\n"); + if (!skip(BaseAddress != NULL, "Failed to map MDL\n")) { ok_eq_pointer(BaseAddress, Mapping); - ok_bool_true(ValidateMapping(BaseAddress, 10, 1, MdlPages), + ok_bool_true(ValidateMapping(BaseAddress, TotalPtes, PoolTag, 1, MdlPages), + "ValidateMapping returned"); + + KmtStartSeh() + *(volatile ULONG *)BaseAddress = 0x01234567; + KmtEndSeh(STATUS_SUCCESS); + + MmUnmapReservedMapping(BaseAddress, + PoolTag, + Mdl); + + ok_bool_true(ValidateMapping(Mapping, TotalPtes, PoolTag, 0, NULL), + "ValidateMapping returned"); + } + + /* Try again but at an unaligned address */ + BaseAddress = MmMapLockedPagesWithReservedMapping((PUCHAR)Mapping + sizeof(ULONG), + PoolTag, + Mdl, + MmCached); + ok(BaseAddress != NULL, "MmMapLockedPagesWithReservedMapping failed\n"); + if (!skip(BaseAddress != NULL, "Failed to map MDL\n")) + { + ok_eq_pointer(BaseAddress, (PUCHAR)Mapping + sizeof(ULONG)); + + ok_bool_true(ValidateMapping(BaseAddress, TotalPtes, PoolTag, 1, MdlPages), "ValidateMapping returned"); KmtStartSeh() @@ -114,10 +143,10 @@ TestMap( KmtEndSeh(STATUS_SUCCESS); MmUnmapReservedMapping(BaseAddress, - 'MRmK', + PoolTag, Mdl); - ok_bool_true(ValidateMapping(Mapping, 10, 0, NULL), + ok_bool_true(ValidateMapping(Mapping, TotalPtes, PoolTag, 0, NULL), "ValidateMapping returned"); } @@ -127,7 +156,7 @@ TestMap( Mdl = MmAllocatePagesForMdlEx(ZeroPhysical, MaxPhysical, ZeroPhysical, - 10 * PAGE_SIZE, + TotalPtes * PAGE_SIZE, MmCached, 0); if (skip(Mdl != NULL, "No MDL\n")) @@ -138,17 +167,18 @@ TestMap( MdlPages = (PVOID)(Mdl + 1); BaseAddress = MmMapLockedPagesWithReservedMapping(Mapping, - 'MRmK', + PoolTag, Mdl, MmCached); - if (BaseAddress) + ok(BaseAddress != NULL, "MmMapLockedPagesWithReservedMapping failed\n"); + if (!skip(BaseAddress != NULL, "Failed to map MDL\n")) { ok_eq_pointer(BaseAddress, Mapping); - ok_bool_true(ValidateMapping(BaseAddress, 10, 10, MdlPages), + ok_bool_true(ValidateMapping(BaseAddress, TotalPtes, PoolTag, TotalPtes, MdlPages), "ValidateMapping returned"); - for (i = 0; i < 10; i++) + for (i = 0; i < TotalPtes; i++) { KmtStartSeh() *((volatile ULONG *)BaseAddress + i * PAGE_SIZE / sizeof(ULONG)) = 0x01234567; @@ -156,10 +186,10 @@ TestMap( } MmUnmapReservedMapping(BaseAddress, - 'MRmK', + PoolTag, Mdl); - ok_bool_true(ValidateMapping(Mapping, 10, 0, NULL), + ok_bool_true(ValidateMapping(Mapping, TotalPtes, PoolTag, 0, NULL), "ValidateMapping returned"); } @@ -169,7 +199,7 @@ TestMap( Mdl = MmAllocatePagesForMdlEx(ZeroPhysical, MaxPhysical, ZeroPhysical, - 11 * PAGE_SIZE, + (TotalPtes + 1) * PAGE_SIZE, MmCached, 0); if (skip(Mdl != NULL, "No MDL\n")) @@ -178,14 +208,14 @@ TestMap( } BaseAddress = MmMapLockedPagesWithReservedMapping(Mapping, - 'MRmK', + PoolTag, Mdl, MmCached); ok_eq_pointer(BaseAddress, NULL); if (BaseAddress) { MmUnmapReservedMapping(BaseAddress, - 'MRmK', + PoolTag, Mdl); } @@ -201,7 +231,7 @@ START_TEST(MmReservedMapping) ok(Mapping != NULL, "MmAllocateMappingAddress failed\n"); if (!skip(Mapping != NULL, "No mapping\n")) { - ok_bool_true(ValidateMapping(Mapping, 1, 0, NULL), + ok_bool_true(ValidateMapping(Mapping, 1, 'MRmK', 0, NULL), "ValidateMapping returned"); MmFreeMappingAddress(Mapping, 'MRmK'); @@ -212,7 +242,7 @@ START_TEST(MmReservedMapping) ok(Mapping != NULL, "MmAllocateMappingAddress failed\n"); if (!skip(Mapping != NULL, "No mapping\n")) { - ok_bool_true(ValidateMapping(Mapping, 10, 0, NULL), + ok_bool_true(ValidateMapping(Mapping, 10, 'MRmK', 0, NULL), "ValidateMapping returned"); /* PAGE_FAULT_IN_NONPAGED_AREA can't be caught with SEH */ @@ -221,8 +251,42 @@ START_TEST(MmReservedMapping) (void)*(volatile UCHAR *)Mapping; } - TestMap(Mapping); + TestMap(Mapping, 10, 'MRmK'); MmFreeMappingAddress(Mapping, 'MRmK'); } + + /* PoolTag = 0 */ + Mapping = MmAllocateMappingAddress(1, 0); + ok(Mapping == NULL, "MmAllocateMappingAddress failed\n"); + if (Mapping != NULL) + { + MmFreeMappingAddress(Mapping, 0); + } + + /* PoolTag = 1 */ + Mapping = MmAllocateMappingAddress(1, 1); + ok(Mapping != NULL, "MmAllocateMappingAddress failed\n"); + if (Mapping != NULL) + { + ok_bool_true(ValidateMapping(Mapping, 1, 1, 0, NULL), + "ValidateMapping returned"); + + TestMap(Mapping, 1, 1); + + MmFreeMappingAddress(Mapping, 1); + } + + /* Free an unaligned address */ + Mapping = MmAllocateMappingAddress(PAGE_SIZE, 'MRmK'); + ok(Mapping != NULL, "MmAllocateMappingAddress failed\n"); + if (Mapping != NULL) + { + ok_bool_true(ValidateMapping(Mapping, 1, 'MRmK', 0, NULL), + "ValidateMapping returned"); + + TestMap(Mapping, 1, 'MRmK'); + + MmFreeMappingAddress((PUCHAR)Mapping + sizeof(ULONG), 'MRmK'); + } }