mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
Implement MmUpdatePageDir
svn path=/branches/ros-amd64-bringup/; revision=35737
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
* Lowlevel memory managment definitions
|
||||
*/
|
||||
|
||||
#ifndef __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H
|
||||
#define __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H
|
||||
#ifndef __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H
|
||||
#define __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H
|
||||
|
||||
struct _EPROCESS;
|
||||
PULONG_PTR MmGetPageDirectory(VOID);
|
||||
@@ -17,15 +17,21 @@ PULONG_PTR MmGetPageDirectory(VOID);
|
||||
|
||||
/* Converting address to a corresponding PDE or PTE entry */
|
||||
#define MiAddressToPde(x) \
|
||||
((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PAGEDIRECTORY_MAP))
|
||||
((PMMPTE)(((((ULONG64)(x)) >> 22) << 2) + PAGEDIRECTORY_MAP))
|
||||
#define MiAddressToPte(x) \
|
||||
((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + PAGETABLE_MAP))
|
||||
((PMMPTE)(((((ULONG64)(x)) >> 12) << 2) + PAGETABLE_MAP))
|
||||
|
||||
//#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE))
|
||||
//#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
|
||||
//#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
|
||||
|
||||
#define VAtoPXI(va) ((((ULONG64)va) >> PXI_SHIFT) & 0x1FF)
|
||||
#define VAtoPPI(va) ((((ULONG64)va) >> PPI_SHIFT) & 0x1FF)
|
||||
#define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF)
|
||||
#define VAtoPTI(va) ((((ULONG64)va) >> PTI_SHIFT) & 0x1FF)
|
||||
|
||||
#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE))
|
||||
#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
|
||||
#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
|
||||
|
||||
/* Easy accessing PFN in PTE */
|
||||
#define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
|
||||
|
||||
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H */
|
||||
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H */
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
/* GLOBALS *****************************************************************/
|
||||
|
||||
ULONG64 MmGlobalKernelPageDirectory[512];
|
||||
|
||||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
@@ -301,7 +302,37 @@ VOID
|
||||
NTAPI
|
||||
MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
ULONG StartIndex, EndIndex, Index;
|
||||
PULONG64 Pde;
|
||||
|
||||
/* Sanity check */
|
||||
if (Address < MmSystemRangeStart)
|
||||
{
|
||||
KEBUGCHECK(0);
|
||||
}
|
||||
|
||||
/* Get pointer to the page directory to update */
|
||||
if (Process != NULL && Process != PsGetCurrentProcess())
|
||||
{
|
||||
// Pde = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0]));
|
||||
}
|
||||
else
|
||||
{
|
||||
Pde = (PULONG64)PXE_BASE;
|
||||
}
|
||||
|
||||
/* Update PML4 entries */
|
||||
StartIndex = VAtoPXI(Address);
|
||||
EndIndex = VAtoPXI((ULONG64)Address + Size);
|
||||
for (Index = StartIndex; Index <= EndIndex; Index++)
|
||||
{
|
||||
if (Index != VAtoPXI(PXE_BASE))
|
||||
{
|
||||
(void)InterlockedCompareExchangePointer((PVOID*)&Pde[Index],
|
||||
MmGlobalKernelPageDirectory[Index],
|
||||
0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
|
||||
Reference in New Issue
Block a user