[NTOS:MM]

- Use MmExpansionLock to synchronize changes to MmProcessList. Should fix random crashes in MmDeleteProcessAddressSpace.
CORE-10111 #resolve

svn path=/trunk/; revision=69031
This commit is contained in:
Thomas Faber 2015-09-05 14:39:40 +00:00
parent 007c3df2e3
commit 57bd950d25
4 changed files with 30 additions and 23 deletions

View file

@ -634,6 +634,8 @@ extern SIZE_T MmSystemLockPagesCount;
extern ULONG_PTR MmSubsectionBase; extern ULONG_PTR MmSubsectionBase;
extern LARGE_INTEGER MmCriticalSectionTimeout; extern LARGE_INTEGER MmCriticalSectionTimeout;
extern LIST_ENTRY MmWorkingSetExpansionHead; extern LIST_ENTRY MmWorkingSetExpansionHead;
extern KSPIN_LOCK MmExpansionLock;
extern PETHREAD MiExpansionLockOwner;
FORCEINLINE FORCEINLINE
BOOLEAN BOOLEAN
@ -1330,6 +1332,29 @@ MiLockProcessWorkingSetForFault(IN PEPROCESS Process,
} }
} }
FORCEINLINE
KIRQL
MiAcquireExpansionLock(VOID)
{
KIRQL OldIrql;
ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
KeAcquireSpinLock(&MmExpansionLock, &OldIrql);
ASSERT(MiExpansionLockOwner == NULL);
MiExpansionLockOwner = PsGetCurrentThread();
return OldIrql;
}
FORCEINLINE
VOID
MiReleaseExpansionLock(KIRQL OldIrql)
{
ASSERT(MiExpansionLockOwner == PsGetCurrentThread());
MiExpansionLockOwner = NULL;
KeReleaseSpinLock(&MmExpansionLock, OldIrql);
ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
}
// //
// Returns the ProtoPTE inside a VAD for the given VPN // Returns the ProtoPTE inside a VAD for the given VPN
// //

View file

@ -1178,7 +1178,9 @@ MmCreateProcessAddressSpace(IN ULONG MinWs,
Pfn1->PteAddress = (PMMPTE)PDE_BASE; Pfn1->PteAddress = (PMMPTE)PDE_BASE;
/* Insert us into the Mm process list */ /* Insert us into the Mm process list */
OldIrql = MiAcquireExpansionLock();
InsertTailList(&MmProcessList, &Process->MmProcessLinks); InsertTailList(&MmProcessList, &Process->MmProcessLinks);
MiReleaseExpansionLock(OldIrql);
/* Get a PTE to map the page directory */ /* Get a PTE to map the page directory */
PointerPte = MiReserveSystemPtes(1, SystemPteSpace); PointerPte = MiReserveSystemPtes(1, SystemPteSpace);

View file

@ -35,29 +35,6 @@ PETHREAD MiExpansionLockOwner;
/* PRIVATE FUNCTIONS **********************************************************/ /* PRIVATE FUNCTIONS **********************************************************/
FORCEINLINE
KIRQL
MiAcquireExpansionLock(VOID)
{
KIRQL OldIrql;
ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
KeAcquireSpinLock(&MmExpansionLock, &OldIrql);
ASSERT(MiExpansionLockOwner == NULL);
MiExpansionLockOwner = PsGetCurrentThread();
return OldIrql;
}
FORCEINLINE
VOID
MiReleaseExpansionLock(KIRQL OldIrql)
{
ASSERT(MiExpansionLockOwner == PsGetCurrentThread());
MiExpansionLockOwner = NULL;
KeReleaseSpinLock(&MmExpansionLock, OldIrql);
ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
}
VOID VOID
NTAPI NTAPI
MiInitializeSessionWsSupport(VOID) MiInitializeSessionWsSupport(VOID)

View file

@ -575,13 +575,16 @@ NTSTATUS
NTAPI NTAPI
MmDeleteProcessAddressSpace(PEPROCESS Process) MmDeleteProcessAddressSpace(PEPROCESS Process)
{ {
KIRQL OldIrql;
PVOID Address; PVOID Address;
DPRINT("MmDeleteProcessAddressSpace(Process %p (%s))\n", Process, DPRINT("MmDeleteProcessAddressSpace(Process %p (%s))\n", Process,
Process->ImageFileName); Process->ImageFileName);
#ifndef _M_AMD64 #ifndef _M_AMD64
OldIrql = MiAcquireExpansionLock();
RemoveEntryList(&Process->MmProcessLinks); RemoveEntryList(&Process->MmProcessLinks);
MiReleaseExpansionLock(OldIrql);
#endif #endif
MmLockAddressSpace(&Process->Vm); MmLockAddressSpace(&Process->Vm);