12#define GET_HASH_KEY(ConvKey) \
13 ((CMP_HASH_IRRATIONAL * (ConvKey)) % CMP_HASH_PRIME)
18#define COMPUTE_HASH_CHAR(ConvKey, Char) \
19 (37 * ConvKey + RtlUpcaseUnicodeChar(Char))
24#define GET_HASH_INDEX(ConvKey) \
25 (GET_HASH_KEY(ConvKey) % CmpHashTableSize)
26#define GET_HASH_ENTRY(Table, ConvKey) \
27 (&Table[GET_HASH_INDEX(ConvKey)])
28#define ASSERT_VALID_HASH(h) \
29 ASSERT_KCB_VALID(CONTAINING_RECORD((h), CM_KEY_CONTROL_BLOCK, KeyHash))
34#define CMP_IS_CELL_CACHED(c) \
35 (((c) & HCELL_CACHED) && ((c) != HCELL_NIL))
40#define CMP_GET_CACHED_CELL(c) \
41 (ULONG_PTR)((c) & ~HCELL_CACHED)
42#define CMP_GET_CACHED_DATA(c) \
43 (&(((PCM_CACHED_VALUE_INDEX)(CMP_GET_CACHED_CELL(c)))->Data.CellData))
44#define CMP_GET_CACHED_INDEX(c) \
45 (&(((PCM_CACHED_ENTRY)(CMP_GET_CACHED_CELL(c)))->CellIndex))
46#define CMP_GET_CACHED_VALUE(c) \
47 (&(((PCM_CACHED_VALUE)(CMP_GET_CACHED_CELL(c)))->KeyValue))
52#define CMP_ASSERT_REGISTRY_LOCK() \
53 ASSERT((CmpSpecialBootCondition == TRUE) || \
54 (CmpTestRegistryLock() == TRUE))
59#define CMP_ASSERT_REGISTRY_LOCK_OR_LOADING(h) \
60 ASSERT((CmpSpecialBootCondition == TRUE) || \
61 (((PCMHIVE)h)->HiveIsLoading == TRUE) || \
62 (CmpTestRegistryLock() == TRUE))
67#define CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK() \
68 ASSERT((CmpSpecialBootCondition == TRUE) || \
69 (CmpTestRegistryLockExclusive() == TRUE))
74#define CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK_OR_LOADING(h) \
75 ASSERT((CmpSpecialBootCondition == TRUE) || \
76 (((PCMHIVE)h)->HiveIsLoading == TRUE) || \
77 (CmpTestRegistryLockExclusive() == TRUE))
82#define ASSERT_KCB_VALID(k) \
83 ASSERT((k)->Signature == CM_KCB_SIGNATURE)
88#define CmpIsKcbLockedExclusive(k) \
89 (GET_HASH_ENTRY(CmpCacheTable, \
90 (k)->ConvKey)->Owner == KeGetCurrentThread())
95#define CmpAcquireKcbLockSharedByIndex(i) \
97 ExAcquirePushLockShared(&CmpCacheTable[(i)].Lock); \
145#define CmpAcquireKcbLockShared(k) \
147 ExAcquirePushLockShared(&GET_HASH_ENTRY(CmpCacheTable, \
148 (k)->ConvKey)->Lock); \
215#define CmpAcquireNcbLockExclusive(n) \
217 ExAcquirePushLockExclusive(&GET_HASH_ENTRY(CmpNameCacheTable, \
218 (n)->ConvKey)->Lock); \
224#define CmpAcquireNcbLockExclusiveByKey(k) \
226 ExAcquirePushLockExclusive(&GET_HASH_ENTRY(CmpNameCacheTable, \
233#define CmpReleaseNcbLock(k) \
235 ExReleasePushLock(&GET_HASH_ENTRY(CmpNameCacheTable, \
236 (k)->ConvKey)->Lock); \
242#define CmpReleaseNcbLockByKey(k) \
244 ExReleasePushLock(&GET_HASH_ENTRY(CmpNameCacheTable, \
251#define CMP_ASSERT_HASH_ENTRY_LOCK(k) \
253 ASSERT(((GET_HASH_ENTRY(CmpCacheTable, k)->Owner == \
254 KeGetCurrentThread())) || \
255 (CmpTestRegistryLockExclusive() == TRUE)); \
261#define CMP_ASSERT_KCB_LOCK(k) \
263 ASSERT((CmpIsKcbLockedExclusive(k) == TRUE) || \
264 (CmpTestRegistryLockExclusive() == TRUE)); \
270#define CmpGetAllocPageFromKcb(k) \
271 (PCM_ALLOC_PAGE)(((ULONG_PTR)(k)) & ~(PAGE_SIZE - 1))
276#define CmpGetAllocPageFromDelayAlloc(a) \
277 (PCM_ALLOC_PAGE)(((ULONG_PTR)(a)) & ~(PAGE_SIZE - 1))
282#define CMP_ASSERT_FLUSH_LOCK(h) \
283 ASSERT((CmpSpecialBootCondition == TRUE) || \
284 (((PCMHIVE)h)->HiveIsLoading == TRUE) || \
285 (CmpTestHiveFlusherLockShared((PCMHIVE)h) == TRUE) || \
286 (CmpTestHiveFlusherLockExclusive((PCMHIVE)h) == TRUE) || \
287 (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 CmpAcquireKcbLockSharedByKey(_In_ ULONG ConvKey)
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)
#define CmpAcquireKcbLockSharedByIndex(i)
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