This breaks boot. http://reactos.org:8010/builders/ReactOS_%28Debug%29/builds/13880/steps/test...
dgorbachev@svn.reactos.org schrieb:
Author: dgorbachev Date: Sat Mar 14 04:20:18 2009 New Revision: 40008
URL: http://svn.reactos.org/svn/reactos?rev=40008&view=rev Log: Return to an old idea of MiMapPageToZeroInHyperSpace(), "fix" bug #4267.
Modified: trunk/reactos/ntoskrnl/mm/hypermap.c
Modified: trunk/reactos/ntoskrnl/mm/hypermap.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/hypermap.c?rev=... ============================================================================== --- trunk/reactos/ntoskrnl/mm/hypermap.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/hypermap.c [iso-8859-1] Sat Mar 14 04:20:18 2009 @@ -14,8 +14,11 @@
/* GLOBALS ********************************************************************/
+#define MI_ZEROING_PTES 255
PMMPTE MmFirstReservedMappingPte; PMMPTE MmLastReservedMappingPte; +PMMPTE MmFirstReservedZeroingPte; MMPTE HyperTemplatePte; PEPROCESS HyperProcess; KIRQL HyperIrql; @@ -40,6 +43,8 @@ MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START); MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END); MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES;
- MmFirstReservedZeroingPte = MiAddressToPte(MI_ZERO_PTE);
- MmFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZEROING_PTES;
}
PVOID @@ -134,38 +139,62 @@ { MMPTE TempPte; PMMPTE PointerPte;
- PFN_NUMBER Offset; PVOID Address;
- // // Never accept page 0 // ASSERT(Page != 0);
- // // Build the PTE // TempPte = HyperTemplatePte; TempPte.u.Hard.PageFrameNumber = Page;
- //
- // Get the Zero PTE and its address
- //
- PointerPte = MiAddressToPte(MI_ZERO_PTE);
- //
- // Pick the first zeroing PTE
- //
- PointerPte = MmFirstReservedZeroingPte;
- //
- // Now get the first free PTE
- //
- Offset = PFN_FROM_PTE(PointerPte);
- if (!Offset)
- {
//// Reset the PTEs//Offset = MI_ZEROING_PTES;KeFlushProcessTb();- }
- //
- // Prepare the next PTE
- //
- PointerPte->u.Hard.PageFrameNumber = Offset - 1;
- //
- // Write the current PTE
- //
- PointerPte += Offset;
- *PointerPte = TempPte;
- //
- // Return the address
- // Address = (PVOID)((ULONG_PTR)PointerPte << 10);
- //
- // Invalidate the old address
- //
- __invlpg(Address);
- //
- // Write the current PTE
- //
- TempPte.u.Hard.PageFrameNumber = Page;
- *PointerPte = TempPte;
- //
- // Return the address
- // return Address;
}
+VOID +NTAPI +MiUnmapPageInZeroSpace(IN PVOID Address) +{
- //
- // Blow away the mapping
- //
- MiAddressToPte(Address)->u.Long = 0;
+}