| 225 | |
| 226 | _IRQL_requires_max_(APC_LEVEL) |
| 227 | BOOLEAN IsPagePresent(PVOID Address, OPTIONAL OUT PULONG PageSize) |
| 228 | { |
| 229 | BOOLEAN IsPresent = FALSE; |
| 230 | PAGE_TABLES_INFO Info = {}; |
| 231 | if (GetPageTables(Address, &Info)) __try |
| 232 | { |
| 233 | if (PageSize) *PageSize = 0; |
| 234 | |
| 235 | switch (Info.Type) { |
| 236 | case PAGE_TABLES_INFO::pt32NonPaePage4Kb: |
| 237 | // PDE -> PTE -> PA: |
| 238 | if (PageSize) *PageSize = 4096; |
| 239 | IsPresent = Info.Pte->x32.NonPae.Page4Kb.P; |
| 240 | break; |
| 241 | case PAGE_TABLES_INFO::pt32NonPaePage4Mb: |
| 242 | // PDE -> PA: |
| 243 | if (PageSize) *PageSize = 4096 * 1024; |
| 244 | IsPresent = Info.Pde->x32.NonPae.Page4Mb.P; |
| 245 | break; |
| 246 | case PAGE_TABLES_INFO::pt32PaePage4Kb: |
| 247 | // PDPE -> PDE -> PTE -> PA: |
| 248 | if (PageSize) *PageSize = 4096; |
| 249 | IsPresent = Info.Pte->x32.Pae.Page4Kb.P; |
| 250 | break; |
| 251 | case PAGE_TABLES_INFO::pt32PaePage2Mb: |
| 252 | // PDPE -> PDE -> PA: |
| 253 | if (PageSize) *PageSize = 2048 * 1024; |
| 254 | IsPresent = Info.Pde->x32.Pae.Page2Mb.P; |
| 255 | break; |
| 256 | case PAGE_TABLES_INFO::pt64Page4Kb: |
| 257 | // PML4E -> PDPE -> PDE -> PTE -> PA: |
| 258 | if (PageSize) *PageSize = 4096; |
| 259 | IsPresent = Info.Pte->x64.Page4Kb.P; |
| 260 | break; |
| 261 | case PAGE_TABLES_INFO::pt64Page2Mb: |
| 262 | // PML4E -> PDPE -> PDE -> PA: |
| 263 | if (PageSize) *PageSize = 2048 * 1024; |
| 264 | IsPresent = Info.Pde->x64.Page2Mb.P; |
| 265 | break; |
| 266 | case PAGE_TABLES_INFO::pt64Page1Gb: |
| 267 | // PML4E -> PDPE -> PA: |
| 268 | if (PageSize) *PageSize = 1024 * 1024 * 1024; |
| 269 | IsPresent = Info.Pdpe->x64.PageSize.Page1Gb.P; |
| 270 | break; |
| 271 | } |
| 272 | } |
| 273 | __except (EXCEPTION_EXECUTE_HANDLER) |
| 274 | { |
| 275 | IsPresent = FALSE; |
| 276 | } |
| 277 | |
| 278 | return IsPresent; |
| 279 | } |
| 280 | |
| 281 | _IRQL_requires_max_(APC_LEVEL) |
| 282 | BOOLEAN IsProcessPagePresent(OPTIONAL PEPROCESS Process, PVOID Address, OPTIONAL OUT PULONG PageSize) |
no test coverage detected