From 90307e077e22c72c21f6ebcbbe2431f1bd354e08 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 9 Aug 2007 08:35:11 +0000 Subject: [PATCH] One of Alex's uncommitted patches while he was working on the Cm branch: - Fix CmpCacheTable and CmpNameCacheTable definition. - Fix GET_HASH_ENTRY definition. - Add KCB Lock Acquire/Release macros by Index and Key. Has no effect on current code, but fixes some bugs in the branch-based code svn path=/trunk/; revision=28259 --- reactos/ntoskrnl/config/cm.h | 13 ++++- reactos/ntoskrnl/config/cm_x.h | 77 +++++++++++++++++++++++++++++- reactos/ntoskrnl/config/cmkcbncb.c | 4 +- 3 files changed, 89 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/config/cm.h b/reactos/ntoskrnl/config/cm.h index 9f47dd04125..81fc4be0109 100644 --- a/reactos/ntoskrnl/config/cm.h +++ b/reactos/ntoskrnl/config/cm.h @@ -1140,6 +1140,14 @@ CmpComputeHashKey( IN BOOLEAN AllowSeparators ); +BOOLEAN +NTAPI +CmpAddSubKey( + IN PHHIVE Hive, + IN HCELL_INDEX Parent, + IN HCELL_INDEX Child +); + BOOLEAN NTAPI CmpRemoveSubKey( @@ -1345,8 +1353,8 @@ extern EX_PUSH_LOCK CmpHiveListHeadLock, CmpLoadHiveLock; extern LIST_ENTRY CmpHiveListHead; extern POBJECT_TYPE CmpKeyObjectType; extern ERESOURCE CmpRegistryLock; -extern PCM_KEY_HASH_TABLE_ENTRY *CmpCacheTable; -extern PCM_NAME_HASH_TABLE_ENTRY *CmpNameCacheTable; +extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable; +extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable; extern KGUARDED_MUTEX CmpDelayedCloseTableLock; extern CMHIVE CmControlHive; extern WCHAR CmDefaultLanguageId[]; @@ -1371,6 +1379,7 @@ extern ULONG CmpBootType; extern HANDLE CmpRegistryRootHandle; extern BOOLEAN ExpInTextModeSetup; extern BOOLEAN InitIsWinPEMode; +extern ULONG CmpHashTableSize; // // Inlined functions diff --git a/reactos/ntoskrnl/config/cm_x.h b/reactos/ntoskrnl/config/cm_x.h index 35500c310bc..5b0d42da36a 100644 --- a/reactos/ntoskrnl/config/cm_x.h +++ b/reactos/ntoskrnl/config/cm_x.h @@ -62,7 +62,7 @@ CmpIsKeyValueBig(IN PHHIVE Hive, #define GET_HASH_INDEX(ConvKey) \ GET_HASH_KEY(ConvKey) % CmpHashTableSize #define GET_HASH_ENTRY(Table, ConvKey) \ - (*Table[GET_HASH_INDEX(ConvKey)]) + (Table[GET_HASH_INDEX(ConvKey)]) // // Returns whether or not the cell is cached @@ -114,6 +114,62 @@ CmpIsKeyValueBig(IN PHHIVE Hive, (k)->ConvKey).Owner = KeGetCurrentThread(); \ } +// +// Exclusively acquires a KCB by index +// +#define CmpAcquireKcbLockExclusiveByIndex(i) \ +{ \ + ExAcquirePushLockExclusive(&CmpCacheTable[(i)].Lock); \ + CmpCacheTable[(i)].Owner = KeGetCurrentThread(); \ +} + +// +// Exclusively acquires a KCB by key +// +#define CmpAcquireKcbLockExclusiveByKey(k) \ +{ \ + ExAcquirePushLockExclusive(&GET_HASH_ENTRY(CmpCacheTable, \ + (k)).Lock); \ + GET_HASH_ENTRY(CmpCacheTable, \ + (k)).Owner = KeGetCurrentThread(); \ +} + + +// +// Shared acquires a KCB +// +#define CmpAcquireKcbLockShared(k) \ +{ \ + ExAcquirePushLockShared(&GET_HASH_ENTRY(CmpCacheTable, \ + (k)->ConvKey).Lock); \ +} + +// +// Shared acquires a KCB by index +// +#define CmpAcquireKcbLockSharedByIndex(i) \ +{ \ + ExAcquirePushLockShared(&CmpCacheTable[(i)].Lock); \ +} + +// +// Tries to convert a KCB lock +// +FORCEINLINE +BOOLEAN +CmpTryToConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k) +{ + ASSERT(CmpIsKcbLockedExclusive(k) == FALSE); + if (ExConvertPushLockSharedToExclusive( + &GET_HASH_ENTRY(CmpCacheTable, k->ConvKey).Lock)) + { + GET_HASH_ENTRY(CmpCacheTable, + k->ConvKey).Owner = KeGetCurrentThread(); + return TRUE; + } + return FALSE; +} + // // Releases an exlusively or shared acquired KCB // @@ -124,6 +180,25 @@ CmpIsKeyValueBig(IN PHHIVE Hive, (k)->ConvKey).Lock); \ } +// +// Releases an exlusively or shared acquired KCB by index +// +#define CmpReleaseKcbLockByIndex(i) \ +{ \ + CmpCacheTable[(i)].Owner = NULL; \ + ExReleasePushLock(&CmpCacheTable[(i)].Lock); \ +} + +// +// Releases an exlusively or shared acquired KCB by key +// +#define CmpReleaseKcbLockByKey(k) \ +{ \ + GET_HASH_ENTRY(CmpCacheTable, (k)).Owner = NULL; \ + ExReleasePushLock(&GET_HASH_ENTRY(CmpCacheTable, \ + (k)).Lock); \ +} + // // Exclusively acquires an NCB // diff --git a/reactos/ntoskrnl/config/cmkcbncb.c b/reactos/ntoskrnl/config/cmkcbncb.c index 45468d9d5e9..b91c2c7b334 100644 --- a/reactos/ntoskrnl/config/cmkcbncb.c +++ b/reactos/ntoskrnl/config/cmkcbncb.c @@ -16,8 +16,8 @@ /* GLOBALS *******************************************************************/ ULONG CmpHashTableSize = 2048; -PCM_KEY_HASH_TABLE_ENTRY *CmpCacheTable; -PCM_NAME_HASH_TABLE_ENTRY *CmpNameCacheTable; +PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable; +PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable; LIST_ENTRY CmpFreeKCBListHead;