12 #define GET_HASH_KEY(ConvKey) \ 13 ((CMP_HASH_IRRATIONAL * (ConvKey)) % CMP_HASH_PRIME) 18 #define GET_HASH_INDEX(ConvKey) \ 19 GET_HASH_KEY(ConvKey) % CmpHashTableSize 20 #define GET_HASH_ENTRY(Table, ConvKey) \ 21 (&Table[GET_HASH_INDEX(ConvKey)]) 22 #define ASSERT_VALID_HASH(h) \ 23 ASSERT_KCB_VALID(CONTAINING_RECORD((h), CM_KEY_CONTROL_BLOCK, KeyHash)) 28 #define CMP_IS_CELL_CACHED(c) \ 29 (((c) & HCELL_CACHED) && ((c) != HCELL_NIL)) 34 #define CMP_GET_CACHED_CELL(c) \ 35 (ULONG_PTR)((c) & ~HCELL_CACHED) 36 #define CMP_GET_CACHED_DATA(c) \ 37 (&(((PCM_CACHED_VALUE_INDEX)(CMP_GET_CACHED_CELL(c)))->Data.CellData)) 38 #define CMP_GET_CACHED_INDEX(c) \ 39 (&(((PCM_CACHED_ENTRY)(CMP_GET_CACHED_CELL(c)))->CellIndex)) 40 #define CMP_GET_CACHED_VALUE(c) \ 41 (&(((PCM_CACHED_VALUE)(CMP_GET_CACHED_CELL(c)))->KeyValue)) 46 #define CMP_ASSERT_REGISTRY_LOCK() \ 47 ASSERT((CmpSpecialBootCondition == TRUE) || \ 48 (CmpTestRegistryLock() == TRUE)) 53 #define CMP_ASSERT_REGISTRY_LOCK_OR_LOADING(h) \ 54 ASSERT((CmpSpecialBootCondition == TRUE) || \ 55 (((PCMHIVE)h)->HiveIsLoading == TRUE) || \ 56 (CmpTestRegistryLock() == TRUE)) 61 #define CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK() \ 62 ASSERT((CmpSpecialBootCondition == TRUE) || \ 63 (CmpTestRegistryLockExclusive() == TRUE)) 68 #define CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK_OR_LOADING(h) \ 69 ASSERT((CmpSpecialBootCondition == TRUE) || \ 70 (((PCMHIVE)h)->HiveIsLoading == TRUE) || \ 71 (CmpTestRegistryLockExclusive() == TRUE)) 76 #define ASSERT_KCB_VALID(k) \ 77 ASSERT((k)->Signature == CM_KCB_SIGNATURE) 82 #define CmpIsKcbLockedExclusive(k) \ 83 (GET_HASH_ENTRY(CmpCacheTable, \ 84 (k)->ConvKey)->Owner == KeGetCurrentThread()) 121 #define CmpAcquireKcbLockShared(k) \ 123 ExAcquirePushLockShared(&GET_HASH_ENTRY(CmpCacheTable, \ 124 (k)->ConvKey)->Lock); \ 130 #define CmpAcquireKcbLockSharedByIndex(i) \ 132 ExAcquirePushLockShared(&CmpCacheTable[(i)].Lock); \ 199 #define CmpAcquireNcbLockExclusive(n) \ 201 ExAcquirePushLockExclusive(&GET_HASH_ENTRY(CmpNameCacheTable, \ 202 (n)->ConvKey)->Lock); \ 208 #define CmpAcquireNcbLockExclusiveByKey(k) \ 210 ExAcquirePushLockExclusive(&GET_HASH_ENTRY(CmpNameCacheTable, \ 217 #define CmpReleaseNcbLock(k) \ 219 ExReleasePushLock(&GET_HASH_ENTRY(CmpNameCacheTable, \ 220 (k)->ConvKey)->Lock); \ 226 #define CmpReleaseNcbLockByKey(k) \ 228 ExReleasePushLock(&GET_HASH_ENTRY(CmpNameCacheTable, \ 235 #define CMP_ASSERT_HASH_ENTRY_LOCK(k) \ 237 ASSERT(((GET_HASH_ENTRY(CmpCacheTable, k)->Owner == \ 238 KeGetCurrentThread())) || \ 239 (CmpTestRegistryLockExclusive() == TRUE)); \ 245 #define CMP_ASSERT_KCB_LOCK(k) \ 247 ASSERT((CmpIsKcbLockedExclusive(k) == TRUE) || \ 248 (CmpTestRegistryLockExclusive() == TRUE)); \ 254 #define CmpGetAllocPageFromKcb(k) \ 255 (PCM_ALLOC_PAGE)(((ULONG_PTR)(k)) & ~(PAGE_SIZE - 1)) 260 #define CmpGetAllocPageFromDelayAlloc(a) \ 261 (PCM_ALLOC_PAGE)(((ULONG_PTR)(a)) & ~(PAGE_SIZE - 1)) 266 #define CMP_ASSERT_FLUSH_LOCK(h) \ 267 ASSERT((CmpSpecialBootCondition == TRUE) || \ 268 (((PCMHIVE)h)->HiveIsLoading == TRUE) || \ 269 (CmpTestHiveFlusherLockShared((PCMHIVE)h) == TRUE) || \ 270 (CmpTestHiveFlusherLockExclusive((PCMHIVE)h) == TRUE) || \ 271 (CmpTestRegistryLockExclusive() == TRUE)); FORCEINLINE VOID ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
FORCEINLINE VOID CmpReleaseKcbLockByIndex(ULONG Index)
FORCEINLINE VOID CmpAcquireKcbLockExclusiveByKey(IN ULONG ConvKey)
FORCEINLINE VOID CmpAcquireKcbLockExclusiveByIndex(ULONG Index)
FORCEINLINE VOID CmpReleaseKcbLock(PCM_KEY_CONTROL_BLOCK Kcb)
FORCEINLINE VOID CmpReleaseKcbLockByKey(ULONG ConvKey)
#define GET_HASH_ENTRY(Table, ConvKey)
_In_ WDFCOLLECTION _In_ ULONG Index
PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable
#define GET_HASH_INDEX(ConvKey)
FORCEINLINE VOID ExReleasePushLock(PEX_PUSH_LOCK PushLock)
FORCEINLINE BOOLEAN CmpTryToConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k)
FORCEINLINE VOID CmpConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k)
FORCEINLINE BOOLEAN ExConvertPushLockSharedToExclusive(IN PEX_PUSH_LOCK PushLock)
#define CmpIsKcbLockedExclusive(k)
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
#define KeGetCurrentThread
FORCEINLINE VOID CmpAcquireKcbLockExclusive(PCM_KEY_CONTROL_BLOCK Kcb)