- Use MmExpansionLock to synchronize changes to MmProcessList. Should fix random crashes in MmDeleteProcessAddressSpace.
CORE-10111 #resolve
svn path=/trunk/; revision=69031
extern ULONG_PTR MmSubsectionBase;
extern LARGE_INTEGER MmCriticalSectionTimeout;
extern LIST_ENTRY MmWorkingSetExpansionHead;
+extern KSPIN_LOCK MmExpansionLock;
+extern PETHREAD MiExpansionLockOwner;
FORCEINLINE
BOOLEAN
}
}
+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
//
Pfn1->PteAddress = (PMMPTE)PDE_BASE;
/* Insert us into the Mm process list */
+ OldIrql = MiAcquireExpansionLock();
InsertTailList(&MmProcessList, &Process->MmProcessLinks);
+ MiReleaseExpansionLock(OldIrql);
/* Get a PTE to map the page directory */
PointerPte = MiReserveSystemPtes(1, SystemPteSpace);
/* 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
NTAPI
MiInitializeSessionWsSupport(VOID)
NTAPI
MmDeleteProcessAddressSpace(PEPROCESS Process)
{
+ KIRQL OldIrql;
PVOID Address;
DPRINT("MmDeleteProcessAddressSpace(Process %p (%s))\n", Process,
Process->ImageFileName);
#ifndef _M_AMD64
+ OldIrql = MiAcquireExpansionLock();
RemoveEntryList(&Process->MmProcessLinks);
+ MiReleaseExpansionLock(OldIrql);
#endif
MmLockAddressSpace(&Process->Vm);