[NTOS:MM] Implement and use MiAcquirePfnLockAtDpcLevel/MiReleasePfnLockFromDpcLevel.

This commit is contained in:
Thomas Faber 2017-11-21 23:36:34 +01:00
parent da5949280c
commit 81532227b6
No known key found for this signature in database
GPG key ID: 076E7C3D44720826
2 changed files with 24 additions and 4 deletions

View file

@ -883,6 +883,28 @@ MiReleasePfnLock(
KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); 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) #define MI_ASSERT_PFN_LOCK_HELD() ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL)
FORCEINLINE FORCEINLINE

View file

@ -433,7 +433,6 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
PMMPFN Pfn1; PMMPFN Pfn1;
PVOID BaseVa, BaseVaStart; PVOID BaseVa, BaseVaStart;
PMMFREE_POOL_ENTRY FreeEntry; PMMFREE_POOL_ENTRY FreeEntry;
PKSPIN_LOCK_QUEUE LockQueue;
// //
// Figure out how big the allocation is in pages // Figure out how big the allocation is in pages
@ -844,8 +843,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
// //
// Lock the PFN database too // Lock the PFN database too
// //
LockQueue = &KeGetCurrentPrcb()->LockQueue[LockQueuePfnLock]; MiAcquirePfnLockAtDpcLevel();
KeAcquireQueuedSpinLockAtDpcLevel(LockQueue);
// //
// Loop the pages // Loop the pages
@ -889,7 +887,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
// //
// Release the PFN and nonpaged pool lock // Release the PFN and nonpaged pool lock
// //
KeReleaseQueuedSpinLockFromDpcLevel(LockQueue); MiReleasePfnLockFromDpcLevel();
KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql); KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql);
// //