[ros-dev] [ros-diffs] [dgorbachev] 40008: Return to an old idea of MiMapPageToZeroInHyperSpace(), "fix" bug #4267.

Timo Kreuzer timo.kreuzer at web.de
Sat Mar 14 16:10:53 CET 2009


This breaks boot.
http://reactos.org:8010/builders/ReactOS_%28Debug%29/builds/13880/steps/test/logs/stdio

dgorbachev at 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=40008&r1=40007&r2=40008&view=diff
> ==============================================================================
> --- 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;
> +}
>
>
>   



More information about the Ros-dev mailing list