PMDL Mdls[32];
PVOID SystemVas[32];
ULONG i;
+ PPFN_NUMBER MdlPages;
+ ULONG MdlPageCount;
LowAddress.QuadPart = 0;
HighAddress.QuadPart = -1;
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);
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,
ValidateMapping(
_In_ PVOID BaseAddress,
_In_ ULONG TotalPtes,
+ _In_ ULONG PoolTag,
_In_ ULONG ValidPtes,
_In_ PPFN_NUMBER Pfns)
{
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
static
VOID
TestMap(
- _In_ PVOID Mapping)
+ _In_ PVOID Mapping,
+ _In_ ULONG TotalPtes,
+ _In_ ULONG PoolTag)
{
PMDL Mdl;
PHYSICAL_ADDRESS ZeroPhysical;
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()
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");
}
Mdl = MmAllocatePagesForMdlEx(ZeroPhysical,
MaxPhysical,
ZeroPhysical,
- 10 * PAGE_SIZE,
+ TotalPtes * PAGE_SIZE,
MmCached,
0);
if (skip(Mdl != NULL, "No MDL\n"))
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;
}
MmUnmapReservedMapping(BaseAddress,
- 'MRmK',
+ PoolTag,
Mdl);
- ok_bool_true(ValidateMapping(Mapping, 10, 0, NULL),
+ ok_bool_true(ValidateMapping(Mapping, TotalPtes, PoolTag, 0, NULL),
"ValidateMapping returned");
}
Mdl = MmAllocatePagesForMdlEx(ZeroPhysical,
MaxPhysical,
ZeroPhysical,
- 11 * PAGE_SIZE,
+ (TotalPtes + 1) * PAGE_SIZE,
MmCached,
0);
if (skip(Mdl != NULL, "No MDL\n"))
}
BaseAddress = MmMapLockedPagesWithReservedMapping(Mapping,
- 'MRmK',
+ PoolTag,
Mdl,
MmCached);
ok_eq_pointer(BaseAddress, NULL);
if (BaseAddress)
{
MmUnmapReservedMapping(BaseAddress,
- 'MRmK',
+ PoolTag,
Mdl);
}
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');
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 */
(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');
+ }
}