diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h index d96900b27e0..ec42abbfaed 100644 --- a/ntoskrnl/include/internal/mm.h +++ b/ntoskrnl/include/internal/mm.h @@ -883,6 +883,28 @@ MiReleasePfnLock( KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); } +FORCEINLINE +VOID +MiAcquirePfnLockAtDpcLevel(VOID) +{ + PKSPIN_LOCK_QUEUE LockQueue; + + ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL); + LockQueue = &KeGetCurrentPrcb()->LockQueue[LockQueuePfnLock]; + KeAcquireQueuedSpinLockAtDpcLevel(LockQueue); +} + +FORCEINLINE +VOID +MiReleasePfnLockFromDpcLevel(VOID) +{ + PKSPIN_LOCK_QUEUE LockQueue; + + LockQueue = &KeGetCurrentPrcb()->LockQueue[LockQueuePfnLock]; + KeReleaseQueuedSpinLockFromDpcLevel(LockQueue); + ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL); +} + #define MI_ASSERT_PFN_LOCK_HELD() ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL) FORCEINLINE diff --git a/ntoskrnl/mm/ARM3/pool.c b/ntoskrnl/mm/ARM3/pool.c index b47ee2608e1..7cebabe818e 100644 --- a/ntoskrnl/mm/ARM3/pool.c +++ b/ntoskrnl/mm/ARM3/pool.c @@ -433,7 +433,6 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, PMMPFN Pfn1; PVOID BaseVa, BaseVaStart; PMMFREE_POOL_ENTRY FreeEntry; - PKSPIN_LOCK_QUEUE LockQueue; // // Figure out how big the allocation is in pages @@ -844,8 +843,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // Lock the PFN database too // - LockQueue = &KeGetCurrentPrcb()->LockQueue[LockQueuePfnLock]; - KeAcquireQueuedSpinLockAtDpcLevel(LockQueue); + MiAcquirePfnLockAtDpcLevel(); // // Loop the pages @@ -889,7 +887,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // Release the PFN and nonpaged pool lock // - KeReleaseQueuedSpinLockFromDpcLevel(LockQueue); + MiReleasePfnLockFromDpcLevel(); KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql); //