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
,
39 _In_ PPFN_NUMBER Pfns
)
42 #if defined(_M_IX86) || defined(_M_AMD64)
46 PointerPte
= MiAddressToPte(BaseAddress
);
47 for (i
= 0; i
< ValidPtes
; i
++)
50 ok(PointerPte
[i
].u
.Hard
.Valid
== 1,
51 "[%lu] PTE %p is not valid\n", i
, &PointerPte
[i
]);
54 ok(PointerPte
[i
].u
.Hard
.PageFrameNumber
== Pfns
[i
],
55 "[%lu] PTE %p has PFN %Ix, expected %Ix\n",
56 i
, &PointerPte
[i
], PointerPte
[i
].u
.Hard
.PageFrameNumber
, Pfns
[i
]);
58 for (; i
< TotalPtes
; i
++)
61 ok_eq_hex(PointerPte
[i
].u
.Long
, 0UL);
64 ok_eq_tag(PointerPte
[-1].u
.Long
, 'MRmK' & ~1);
66 ok_eq_ulong(PointerPte
[-2].u
.Long
, (TotalPtes
+ 2) * 2);
78 PHYSICAL_ADDRESS ZeroPhysical
;
79 PHYSICAL_ADDRESS MaxPhysical
;
84 ZeroPhysical
.QuadPart
= 0;
85 MaxPhysical
.QuadPart
= 0xffffffffffffffffLL
;
87 /* Create a one-page MDL and map it */
88 Mdl
= MmAllocatePagesForMdlEx(ZeroPhysical
,
94 if (skip(Mdl
!= NULL
, "No MDL\n"))
99 MdlPages
= (PVOID
)(Mdl
+ 1);
101 BaseAddress
= MmMapLockedPagesWithReservedMapping(Mapping
,
107 ok_eq_pointer(BaseAddress
, Mapping
);
109 ok_bool_true(ValidateMapping(BaseAddress
, 10, 1, MdlPages
),
110 "ValidateMapping returned");
113 *(volatile ULONG
*)BaseAddress
= 0x01234567;
114 KmtEndSeh(STATUS_SUCCESS
);
116 MmUnmapReservedMapping(BaseAddress
,
120 ok_bool_true(ValidateMapping(Mapping
, 10, 0, NULL
),
121 "ValidateMapping returned");
124 MmFreePagesFromMdl(Mdl
);
127 Mdl
= MmAllocatePagesForMdlEx(ZeroPhysical
,
133 if (skip(Mdl
!= NULL
, "No MDL\n"))
138 MdlPages
= (PVOID
)(Mdl
+ 1);
140 BaseAddress
= MmMapLockedPagesWithReservedMapping(Mapping
,
146 ok_eq_pointer(BaseAddress
, Mapping
);
148 ok_bool_true(ValidateMapping(BaseAddress
, 10, 10, MdlPages
),
149 "ValidateMapping returned");
151 for (i
= 0; i
< 10; i
++)
154 *((volatile ULONG
*)BaseAddress
+ i
* PAGE_SIZE
/ sizeof(ULONG
)) = 0x01234567;
155 KmtEndSeh(STATUS_SUCCESS
);
158 MmUnmapReservedMapping(BaseAddress
,
162 ok_bool_true(ValidateMapping(Mapping
, 10, 0, NULL
),
163 "ValidateMapping returned");
166 MmFreePagesFromMdl(Mdl
);
168 /* Try to map more pages than we reserved */
169 Mdl
= MmAllocatePagesForMdlEx(ZeroPhysical
,
175 if (skip(Mdl
!= NULL
, "No MDL\n"))
180 BaseAddress
= MmMapLockedPagesWithReservedMapping(Mapping
,
184 ok_eq_pointer(BaseAddress
, NULL
);
187 MmUnmapReservedMapping(BaseAddress
,
192 MmFreePagesFromMdl(Mdl
);
195 START_TEST(MmReservedMapping
)
199 /* one byte - single page */
200 Mapping
= MmAllocateMappingAddress(1, 'MRmK');
201 ok(Mapping
!= NULL
, "MmAllocateMappingAddress failed\n");
202 if (!skip(Mapping
!= NULL
, "No mapping\n"))
204 ok_bool_true(ValidateMapping(Mapping
, 1, 0, NULL
),
205 "ValidateMapping returned");
207 MmFreeMappingAddress(Mapping
, 'MRmK');
211 Mapping
= MmAllocateMappingAddress(10 * PAGE_SIZE
, 'MRmK' & ~1);
212 ok(Mapping
!= NULL
, "MmAllocateMappingAddress failed\n");
213 if (!skip(Mapping
!= NULL
, "No mapping\n"))
215 ok_bool_true(ValidateMapping(Mapping
, 10, 0, NULL
),
216 "ValidateMapping returned");
218 /* PAGE_FAULT_IN_NONPAGED_AREA can't be caught with SEH */
221 (void)*(volatile UCHAR
*)Mapping
;
226 MmFreeMappingAddress(Mapping
, 'MRmK');