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 CmpAcquireKcbLockExclusive(PCM_KEY_CONTROL_BLOCK Kcb)
FORCEINLINE VOID CmpAcquireKcbLockExclusiveByKey(IN ULONG ConvKey)
#define GET_HASH_ENTRY(Table, ConvKey)
FORCEINLINE VOID CmpAcquireKcbLockExclusiveByIndex(ULONG Index)
#define GET_HASH_INDEX(ConvKey)
FORCEINLINE VOID CmpReleaseKcbLockByKey(ULONG ConvKey)
#define CmpIsKcbLockedExclusive(k)
FORCEINLINE VOID CmpConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k)
FORCEINLINE VOID CmpReleaseKcbLockByIndex(ULONG Index)
FORCEINLINE VOID CmpReleaseKcbLock(PCM_KEY_CONTROL_BLOCK Kcb)
FORCEINLINE BOOLEAN CmpTryToConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k)
PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable
FORCEINLINE VOID ExReleasePushLock(PEX_PUSH_LOCK PushLock)
FORCEINLINE VOID ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
FORCEINLINE BOOLEAN ExConvertPushLockSharedToExclusive(IN PEX_PUSH_LOCK PushLock)
#define KeGetCurrentThread
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock