[NTOSKRNL]

- Fix MMPTE vs MMPDE usage
- Use MiPteToPde instead of MiAddressToPte

svn path=/trunk/; revision=67632
This commit is contained in:
Timo Kreuzer 2015-05-10 19:35:00 +00:00
parent c74c888770
commit 73e043f5b5
7 changed files with 63 additions and 47 deletions

View file

@ -459,7 +459,7 @@ typedef struct _MM_SESSION_SPACE
SIZE_T CommittedPages;
PVOID PagedPoolStart;
PVOID PagedPoolEnd;
PMMPTE PagedPoolBasePde;
PMMPDE PagedPoolBasePde;
ULONG Color;
LONG ResidentProcessCount;
ULONG SessionPoolAllocationFailures[4];
@ -479,9 +479,9 @@ typedef struct _MM_SESSION_SPACE
PDRIVER_UNLOAD Win32KDriverUnload;
POOL_DESCRIPTOR PagedPool;
#if defined (_M_AMD64)
MMPTE PageDirectory;
MMPDE PageDirectory;
#else
PMMPTE PageTables;
PMMPDE PageTables;
#endif
#if defined (_M_AMD64)
PMMPTE SpecialPoolFirstPte;
@ -1887,7 +1887,7 @@ NTSTATUS
NTAPI
MiInitializeAndChargePfn(
OUT PPFN_NUMBER PageFrameIndex,
IN PMMPTE PointerPde,
IN PMMPDE PointerPde,
IN PFN_NUMBER ContainingPageFrame,
IN BOOLEAN SessionAllocation
);
@ -1904,7 +1904,7 @@ VOID
NTAPI
MiInitializePfnForOtherProcess(
IN PFN_NUMBER PageFrameIndex,
IN PMMPTE PointerPte,
IN PVOID PteAddress,
IN PFN_NUMBER PteFrame
);
@ -2210,7 +2210,7 @@ MmDeterminePoolType(
VOID
NTAPI
MiMakePdeExistAndMakeValid(
IN PMMPTE PointerPde,
IN PMMPDE PointerPde,
IN PEPROCESS TargetProcess,
IN KIRQL OldIrql
);

View file

@ -336,7 +336,7 @@ FASTCALL
MiCheckPdeForSessionSpace(IN PVOID Address)
{
MMPTE TempPde;
PMMPTE PointerPde;
PMMPDE PointerPde;
PVOID SessionAddress;
ULONG Index;
@ -1959,7 +1959,7 @@ UserFault:
}
/* Write a demand-zero PDE */
MI_WRITE_INVALID_PTE(PointerPde, DemandZeroPde);
MI_WRITE_INVALID_PDE(PointerPde, DemandZeroPde);
/* Dispatch the fault */
Status = MiDispatchFault(TRUE,
@ -2087,7 +2087,12 @@ UserFault:
if (PointerPde == MiAddressToPde(PTE_BASE))
{
/* Then it's really a demand-zero PDE (on behalf of user-mode) */
#ifdef _M_ARM
_WARN("This is probably completely broken!");
MI_WRITE_INVALID_PDE((PMMPDE)PointerPte, DemandZeroPde);
#else
MI_WRITE_INVALID_PTE(PointerPte, DemandZeroPde);
#endif
}
else
{

View file

@ -1083,15 +1083,15 @@ MiInitializePfnAndMakePteValid(IN PFN_NUMBER PageFrameIndex,
NTSTATUS
NTAPI
MiInitializeAndChargePfn(OUT PPFN_NUMBER PageFrameIndex,
IN PMMPTE PointerPde,
IN PMMPDE PointerPde,
IN PFN_NUMBER ContainingPageFrame,
IN BOOLEAN SessionAllocation)
{
MMPTE TempPte;
MMPDE TempPde;
KIRQL OldIrql;
/* Use either a global or local PDE */
TempPte = SessionAllocation ? ValidKernelPdeLocal : ValidKernelPde;
TempPde = SessionAllocation ? ValidKernelPdeLocal : ValidKernelPde;
/* Lock the PFN database */
OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
@ -1106,8 +1106,8 @@ MiInitializeAndChargePfn(OUT PPFN_NUMBER PageFrameIndex,
/* Grab a zero page and set the PFN, then make it valid */
*PageFrameIndex = MiRemoveZeroPage(MI_GET_NEXT_COLOR());
TempPte.u.Hard.PageFrameNumber = *PageFrameIndex;
MI_WRITE_VALID_PTE(PointerPde, TempPte);
TempPde.u.Hard.PageFrameNumber = *PageFrameIndex;
MI_WRITE_VALID_PDE(PointerPde, TempPde);
/* Initialize the PFN */
MiInitializePfnForOtherProcess(*PageFrameIndex,
@ -1270,14 +1270,14 @@ MiDecrementReferenceCount(IN PMMPFN Pfn1,
VOID
NTAPI
MiInitializePfnForOtherProcess(IN PFN_NUMBER PageFrameIndex,
IN PMMPTE PointerPte,
IN PVOID PteAddress,
IN PFN_NUMBER PteFrame)
{
PMMPFN Pfn1;
/* Setup the PTE */
Pfn1 = MI_PFN_ELEMENT(PageFrameIndex);
Pfn1->PteAddress = PointerPte;
Pfn1->PteAddress = PteAddress;
/* Make this a software PTE */
MI_MAKE_SOFTWARE_PTE(&Pfn1->OriginalPte, MM_READWRITE);

View file

@ -507,7 +507,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
//
// We can only support this much then
//
PointerPde = MiAddressToPte(MmPagedPoolInfo.LastPteForPagedPool);
PointerPde = MiPteToPde(MmPagedPoolInfo.LastPteForPagedPool);
PageTableCount = (PFN_COUNT)(PointerPde + 1 -
MmPagedPoolInfo.NextPdeForPagedPoolExpansion);
ASSERT(PageTableCount < i);
@ -1277,7 +1277,8 @@ NTSTATUS
NTAPI
MiInitializeSessionPool(VOID)
{
PMMPTE PointerPde, PointerPte, LastPte, LastPde;
PMMPTE PointerPte, LastPte;
PMMPDE PointerPde, LastPde;
PFN_NUMBER PageFrameIndex, PdeCount;
PPOOL_DESCRIPTOR PoolDescriptor;
PMM_SESSION_SPACE SessionGlobal;

View file

@ -937,8 +937,8 @@ MiSessionCommitPageTables(IN PVOID StartVa,
{
KIRQL OldIrql;
ULONG Color, Index;
PMMPTE StartPde, EndPde;
MMPTE TempPte = ValidKernelPdeLocal;
PMMPDE StartPde, EndPde;
MMPDE TempPde = ValidKernelPdeLocal;
PMMPFN Pfn1;
PFN_NUMBER PageCount = 0, ActualPages = 0, PageFrameNumber;
@ -976,7 +976,7 @@ MiSessionCommitPageTables(IN PVOID StartVa,
_WARN("MiSessionCommitPageTables halfplemented for amd64")
DBG_UNREFERENCED_LOCAL_VARIABLE(OldIrql);
DBG_UNREFERENCED_LOCAL_VARIABLE(Color);
DBG_UNREFERENCED_LOCAL_VARIABLE(TempPte);
DBG_UNREFERENCED_LOCAL_VARIABLE(TempPde);
DBG_UNREFERENCED_LOCAL_VARIABLE(Pfn1);
DBG_UNREFERENCED_LOCAL_VARIABLE(PageFrameNumber);
ASSERT(FALSE);
@ -996,12 +996,12 @@ _WARN("MiSessionCommitPageTables halfplemented for amd64")
OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
Color = (++MmSessionSpace->Color) & MmSecondaryColorMask;
PageFrameNumber = MiRemoveZeroPage(Color);
TempPte.u.Hard.PageFrameNumber = PageFrameNumber;
MI_WRITE_VALID_PTE(StartPde, TempPte);
TempPde.u.Hard.PageFrameNumber = PageFrameNumber;
MI_WRITE_VALID_PDE(StartPde, TempPde);
/* Write the page table in session space structure */
ASSERT(MmSessionSpace->PageTables[Index].u.Long == 0);
MmSessionSpace->PageTables[Index] = TempPte;
MmSessionSpace->PageTables[Index] = TempPde;
/* Initialize the PFN */
MiInitializePfnForOtherProcess(PageFrameNumber,
@ -2053,7 +2053,7 @@ MiSetProtectionOnSection(IN PEPROCESS Process,
//
if ((((ULONG_PTR)PointerPte) & (SYSTEM_PD_SIZE - 1)) == 0)
{
PointerPde = MiAddressToPte(PointerPte);
PointerPde = MiPteToPde(PointerPte);
MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL);
}
@ -2157,7 +2157,7 @@ MiRemoveMappedPtes(IN PVOID BaseAddress,
Pfn1 = MiGetPfnEntry(PFN_FROM_PTE(&PteContents));
/* Get the PTE */
PointerPde = MiAddressToPte(PointerPte);
PointerPde = MiPteToPde(PointerPte);
/* Lock the PFN database and make sure this isn't a mapped file */
OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);

View file

@ -480,8 +480,10 @@ NTAPI
MiSessionInitializeWorkingSetList(VOID)
{
KIRQL OldIrql;
PMMPTE PointerPte, PointerPde;
PMMPTE PointerPte;
PMMPDE PointerPde;
MMPTE TempPte;
MMPDE TempPde;
ULONG Color, Index;
PFN_NUMBER PageFrameIndex;
PMM_SESSION_SPACE SessionGlobal;
@ -501,7 +503,9 @@ MiSessionInitializeWorkingSetList(VOID)
if (PointerPde->u.Hard.Valid == 1)
{
/* Nope, we'll have to do it */
#ifndef _M_ARM
ASSERT(PointerPde->u.Hard.Global == 0);
#endif
AllocatedPageTable = FALSE;
}
else
@ -536,14 +540,14 @@ MiSessionInitializeWorkingSetList(VOID)
}
/* Write a valid PDE for it */
TempPte.u.Long = ValidKernelPdeLocal.u.Long;
TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
MI_WRITE_VALID_PTE(PointerPde, TempPte);
TempPde.u.Long = ValidKernelPdeLocal.u.Long;
TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
MI_WRITE_VALID_PDE(PointerPde, TempPde);
/* Add this into the list */
Index = ((ULONG_PTR)WorkingSetList - (ULONG_PTR)MmSessionBase) >> 22;
#ifndef _M_AMD64
MmSessionSpace->PageTables[Index] = TempPte;
MmSessionSpace->PageTables[Index] = TempPde;
#endif
/* Initialize the page directory page, and now zero the working set list itself */
MiInitializePfnForOtherProcess(PageFrameIndex,
@ -614,10 +618,11 @@ MiSessionCreateInternal(OUT PULONG SessionId)
PEPROCESS Process = PsGetCurrentProcess();
ULONG NewFlags, Flags, Size, i, Color;
KIRQL OldIrql;
PMMPTE PointerPte, PageTables, SessionPte;
PMMPDE PointerPde;
PMMPTE PointerPte, SessionPte;
PMMPDE PointerPde, PageTables;
PMM_SESSION_SPACE SessionGlobal;
MMPTE TempPte;
MMPDE TempPde;
NTSTATUS Status;
BOOLEAN Result;
PFN_NUMBER SessionPageDirIndex;
@ -725,13 +730,13 @@ MiSessionCreateInternal(OUT PULONG SessionId)
}
/* Fill the PTE out */
TempPte.u.Long = ValidKernelPdeLocal.u.Long;
TempPte.u.Hard.PageFrameNumber = SessionPageDirIndex;
TempPde.u.Long = ValidKernelPdeLocal.u.Long;
TempPde.u.Hard.PageFrameNumber = SessionPageDirIndex;
/* Setup, allocate, fill out the MmSessionSpace PTE */
PointerPde = MiAddressToPde(MmSessionSpace);
ASSERT(PointerPde->u.Long == 0);
MI_WRITE_VALID_PTE(PointerPde, TempPte);
MI_WRITE_VALID_PDE(PointerPde, TempPde);
MiInitializePfnForOtherProcess(SessionPageDirIndex,
PointerPde,
SessionPageDirIndex);

View file

@ -45,7 +45,8 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress,
IN PMMVAD Vad,
IN PEPROCESS Process)
{
PMMPTE PointerPte, LastPte, PointerPde;
PMMPTE PointerPte, LastPte;
PMMPDE PointerPde;
ULONG CommittedPages;
/* Compute starting and ending PTE and PDE addresses */
@ -60,7 +61,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress,
CommittedPages = (ULONG)BYTES_TO_PAGES(EndingAddress - StartingAddress);
/* Is the PDE demand-zero? */
PointerPde = MiAddressToPte(PointerPte);
PointerPde = MiPteToPde(PointerPte);
if (PointerPde->u.Long != 0)
{
/* It is not. Is it valid? */
@ -86,7 +87,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress,
if (MiIsPteOnPdeBoundary(PointerPte))
{
/* Is this PDE demand zero? */
PointerPde = MiAddressToPte(PointerPte);
PointerPde = MiPteToPde(PointerPte);
if (PointerPde->u.Long != 0)
{
/* It isn't -- is it valid? */
@ -132,7 +133,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress,
CommittedPages = 0;
/* Is the PDE demand-zero? */
PointerPde = MiAddressToPte(PointerPte);
PointerPde = MiPteToPde(PointerPte);
if (PointerPde->u.Long != 0)
{
/* It isn't -- is it invalid? */
@ -158,7 +159,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress,
if (MiIsPteOnPdeBoundary(PointerPte))
{
/* Is this new PDE demand-zero? */
PointerPde = MiAddressToPte(PointerPte);
PointerPde = MiPteToPde(PointerPte);
if (PointerPde->u.Long != 0)
{
/* It isn't. Is it valid? */
@ -1978,7 +1979,8 @@ MiIsEntireRangeCommitted(IN ULONG_PTR StartingAddress,
IN PMMVAD Vad,
IN PEPROCESS Process)
{
PMMPTE PointerPte, LastPte, PointerPde;
PMMPTE PointerPte, LastPte;
PMMPDE PointerPde;
BOOLEAN OnBoundary = TRUE;
PAGED_CODE();
@ -2098,7 +2100,8 @@ MiProtectVirtualMemory(IN PEPROCESS Process,
PMMVAD Vad;
PMMSUPPORT AddressSpace;
ULONG_PTR StartingAddress, EndingAddress;
PMMPTE PointerPde, PointerPte, LastPte;
PMMPTE PointerPte, LastPte;
PMMPDE PointerPde;
MMPTE PteContents;
PMMPFN Pfn1;
ULONG ProtectionMask, OldProtect;
@ -2273,7 +2276,7 @@ MiProtectVirtualMemory(IN PEPROCESS Process,
/* Check if we've crossed a PDE boundary and make the new PDE valid too */
if (MiIsPteOnPdeBoundary(PointerPte))
{
PointerPde = MiAddressToPte(PointerPte);
PointerPde = MiPteToPde(PointerPte);
MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL);
}
@ -2366,7 +2369,7 @@ FailPath:
VOID
NTAPI
MiMakePdeExistAndMakeValid(IN PMMPTE PointerPde,
MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde,
IN PEPROCESS TargetProcess,
IN KIRQL OldIrql)
{
@ -2502,7 +2505,8 @@ MiDecommitPages(IN PVOID StartingAddress,
IN PEPROCESS Process,
IN PMMVAD Vad)
{
PMMPTE PointerPde, PointerPte, CommitPte = NULL;
PMMPTE PointerPte, CommitPte = NULL;
PMMPDE PointerPde;
ULONG CommitReduction = 0;
PMMPTE ValidPteList[256];
ULONG PteCount = 0;
@ -4316,7 +4320,8 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle,
ULONG ProtectionMask, QuotaCharge = 0, QuotaFree = 0;
BOOLEAN Attached = FALSE, ChangeProtection = FALSE;
MMPTE TempPte;
PMMPTE PointerPte, PointerPde, LastPte;
PMMPTE PointerPte, LastPte;
PMMPDE PointerPde;
TABLE_SEARCH_RESULT Result;
PAGED_CODE();
@ -4891,7 +4896,7 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle,
//
// Get the PDE and now make it valid too
//
PointerPde = MiAddressToPte(PointerPte);
PointerPde = MiPteToPde(PointerPte);
MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL);
}