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))
36 _In_ PVOID BaseAddress
,
40 _In_ PPFN_NUMBER Pfns
)
43 #if defined(_M_IX86) || defined(_M_AMD64)
47 PointerPte
= MiAddressToPte(BaseAddress
);
48 for (i
= 0; i
< ValidPtes
; i
++)
51 ok(PointerPte
[i
].u
.Hard
.Valid
== 1,
52 "[%lu] PTE %p is not valid\n", i
, &PointerPte
[i
]);
55 ok(PointerPte
[i
].u
.Hard
.PageFrameNumber
== Pfns
[i
],
56 "[%lu] PTE %p has PFN %Ix, expected %Ix\n",
57 i
, &PointerPte
[i
], PointerPte
[i
].u
.Hard
.PageFrameNumber
, Pfns
[i
]);
59 for (; i
< TotalPtes
; i
++)
62 ok_eq_hex(PointerPte
[i
].u
.Long
, 0UL);
65 ok_eq_tag(PointerPte
[-1].u
.Long
, PoolTag
& ~1);
67 ok_eq_ulong(PointerPte
[-2].u
.Long
, (TotalPtes
+ 2) * 2);
81 PHYSICAL_ADDRESS ZeroPhysical
;
82 PHYSICAL_ADDRESS MaxPhysical
;
87 ZeroPhysical
.QuadPart
= 0;
88 MaxPhysical
.QuadPart
= 0xffffffffffffffffLL
;
90 /* Create a one-page MDL and map it */
91 Mdl
= MmAllocatePagesForMdlEx(ZeroPhysical
,
97 if (skip(Mdl
!= NULL
, "No MDL\n"))
102 MdlPages
= (PVOID
)(Mdl
+ 1);
104 BaseAddress
= MmMapLockedPagesWithReservedMapping(Mapping
,
108 ok(BaseAddress
!= NULL
, "MmMapLockedPagesWithReservedMapping failed\n");
109 if (!skip(BaseAddress
!= NULL
, "Failed to map MDL\n"))
111 ok_eq_pointer(BaseAddress
, Mapping
);
113 ok_bool_true(ValidateMapping(BaseAddress
, TotalPtes
, PoolTag
, 1, MdlPages
),
114 "ValidateMapping returned");
117 *(volatile ULONG
*)BaseAddress
= 0x01234567;
118 KmtEndSeh(STATUS_SUCCESS
);
120 MmUnmapReservedMapping(BaseAddress
,
124 ok_bool_true(ValidateMapping(Mapping
, TotalPtes
, PoolTag
, 0, NULL
),
125 "ValidateMapping returned");
128 /* Try again but at an unaligned address */
129 BaseAddress
= MmMapLockedPagesWithReservedMapping((PUCHAR
)Mapping
+ sizeof(ULONG
),
133 ok(BaseAddress
!= NULL
, "MmMapLockedPagesWithReservedMapping failed\n");
134 if (!skip(BaseAddress
!= NULL
, "Failed to map MDL\n"))
136 ok_eq_pointer(BaseAddress
, (PUCHAR
)Mapping
+ sizeof(ULONG
));
138 ok_bool_true(ValidateMapping(BaseAddress
, TotalPtes
, PoolTag
, 1, MdlPages
),
139 "ValidateMapping returned");
142 *(volatile ULONG
*)BaseAddress
= 0x01234567;
143 KmtEndSeh(STATUS_SUCCESS
);
145 MmUnmapReservedMapping(BaseAddress
,
149 ok_bool_true(ValidateMapping(Mapping
, TotalPtes
, PoolTag
, 0, NULL
),
150 "ValidateMapping returned");
153 MmFreePagesFromMdl(Mdl
);
156 Mdl
= MmAllocatePagesForMdlEx(ZeroPhysical
,
159 TotalPtes
* PAGE_SIZE
,
162 if (skip(Mdl
!= NULL
, "No MDL\n"))
167 MdlPages
= (PVOID
)(Mdl
+ 1);
169 BaseAddress
= MmMapLockedPagesWithReservedMapping(Mapping
,
173 ok(BaseAddress
!= NULL
, "MmMapLockedPagesWithReservedMapping failed\n");
174 if (!skip(BaseAddress
!= NULL
, "Failed to map MDL\n"))
176 ok_eq_pointer(BaseAddress
, Mapping
);
178 ok_bool_true(ValidateMapping(BaseAddress
, TotalPtes
, PoolTag
, TotalPtes
, MdlPages
),
179 "ValidateMapping returned");
181 for (i
= 0; i
< TotalPtes
; i
++)
184 *((volatile ULONG
*)BaseAddress
+ i
* PAGE_SIZE
/ sizeof(ULONG
)) = 0x01234567;
185 KmtEndSeh(STATUS_SUCCESS
);
188 MmUnmapReservedMapping(BaseAddress
,
192 ok_bool_true(ValidateMapping(Mapping
, TotalPtes
, PoolTag
, 0, NULL
),
193 "ValidateMapping returned");
196 MmFreePagesFromMdl(Mdl
);
198 /* Try to map more pages than we reserved */
199 Mdl
= MmAllocatePagesForMdlEx(ZeroPhysical
,
202 (TotalPtes
+ 1) * PAGE_SIZE
,
205 if (skip(Mdl
!= NULL
, "No MDL\n"))
210 BaseAddress
= MmMapLockedPagesWithReservedMapping(Mapping
,
214 ok_eq_pointer(BaseAddress
, NULL
);
217 MmUnmapReservedMapping(BaseAddress
,
222 MmFreePagesFromMdl(Mdl
);
225 START_TEST(MmReservedMapping
)
229 /* one byte - single page */
230 Mapping
= MmAllocateMappingAddress(1, 'MRmK');
231 ok(Mapping
!= NULL
, "MmAllocateMappingAddress failed\n");
232 if (!skip(Mapping
!= NULL
, "No mapping\n"))
234 ok_bool_true(ValidateMapping(Mapping
, 1, 'MRmK', 0, NULL
),
235 "ValidateMapping returned");
237 MmFreeMappingAddress(Mapping
, 'MRmK');
241 Mapping
= MmAllocateMappingAddress(10 * PAGE_SIZE
, 'MRmK' & ~1);
242 ok(Mapping
!= NULL
, "MmAllocateMappingAddress failed\n");
243 if (!skip(Mapping
!= NULL
, "No mapping\n"))
245 ok_bool_true(ValidateMapping(Mapping
, 10, 'MRmK', 0, NULL
),
246 "ValidateMapping returned");
248 /* PAGE_FAULT_IN_NONPAGED_AREA can't be caught with SEH */
251 (void)*(volatile UCHAR
*)Mapping
;
254 TestMap(Mapping
, 10, 'MRmK');
256 MmFreeMappingAddress(Mapping
, 'MRmK');
260 Mapping
= MmAllocateMappingAddress(1, 0);
261 ok(Mapping
== NULL
, "MmAllocateMappingAddress failed\n");
264 MmFreeMappingAddress(Mapping
, 0);
268 Mapping
= MmAllocateMappingAddress(1, 1);
269 ok(Mapping
!= NULL
, "MmAllocateMappingAddress failed\n");
272 ok_bool_true(ValidateMapping(Mapping
, 1, 1, 0, NULL
),
273 "ValidateMapping returned");
275 TestMap(Mapping
, 1, 1);
277 MmFreeMappingAddress(Mapping
, 1);
280 /* Free an unaligned address */
281 Mapping
= MmAllocateMappingAddress(PAGE_SIZE
, 'MRmK');
282 ok(Mapping
!= NULL
, "MmAllocateMappingAddress failed\n");
285 ok_bool_true(ValidateMapping(Mapping
, 1, 'MRmK', 0, NULL
),
286 "ValidateMapping returned");
288 TestMap(Mapping
, 1, 'MRmK');
290 MmFreeMappingAddress((PUCHAR
)Mapping
+ sizeof(ULONG
), 'MRmK');