From: Thomas Faber Date: Fri, 26 Jun 2015 07:31:01 +0000 (+0000) Subject: [KMTESTS:MM] X-Git-Tag: ReactOS-0.4.0~1716 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=eb33bb164dc48730b5bbe6da5488f87479ee9156 [KMTESTS:MM] - Add a test for MmAllocatePagesForMdl svn path=/trunk/; revision=68271 --- diff --git a/rostests/kmtests/CMakeLists.txt b/rostests/kmtests/CMakeLists.txt index 7053d90b771..02c6b231793 100644 --- a/rostests/kmtests/CMakeLists.txt +++ b/rostests/kmtests/CMakeLists.txt @@ -64,6 +64,7 @@ list(APPEND KMTEST_DRV_SOURCE ntos_ke/KeProcessor.c ntos_ke/KeSpinLock.c ntos_ke/KeTimer.c + ntos_mm/MmMdl.c ntos_mm/MmSection.c ntos_mm/ZwAllocateVirtualMemory.c ntos_mm/ZwCreateSection.c diff --git a/rostests/kmtests/kmtest_drv/testlist.c b/rostests/kmtests/kmtest_drv/testlist.c index aac1ced6885..23fc3fb9a25 100644 --- a/rostests/kmtests/kmtest_drv/testlist.c +++ b/rostests/kmtests/kmtest_drv/testlist.c @@ -39,6 +39,7 @@ KMT_TESTFUNC Test_KeProcessor; KMT_TESTFUNC Test_KeSpinLock; KMT_TESTFUNC Test_KeTimer; KMT_TESTFUNC Test_KernelType; +KMT_TESTFUNC Test_MmMdl; KMT_TESTFUNC Test_MmSection; KMT_TESTFUNC Test_NpfsConnect; KMT_TESTFUNC Test_NpfsCreate; @@ -98,6 +99,7 @@ const KMT_TEST TestList[] = { "KeSpinLock", Test_KeSpinLock }, { "KeTimer", Test_KeTimer }, { "-KernelType", Test_KernelType }, + { "MmMdl", Test_MmMdl }, { "MmSection", Test_MmSection }, { "NpfsConnect", Test_NpfsConnect }, { "NpfsCreate", Test_NpfsCreate }, diff --git a/rostests/kmtests/ntos_mm/MmMdl.c b/rostests/kmtests/ntos_mm/MmMdl.c new file mode 100644 index 00000000000..85dd3fc501d --- /dev/null +++ b/rostests/kmtests/ntos_mm/MmMdl.c @@ -0,0 +1,168 @@ +/* + * PROJECT: ReactOS kernel-mode tests + * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory + * PURPOSE: Kernel-Mode Test Suite MDL test + * PROGRAMMER: Thomas Faber + */ + +#include + +static +VOID +TestMmAllocatePagesForMdl(VOID) +{ + PMDL Mdl; + PHYSICAL_ADDRESS LowAddress; + PHYSICAL_ADDRESS HighAddress; + PHYSICAL_ADDRESS SkipBytes; + PVOID SystemVa; + PMDL Mdls[32]; + PVOID SystemVas[32]; + ULONG i; + + LowAddress.QuadPart = 0; + HighAddress.QuadPart = -1; + SkipBytes.QuadPart = 0; + /* simple allocate/free */ + Mdl = MmAllocatePagesForMdl(LowAddress, + HighAddress, + SkipBytes, + 2 * 1024 * 1024); + ok(Mdl != NULL, "MmAllocatePagesForMdl failed\n"); + if (skip(Mdl != NULL, "No Mdl\n")) + return; + 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); + MmFreePagesFromMdl(Mdl); + + /* Now map/unmap it */ + Mdl = MmAllocatePagesForMdl(LowAddress, + HighAddress, + SkipBytes, + 2 * 1024 * 1024); + ok(Mdl != NULL, "MmAllocatePagesForMdl failed\n"); + if (skip(Mdl != NULL, "No Mdl\n")) + return; + 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); + SystemVa = MmMapLockedPagesSpecifyCache(Mdl, + KernelMode, + MmCached, + NULL, + FALSE, + NormalPagePriority); + ok(SystemVa != NULL, "MmMapLockedPagesSpecifyCache failed\n"); + if (!skip(SystemVa != NULL, "No system VA\n")) + { + ok(MmGetMdlByteCount(Mdl) == 2 * 1024 * 1024, "Byte count: %lu\n", MmGetMdlByteCount(Mdl)); + ok(MmGetMdlVirtualAddress(Mdl) == NULL, "Virtual address: %p, System VA: %p\n", MmGetMdlVirtualAddress(Mdl), SystemVa); + ok(Mdl->MappedSystemVa == SystemVa, "MappedSystemVa: %p, System VA: %p\n", Mdl->MappedSystemVa, SystemVa); + ok((Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA), "MdlFlags: %lx\n", Mdl->MdlFlags); + MmUnmapLockedPages(SystemVa, Mdl); + } + 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); + MmFreePagesFromMdl(Mdl); + + /* Now map it, and free without unmapping */ + Mdl = MmAllocatePagesForMdl(LowAddress, + HighAddress, + SkipBytes, + 2 * 1024 * 1024); + ok(Mdl != NULL, "MmAllocatePagesForMdl failed\n"); + if (skip(Mdl != NULL, "No Mdl\n")) + return; + 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); + SystemVa = MmMapLockedPagesSpecifyCache(Mdl, + KernelMode, + MmCached, + NULL, + FALSE, + NormalPagePriority); + ok(SystemVa != NULL, "MmMapLockedPagesSpecifyCache failed\n"); + ok(MmGetMdlByteCount(Mdl) == 2 * 1024 * 1024, "Byte count: %lu\n", MmGetMdlByteCount(Mdl)); + ok(MmGetMdlVirtualAddress(Mdl) == NULL, "Virtual address: %p, System VA: %p\n", MmGetMdlVirtualAddress(Mdl), SystemVa); + ok(Mdl->MappedSystemVa == SystemVa, "MappedSystemVa: %p, System VA: %p\n", Mdl->MappedSystemVa, SystemVa); + ok((Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA), "MdlFlags: %lx\n", Mdl->MdlFlags); + MmFreePagesFromMdl(Mdl); + + /* try to allocate 2 GB -- should succeed but not map */ + Mdl = MmAllocatePagesForMdl(LowAddress, + HighAddress, + SkipBytes, + 2UL * 1024 * 1024 * 1024); + ok(Mdl != NULL, "MmAllocatePagesForMdl failed for 2 GB\n"); + if (Mdl != NULL) + { + 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); + SystemVa = MmMapLockedPagesSpecifyCache(Mdl, + KernelMode, + MmCached, + NULL, + FALSE, + NormalPagePriority); + ok(SystemVa == NULL, "MmMapLockedPagesSpecifyCache succeeded for 2 GB\n"); + if (SystemVa != NULL) + MmUnmapLockedPages(SystemVa, Mdl); + 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); + MmFreePagesFromMdl(Mdl); + } + + /* now allocate and map 32 MB Mdls until we fail */ + for (i = 0; i < sizeof(Mdls) / sizeof(Mdls[0]); i++) + { + Mdls[i] = MmAllocatePagesForMdl(LowAddress, + HighAddress, + SkipBytes, + 32 * 1024 * 1024); + if (Mdls[i] == NULL) + { + trace("MmAllocatePagesForMdl failed with i = %lu\n", i); + break; + } + ok(MmGetMdlVirtualAddress(Mdls[i]) == NULL, "Virtual address: %p\n", MmGetMdlVirtualAddress(Mdls[i])); + ok(!(Mdls[i]->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA), "MdlFlags: %lx\n", Mdls[i]->MdlFlags); + SystemVas[i] = MmMapLockedPagesSpecifyCache(Mdls[i], + KernelMode, + MmCached, + NULL, + FALSE, + NormalPagePriority); + if (SystemVas[i] == NULL) + { + ok(MmGetMdlByteCount(Mdls[i]) <= 32 * 1024 * 1024, "Byte count: %lu\n", MmGetMdlByteCount(Mdls[i])); + ok(MmGetMdlVirtualAddress(Mdls[i]) == NULL, "Virtual address: %p\n", MmGetMdlVirtualAddress(Mdls[i])); + ok(!(Mdls[i]->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA), "MdlFlags: %lx\n", Mdls[i]->MdlFlags); + trace("MmMapLockedPagesSpecifyCache failed with i = %lu\n", i); + break; + } + ok(MmGetMdlByteCount(Mdls[i]) == 32 * 1024 * 1024, "Byte count: %lu\n", MmGetMdlByteCount(Mdls[i])); + ok(MmGetMdlVirtualAddress(Mdls[i]) == NULL, "Virtual address: %p, System VA: %p\n", MmGetMdlVirtualAddress(Mdls[i]), SystemVas[i]); + ok(Mdls[i]->MappedSystemVa == SystemVas[i], "MappedSystemVa: %p\n", Mdls[i]->MappedSystemVa, SystemVas[i]); + ok((Mdls[i]->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA), "MdlFlags: %lx\n", Mdls[i]->MdlFlags); + } + for (i = 0; i < sizeof(Mdls) / sizeof(Mdls[0]); i++) + { + if (Mdls[i] == NULL) + break; + if (SystemVas[i] != NULL) + MmUnmapLockedPages(SystemVas[i], Mdls[i]); + MmFreePagesFromMdl(Mdls[i]); + if (SystemVas[i] == NULL) + break; + } +} + +START_TEST(MmMdl) +{ + TestMmAllocatePagesForMdl(); +}