diff --git a/ntoskrnl/include/internal/cm.h b/ntoskrnl/include/internal/cm.h index a211862531c..38c61513c7e 100644 --- a/ntoskrnl/include/internal/cm.h +++ b/ntoskrnl/include/internal/cm.h @@ -160,6 +160,9 @@ typedef struct _CM_KEY_HASH_TABLE_ENTRY EX_PUSH_LOCK Lock; PKTHREAD Owner; PCM_KEY_HASH Entry; +#if DBG + PVOID LockBackTrace[5]; +#endif } CM_KEY_HASH_TABLE_ENTRY, *PCM_KEY_HASH_TABLE_ENTRY; // diff --git a/ntoskrnl/include/internal/cm_x.h b/ntoskrnl/include/internal/cm_x.h index 5e7dffd2872..82a0fc8992f 100644 --- a/ntoskrnl/include/internal/cm_x.h +++ b/ntoskrnl/include/internal/cm_x.h @@ -6,6 +6,19 @@ * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */ +#if DBG +FORCEINLINE +VOID +CmpCaptureLockBackTraceByIndex(_In_ ULONG Index) +{ + /* Capture the backtrace */ + RtlCaptureStackBackTrace(1, + _countof(CmpCacheTable[Index].LockBackTrace), + CmpCacheTable[Index].LockBackTrace, + NULL); +} +#endif + // // Returns the hashkey corresponding to a convkey // @@ -104,8 +117,12 @@ FORCEINLINE VOID CmpAcquireKcbLockExclusiveByIndex(ULONG Index) { + ASSERT(CmpCacheTable[Index].Owner != KeGetCurrentThread()); ExAcquirePushLockExclusive(&CmpCacheTable[Index].Lock); CmpCacheTable[Index].Owner = KeGetCurrentThread(); +#if DBG + CmpCaptureLockBackTraceByIndex(Index); +#endif } //