[KMTESTS:MM]
[reactos.git] / rostests / kmtests / ntos_mm / MmMdl.c
index 85dd3fc..b3e8a81 100644 (file)
@@ -19,6 +19,8 @@ TestMmAllocatePagesForMdl(VOID)
     PMDL Mdls[32];
     PVOID SystemVas[32];
     ULONG i;
     PMDL Mdls[32];
     PVOID SystemVas[32];
     ULONG i;
+    PPFN_NUMBER MdlPages;
+    ULONG MdlPageCount;
 
     LowAddress.QuadPart = 0;
     HighAddress.QuadPart = -1;
 
     LowAddress.QuadPart = 0;
     HighAddress.QuadPart = -1;
@@ -34,7 +36,16 @@ 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);
     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);
     MmFreePagesFromMdl(Mdl);
+    ExFreePoolWithTag(Mdl, 0);
 
     /* Now map/unmap it */
     Mdl = MmAllocatePagesForMdl(LowAddress,
 
     /* Now map/unmap it */
     Mdl = MmAllocatePagesForMdl(LowAddress,
@@ -66,6 +77,7 @@ TestMmAllocatePagesForMdl(VOID)
     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);
     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);
+    ExFreePoolWithTag(Mdl, 0);
 
     /* Now map it, and free without unmapping */
     Mdl = MmAllocatePagesForMdl(LowAddress,
 
     /* Now map it, and free without unmapping */
     Mdl = MmAllocatePagesForMdl(LowAddress,
@@ -90,6 +102,7 @@ TestMmAllocatePagesForMdl(VOID)
     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);
     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);
+    ExFreePoolWithTag(Mdl, 0);
 
     /* try to allocate 2 GB -- should succeed but not map */
     Mdl = MmAllocatePagesForMdl(LowAddress,
 
     /* try to allocate 2 GB -- should succeed but not map */
     Mdl = MmAllocatePagesForMdl(LowAddress,
@@ -102,6 +115,17 @@ 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);
         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++)
+        {
+            if (MdlPages[i] == 0 ||
+                MdlPages[i] == (PFN_NUMBER)-1)
+            {
+                ok(0, "MdlPages[%lu] = 0x%I64x\n", i, (ULONGLONG)MdlPages[i]);
+            }
+        }
         SystemVa = MmMapLockedPagesSpecifyCache(Mdl,
                                                 KernelMode,
                                                 MmCached,
         SystemVa = MmMapLockedPagesSpecifyCache(Mdl,
                                                 KernelMode,
                                                 MmCached,
@@ -115,6 +139,7 @@ TestMmAllocatePagesForMdl(VOID)
         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);
         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);
+        ExFreePoolWithTag(Mdl, 0);
     }
 
     /* now allocate and map 32 MB Mdls until we fail */
     }
 
     /* now allocate and map 32 MB Mdls until we fail */
@@ -157,6 +182,7 @@ TestMmAllocatePagesForMdl(VOID)
         if (SystemVas[i] != NULL)
             MmUnmapLockedPages(SystemVas[i], Mdls[i]);
         MmFreePagesFromMdl(Mdls[i]);
         if (SystemVas[i] != NULL)
             MmUnmapLockedPages(SystemVas[i], Mdls[i]);
         MmFreePagesFromMdl(Mdls[i]);
+        ExFreePoolWithTag(Mdls[i], 0);
         if (SystemVas[i] == NULL)
             break;
     }
         if (SystemVas[i] == NULL)
             break;
     }