2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Reserved Mapping test
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
12 #define PTE_BASE 0xC0000000
13 #define MiAddressToPte(x) \
14 ((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + PTE_BASE))
15 #define MiPteToAddress(_Pte) ((PVOID)((ULONG)(_Pte) << 10))
17 #elif defined(_M_AMD64)
20 #define PTE_BASE 0xFFFFF68000000000ULL
23 _MiAddressToPte(PVOID Address
)
25 ULONG64 Offset
= (ULONG64
)Address
>> (PTI_SHIFT
- 3);
26 Offset
&= 0xFFFFFFFFFULL
<< 3;
27 return (PMMPTE
)(PTE_BASE
+ Offset
);
29 #define MiAddressToPte(x) _MiAddressToPte((PVOID)(x))
35 _IRQL_requires_max_ (DISPATCH_LEVEL
)
38 *pMmAllocatePagesForMdlEx
)(
39 _In_ PHYSICAL_ADDRESS LowAddress
,
40 _In_ PHYSICAL_ADDRESS HighAddress
,
41 _In_ PHYSICAL_ADDRESS SkipBytes
,
42 _In_ SIZE_T TotalBytes
,
43 _In_ MEMORY_CACHING_TYPE CacheType
,
49 _In_ PVOID BaseAddress
,
53 _In_ PPFN_NUMBER Pfns
)
56 #if defined(_M_IX86) || defined(_M_AMD64)
60 PointerPte
= MiAddressToPte(BaseAddress
);
61 for (i
= 0; i
< ValidPtes
; i
++)
64 ok(PointerPte
[i
].u
.Hard
.Valid
== 1,
65 "[%lu] PTE %p is not valid\n", i
, &PointerPte
[i
]);
68 ok(PointerPte
[i
].u
.Hard
.PageFrameNumber
== Pfns
[i
],
69 "[%lu] PTE %p has PFN %Ix, expected %Ix\n",
70 i
, &PointerPte
[i
], PointerPte
[i
].u
.Hard
.PageFrameNumber
, Pfns
[i
]);
72 for (; i
< TotalPtes
; i
++)
75 ok_eq_hex(PointerPte
[i
].u
.Long
, 0UL);
78 ok_eq_tag(PointerPte
[-1].u
.Long
, PoolTag
& ~1);
80 ok_eq_ulong(PointerPte
[-2].u
.Long
, (TotalPtes
+ 2) * 2);
94 PHYSICAL_ADDRESS ZeroPhysical
;
95 PHYSICAL_ADDRESS MaxPhysical
;
100 if (skip(pMmAllocatePagesForMdlEx
!= NULL
, "MmAllocatePagesForMdlEx unavailable\n"))
105 ZeroPhysical
.QuadPart
= 0;
106 MaxPhysical
.QuadPart
= 0xffffffffffffffffLL
;
108 /* Create a one-page MDL and map it */
109 Mdl
= pMmAllocatePagesForMdlEx(ZeroPhysical
,
115 if (skip(Mdl
!= NULL
, "No MDL\n"))
120 MdlPages
= (PVOID
)(Mdl
+ 1);
122 BaseAddress
= MmMapLockedPagesWithReservedMapping(Mapping
,
126 ok(BaseAddress
!= NULL
, "MmMapLockedPagesWithReservedMapping failed\n");
127 if (!skip(BaseAddress
!= NULL
, "Failed to map MDL\n"))
129 ok_eq_pointer(BaseAddress
, Mapping
);
131 ok_bool_true(ValidateMapping(BaseAddress
, TotalPtes
, PoolTag
, 1, MdlPages
),
132 "ValidateMapping returned");
135 *(volatile ULONG
*)BaseAddress
= 0x01234567;
136 KmtEndSeh(STATUS_SUCCESS
);
138 MmUnmapReservedMapping(BaseAddress
,
142 ok_bool_true(ValidateMapping(Mapping
, TotalPtes
, PoolTag
, 0, NULL
),
143 "ValidateMapping returned");
146 /* Try again but at an unaligned address */
147 BaseAddress
= MmMapLockedPagesWithReservedMapping((PUCHAR
)Mapping
+ sizeof(ULONG
),
151 ok(BaseAddress
!= NULL
, "MmMapLockedPagesWithReservedMapping failed\n");
152 if (!skip(BaseAddress
!= NULL
, "Failed to map MDL\n"))
154 ok_eq_pointer(BaseAddress
, (PUCHAR
)Mapping
+ sizeof(ULONG
));
156 ok_bool_true(ValidateMapping(BaseAddress
, TotalPtes
, PoolTag
, 1, MdlPages
),
157 "ValidateMapping returned");
160 *(volatile ULONG
*)BaseAddress
= 0x01234567;
161 KmtEndSeh(STATUS_SUCCESS
);
163 MmUnmapReservedMapping(BaseAddress
,
167 ok_bool_true(ValidateMapping(Mapping
, TotalPtes
, PoolTag
, 0, NULL
),
168 "ValidateMapping returned");
171 MmFreePagesFromMdl(Mdl
);
174 Mdl
= pMmAllocatePagesForMdlEx(ZeroPhysical
,
177 TotalPtes
* PAGE_SIZE
,
180 if (skip(Mdl
!= NULL
, "No MDL\n"))
185 MdlPages
= (PVOID
)(Mdl
+ 1);
187 BaseAddress
= MmMapLockedPagesWithReservedMapping(Mapping
,
191 ok(BaseAddress
!= NULL
, "MmMapLockedPagesWithReservedMapping failed\n");
192 if (!skip(BaseAddress
!= NULL
, "Failed to map MDL\n"))
194 ok_eq_pointer(BaseAddress
, Mapping
);
196 ok_bool_true(ValidateMapping(BaseAddress
, TotalPtes
, PoolTag
, TotalPtes
, MdlPages
),
197 "ValidateMapping returned");
199 for (i
= 0; i
< TotalPtes
; i
++)
202 *((volatile ULONG
*)BaseAddress
+ i
* PAGE_SIZE
/ sizeof(ULONG
)) = 0x01234567;
203 KmtEndSeh(STATUS_SUCCESS
);
206 MmUnmapReservedMapping(BaseAddress
,
210 ok_bool_true(ValidateMapping(Mapping
, TotalPtes
, PoolTag
, 0, NULL
),
211 "ValidateMapping returned");
214 MmFreePagesFromMdl(Mdl
);
216 /* Try to map more pages than we reserved */
217 Mdl
= pMmAllocatePagesForMdlEx(ZeroPhysical
,
220 (TotalPtes
+ 1) * PAGE_SIZE
,
223 if (skip(Mdl
!= NULL
, "No MDL\n"))
228 BaseAddress
= MmMapLockedPagesWithReservedMapping(Mapping
,
232 ok_eq_pointer(BaseAddress
, NULL
);
235 MmUnmapReservedMapping(BaseAddress
,
240 MmFreePagesFromMdl(Mdl
);
243 START_TEST(MmReservedMapping
)
247 pMmAllocatePagesForMdlEx
= KmtGetSystemRoutineAddress(L
"MmAllocatePagesForMdlEx");
249 /* one byte - single page */
250 Mapping
= MmAllocateMappingAddress(1, 'MRmK');
251 ok(Mapping
!= NULL
, "MmAllocateMappingAddress failed\n");
252 if (!skip(Mapping
!= NULL
, "No mapping\n"))
254 ok_bool_true(ValidateMapping(Mapping
, 1, 'MRmK', 0, NULL
),
255 "ValidateMapping returned");
257 MmFreeMappingAddress(Mapping
, 'MRmK');
261 Mapping
= MmAllocateMappingAddress(10 * PAGE_SIZE
, 'MRmK' & ~1);
262 ok(Mapping
!= NULL
, "MmAllocateMappingAddress failed\n");
263 if (!skip(Mapping
!= NULL
, "No mapping\n"))
265 ok_bool_true(ValidateMapping(Mapping
, 10, 'MRmK', 0, NULL
),
266 "ValidateMapping returned");
268 /* PAGE_FAULT_IN_NONPAGED_AREA can't be caught with SEH */
271 (void)*(volatile UCHAR
*)Mapping
;
274 TestMap(Mapping
, 10, 'MRmK');
276 MmFreeMappingAddress(Mapping
, 'MRmK');
280 Mapping
= MmAllocateMappingAddress(1, 0);
281 ok(Mapping
== NULL
, "MmAllocateMappingAddress failed\n");
284 MmFreeMappingAddress(Mapping
, 0);
288 Mapping
= MmAllocateMappingAddress(1, 1);
289 ok(Mapping
!= NULL
, "MmAllocateMappingAddress failed\n");
292 ok_bool_true(ValidateMapping(Mapping
, 1, 1, 0, NULL
),
293 "ValidateMapping returned");
295 TestMap(Mapping
, 1, 1);
297 MmFreeMappingAddress(Mapping
, 1);
300 /* Free an unaligned address */
301 Mapping
= MmAllocateMappingAddress(PAGE_SIZE
, 'MRmK');
302 ok(Mapping
!= NULL
, "MmAllocateMappingAddress failed\n");
305 ok_bool_true(ValidateMapping(Mapping
, 1, 'MRmK', 0, NULL
),
306 "ValidateMapping returned");
308 TestMap(Mapping
, 1, 'MRmK');
310 MmFreeMappingAddress((PUCHAR
)Mapping
+ sizeof(ULONG
), 'MRmK');