[NTOS:MM] In MiMakePdeExistAndValid, do not overly check PDE validity

It's "okay" to not #ifdef, but it's useless and confusing.
This commit is contained in:
Jérôme Gardou 2021-05-28 16:56:28 +02:00 committed by Jérôme Gardou
parent c8fb3f7514
commit 678923bf4b

View file

@ -2477,7 +2477,13 @@ MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde,
IN PEPROCESS TargetProcess, IN PEPROCESS TargetProcess,
IN KIRQL OldIrql) IN KIRQL OldIrql)
{ {
PMMPTE PointerPte, PointerPpe, PointerPxe; PMMPTE PointerPte;
#if _MI_PAGING_LEVELS >= 3
PMMPPE PointerPpe = MiPdeToPpe(PointerPde);
#if _MI_PAGING_LEVELS == 4
PMMPXE PointerPxe = MiPdeToPxe(PointerPde);
#endif
#endif
// //
// Sanity checks. The latter is because we only use this function with the // Sanity checks. The latter is because we only use this function with the
@ -2486,16 +2492,16 @@ MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde,
ASSERT(KeAreAllApcsDisabled() == TRUE); ASSERT(KeAreAllApcsDisabled() == TRUE);
ASSERT(OldIrql == MM_NOIRQL); ASSERT(OldIrql == MM_NOIRQL);
//
// Also get the PPE and PXE. This is okay not to #ifdef because they will
// return the same address as the PDE on 2-level page table systems.
// //
// If everything is already valid, there is nothing to do. // If everything is already valid, there is nothing to do.
// //
PointerPpe = MiAddressToPte(PointerPde); if (
PointerPxe = MiAddressToPde(PointerPde); #if _MI_PAGING_LEVELS == 4
if ((PointerPxe->u.Hard.Valid) && (PointerPxe->u.Hard.Valid) &&
#endif
#if _MI_PAGING_LEVELS >= 3
(PointerPpe->u.Hard.Valid) && (PointerPpe->u.Hard.Valid) &&
#endif
(PointerPde->u.Hard.Valid)) (PointerPde->u.Hard.Valid))
{ {
return; return;
@ -2515,6 +2521,7 @@ MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde,
// //
ASSERT(KeAreAllApcsDisabled() == TRUE); ASSERT(KeAreAllApcsDisabled() == TRUE);
#if _MI_PAGING_LEVELS == 4
// //
// First, make the PXE valid if needed // First, make the PXE valid if needed
// //
@ -2523,31 +2530,47 @@ MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde,
MiMakeSystemAddressValid(PointerPpe, TargetProcess); MiMakeSystemAddressValid(PointerPpe, TargetProcess);
ASSERT(PointerPxe->u.Hard.Valid == 1); ASSERT(PointerPxe->u.Hard.Valid == 1);
} }
#endif
#if _MI_PAGING_LEVELS >= 3
// //
// Next, the PPE // Next, the PPE
// //
if (!PointerPpe->u.Hard.Valid) if (!PointerPpe->u.Hard.Valid)
{ {
#if _MI_PAGING_LEVELS == 4
if (PointerPpe->u.Long == 0)
MiIncrementPageTableReferences(PointerPde);
#endif
MiMakeSystemAddressValid(PointerPde, TargetProcess); MiMakeSystemAddressValid(PointerPde, TargetProcess);
ASSERT(PointerPpe->u.Hard.Valid == 1); ASSERT(PointerPpe->u.Hard.Valid == 1);
} }
#endif
// //
// And finally, make the PDE itself valid. // And finally, make the PDE itself valid.
// //
#if _MI_PAGING_LEVELS >= 3
if (PointerPde->u.Long == 0)
MiIncrementPageTableReferences(PointerPte);
#endif
MiMakeSystemAddressValid(PointerPte, TargetProcess); MiMakeSystemAddressValid(PointerPte, TargetProcess);
/* Do not increment Page table refcount here for the PDE, this must be managed by caller */
// //
// This should've worked the first time so the loop is really just for // This should've worked the first time so the loop is really just for
// show -- ASSERT that we're actually NOT going to be looping. // show -- ASSERT that we're actually NOT going to be looping.
// //
ASSERT(PointerPxe->u.Hard.Valid == 1);
ASSERT(PointerPpe->u.Hard.Valid == 1);
ASSERT(PointerPde->u.Hard.Valid == 1); ASSERT(PointerPde->u.Hard.Valid == 1);
} while (!(PointerPxe->u.Hard.Valid) || } while (
!(PointerPpe->u.Hard.Valid) || #if _MI_PAGING_LEVELS == 4
!(PointerPde->u.Hard.Valid)); !PointerPxe->u.Hard.Valid ||
#endif
#if _MI_PAGING_LEVELS >= 3
!PointerPpe->u.Hard.Valid ||
#endif
!PointerPde->u.Hard.Valid);
} }
VOID VOID