Author: fireball
Date: Sat Oct 27 00:59:42 2007
New Revision: 29902
URL: 
http://svn.reactos.org/svn/reactos?rev=29902&view=rev
Log:
- Define LIST_ENTRY functions as part of host headers, instead of mkhive-specific defines.
- Use CM_KEY_CONTROL_BLOCK when communicating with new CM implementation
("config"). CM now builds a dummy KCB so that the functions in
"config" can go around their business with KCB without needing to know what a
ros-specific PKEY_OBJECT is.
Modified:
    trunk/reactos/include/host/typedefs.h
    trunk/reactos/ntoskrnl/cm/cm.h
    trunk/reactos/ntoskrnl/cm/ntfunc.c
    trunk/reactos/ntoskrnl/config/cm.h
    trunk/reactos/ntoskrnl/config/cmapi.c
    trunk/reactos/ntoskrnl/config/cmvalche.c
    trunk/reactos/tools/mkhive/registry.h
Modified: trunk/reactos/include/host/typedefs.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/host/typedefs.h?re…
==============================================================================
--- trunk/reactos/include/host/typedefs.h (original)
+++ trunk/reactos/include/host/typedefs.h Sat Oct 27 00:59:42 2007
@@ -120,6 +120,102 @@
 } UNICODE_STRING, *PUNICODE_STRING;
 #include <host/poppack.h>
+//
+// List Functions
+//
+static inline
+VOID
+InitializeListHead(
+                   IN PLIST_ENTRY ListHead
+                   )
+{
+    ListHead->Flink = ListHead->Blink = ListHead;
+}
+
+static inline
+VOID
+InsertHeadList(
+               IN PLIST_ENTRY ListHead,
+               IN PLIST_ENTRY Entry
+               )
+{
+    PLIST_ENTRY OldFlink;
+    OldFlink = ListHead->Flink;
+    Entry->Flink = OldFlink;
+    Entry->Blink = ListHead;
+    OldFlink->Blink = Entry;
+    ListHead->Flink = Entry;
+}
+
+static inline
+VOID
+InsertTailList(
+               IN PLIST_ENTRY ListHead,
+               IN PLIST_ENTRY Entry
+               )
+{
+    PLIST_ENTRY OldBlink;
+    OldBlink = ListHead->Blink;
+    Entry->Flink = ListHead;
+    Entry->Blink = OldBlink;
+    OldBlink->Flink = Entry;
+    ListHead->Blink = Entry;
+}
+
+BOOLEAN
+static inline
+IsListEmpty(
+            IN const LIST_ENTRY * ListHead
+            )
+{
+    return (BOOLEAN)(ListHead->Flink == ListHead);
+}
+
+static inline
+BOOLEAN
+RemoveEntryList(
+                IN PLIST_ENTRY Entry)
+{
+    PLIST_ENTRY OldFlink;
+    PLIST_ENTRY OldBlink;
+
+    OldFlink = Entry->Flink;
+    OldBlink = Entry->Blink;
+    OldFlink->Blink = OldBlink;
+    OldBlink->Flink = OldFlink;
+    return (BOOLEAN)(OldFlink == OldBlink);
+}
+
+static inline
+PLIST_ENTRY
+RemoveHeadList(
+               IN PLIST_ENTRY ListHead)
+{
+    PLIST_ENTRY Flink;
+    PLIST_ENTRY Entry;
+
+    Entry = ListHead->Flink;
+    Flink = Entry->Flink;
+    ListHead->Flink = Flink;
+    Flink->Blink = ListHead;
+    return Entry;
+}
+
+static inline
+PLIST_ENTRY
+RemoveTailList(
+               IN PLIST_ENTRY ListHead)
+{
+    PLIST_ENTRY Blink;
+    PLIST_ENTRY Entry;
+
+    Entry = ListHead->Blink;
+    Blink = Entry->Blink;
+    ListHead->Blink = Blink;
+    Blink->Flink = ListHead;
+    return Entry;
+}
+
 typedef const UNICODE_STRING *PCUNICODE_STRING;
 #define NT_SUCCESS(x) ((x)>=0)
Modified: trunk/reactos/ntoskrnl/cm/cm.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/cm.h?rev=29902…
==============================================================================
--- trunk/reactos/ntoskrnl/cm/cm.h (original)
+++ trunk/reactos/ntoskrnl/cm/cm.h Sat Oct 27 00:59:42 2007
@@ -114,6 +114,51 @@
   CACHED_CHILD_LIST ValueCache;
 } KEY_OBJECT, *PKEY_OBJECT;
+//
+// Key Control Block (KCB) for old Cm (just so it can talk to New CM)
+//
+typedef struct _CM_KEY_CONTROL_BLOCK
+{
+    USHORT RefCount;
+    USHORT Flags;
+    ULONG ExtFlags:8;
+    ULONG PrivateAlloc:1;
+    ULONG Delete:1;
+    ULONG DelayedCloseIndex:12;
+    ULONG TotalLevels:10;
+    union
+    {
+        //CM_KEY_HASH KeyHash;
+        struct
+        {
+            ULONG ConvKey;
+            PVOID NextHash;
+            PHHIVE KeyHive;
+            HCELL_INDEX KeyCell;
+        };
+    };
+    struct _CM_KEY_CONTROL_BLOCK *ParentKcb;
+    PVOID NameBlock;
+    PVOID CachedSecurity;
+    CACHED_CHILD_LIST ValueCache;
+    PVOID IndexHint;
+    ULONG HashKey;
+    ULONG SubKeyCount;
+    union
+    {
+        LIST_ENTRY KeyBodyListHead;
+        LIST_ENTRY FreeListEntry;
+    };
+    PVOID KeyBodyArray[4];
+    PVOID DelayCloseEntry;
+    LARGE_INTEGER KcbLastWriteTime;
+    USHORT KcbMaxNameLen;
+    USHORT KcbMaxValueNameLen;
+    ULONG KcbMaxValueDataLen;
+    ULONG InDelayClose;
+} CM_KEY_CONTROL_BLOCK, *PCM_KEY_CONTROL_BLOCK;
+
+
 /* Bits 31-22 (top 10 bits) of the cell index is the directory index */
 #define CmiDirectoryIndex(CellIndex)(CellIndex & 0xffc000000)
 /* Bits 21-12 (middle 10 bits) of the cell index is the table index */
@@ -222,12 +267,12 @@
 NTSTATUS
 NTAPI
-CmDeleteValueKey(IN PKEY_OBJECT KeyControlBlock,
+CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
                  IN UNICODE_STRING ValueName);
 NTSTATUS
 NTAPI
-CmQueryValueKey(IN PKEY_OBJECT KeyObject,
+CmQueryValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
                 IN UNICODE_STRING ValueName,
                 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                 IN PVOID KeyValueInformation,
@@ -236,7 +281,7 @@
 NTSTATUS
 NTAPI
-CmEnumerateValueKey(IN PKEY_OBJECT KeyObject,
+CmEnumerateValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
                     IN ULONG Index,
                     IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                     IN PVOID KeyValueInformation,
@@ -245,7 +290,7 @@
 NTSTATUS
 NTAPI
-CmSetValueKey(IN PKEY_OBJECT KeyObject,
+CmSetValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
               IN PUNICODE_STRING ValueName,
               IN ULONG Type,
               IN PVOID Data,
@@ -253,7 +298,7 @@
 NTSTATUS
 NTAPI
-CmQueryKey(IN PKEY_OBJECT KeyObject,
+CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
            IN KEY_INFORMATION_CLASS KeyInformationClass,
            IN PVOID KeyInformation,
            IN ULONG Length,
@@ -261,7 +306,7 @@
 NTSTATUS
 NTAPI
-CmEnumerateKey(IN PKEY_OBJECT KeyObject,
+CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
                IN ULONG Index,
                IN KEY_INFORMATION_CLASS KeyInformationClass,
                IN PVOID KeyInformation,
@@ -270,7 +315,7 @@
 NTSTATUS
 NTAPI
-CmDeleteKey(IN PKEY_OBJECT KeyObject);
+CmDeleteKey(IN PCM_KEY_CONTROL_BLOCK Kcb);
 NTSTATUS
 CmiAllocateHashTableCell(IN PEREGISTRY_HIVE RegistryHive,
@@ -317,8 +362,6 @@
     IN PUNICODE_STRING Name
 );
-/* NOTE: This function declaration is currently duplicated in both     */
-/* cm/cm.h and config/cm.h. TODO: Pick one single place to declare it. */
 HCELL_INDEX
 NTAPI
 CmpFindSubKeyByName(
@@ -342,8 +385,6 @@
     IN PVOID ParseContext
 );
-/* NOTE: This function declaration is currently duplicated in both     */
-/* cm/cm.h and config/cm.h. TODO: Pick one single place to declare it. */
 NTSTATUS
 NTAPI
 CmpOpenHiveFiles(IN PCUNICODE_STRING BaseName,
Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/ntfunc.c?rev=2…
==============================================================================
--- trunk/reactos/ntoskrnl/cm/ntfunc.c (original)
+++ trunk/reactos/ntoskrnl/cm/ntfunc.c Sat Oct 27 00:59:42 2007
@@ -24,7 +24,6 @@
 /* GLOBALS ******************************************************************/
 extern POBJECT_TYPE  CmpKeyObjectType;
-
 static BOOLEAN CmiRegistryInitialized = FALSE;
 /* FUNCTIONS ****************************************************************/
@@ -709,8 +708,13 @@
     Status = CmiCallRegisteredCallbacks(RegNtPreDeleteKey, &DeleteKeyInfo);
     if (NT_SUCCESS(Status))
     {
+        /* HACK: Setup the Dummy KCB */
+        CM_KEY_CONTROL_BLOCK DummyKcb = {0};
+        DummyKcb.KeyHive = &KeyObject->RegistryHive->Hive;
+        DummyKcb.KeyCell = KeyObject->KeyCellOffset;
+
         /* Call the internal API */
-        Status = CmDeleteKey(KeyObject);
+        Status = CmDeleteKey(&DummyKcb);
         /* Remove the keep-alive reference */
         ObDereferenceObject(KeyObject);
@@ -773,8 +777,13 @@
     Status = CmiCallRegisteredCallbacks(RegNtPreEnumerateKey, &EnumerateKeyInfo);
     if (NT_SUCCESS(Status))
     {
+        /* HACK: Setup the Dummy KCB */
+        CM_KEY_CONTROL_BLOCK DummyKcb = {0};
+        DummyKcb.KeyHive = &KeyObject->RegistryHive->Hive;
+        DummyKcb.KeyCell = KeyObject->KeyCellOffset;
+
         /* Call the internal API */
-        Status = CmEnumerateKey(KeyObject,
+        Status = CmEnumerateKey(&DummyKcb,
                                 Index,
                                 KeyInformationClass,
                                 KeyInformation,
@@ -836,8 +845,13 @@
                                         &EnumerateValueKeyInfo);
     if (NT_SUCCESS(Status))
     {
+        /* HACK: Setup the Dummy KCB */
+        CM_KEY_CONTROL_BLOCK DummyKcb = {0};
+        DummyKcb.KeyHive = &KeyObject->RegistryHive->Hive;
+        DummyKcb.KeyCell = KeyObject->KeyCellOffset;
+
         /* Call the internal API */
-        Status = CmEnumerateValueKey(KeyObject,
+        Status = CmEnumerateValueKey(&DummyKcb,
                                      Index,
                                      KeyValueInformationClass,
                                      KeyValueInformation,
@@ -897,8 +911,13 @@
     Status = CmiCallRegisteredCallbacks(RegNtPreQueryKey, &QueryKeyInfo);
     if (NT_SUCCESS(Status))
     {
+        /* HACK: Setup the Dummy KCB */
+        CM_KEY_CONTROL_BLOCK DummyKcb = {0};
+        DummyKcb.KeyHive = &KeyObject->RegistryHive->Hive;
+        DummyKcb.KeyCell = KeyObject->KeyCellOffset;
+
         /* Call the internal API */
-        Status = CmQueryKey(KeyObject,
+        Status = CmQueryKey(&DummyKcb,
                             KeyInformationClass,
                             KeyInformation,
                             Length,
@@ -957,8 +976,13 @@
     Status = CmiCallRegisteredCallbacks(RegNtPreQueryValueKey, &QueryValueKeyInfo);
     if (NT_SUCCESS(Status))
     {
+        /* HACK: Setup the Dummy KCB */
+        CM_KEY_CONTROL_BLOCK DummyKcb = {0};
+        DummyKcb.KeyHive = &KeyObject->RegistryHive->Hive;
+        DummyKcb.KeyCell = KeyObject->KeyCellOffset;
+
         /* Call the internal API */
-        Status = CmQueryValueKey(KeyObject,
+        Status = CmQueryValueKey(&DummyKcb,
                                  *ValueName,
                                  KeyValueInformationClass,
                                  KeyValueInformation,
@@ -1021,8 +1045,13 @@
     Status = CmiCallRegisteredCallbacks(RegNtPreSetValueKey, &SetValueKeyInfo);
     if (NT_SUCCESS(Status))
     {
+        /* HACK: Setup the Dummy KCB */
+        CM_KEY_CONTROL_BLOCK DummyKcb = {0};
+        DummyKcb.KeyHive = &KeyObject->RegistryHive->Hive;
+        DummyKcb.KeyCell = KeyObject->KeyCellOffset;
+
         /* Call the internal API */
-        Status = CmSetValueKey(KeyObject,
+        Status = CmSetValueKey(&DummyKcb,
                                ValueName,
                                Type,
                                Data,
@@ -1071,8 +1100,13 @@
                                         &DeleteValueKeyInfo);
     if (NT_SUCCESS(Status))
     {
+        /* HACK: Setup the Dummy KCB */
+        CM_KEY_CONTROL_BLOCK DummyKcb = {0};
+        DummyKcb.KeyHive = &KeyObject->RegistryHive->Hive;
+        DummyKcb.KeyCell = KeyObject->KeyCellOffset;
+
         /* Call the internal API */
-        Status = CmDeleteValueKey(KeyObject, *ValueName);
+        Status = CmDeleteValueKey(&DummyKcb, *ValueName);
         /* Do the post callback */
         PostOperationInfo.Object = (PVOID)KeyObject;
Modified: trunk/reactos/ntoskrnl/config/cm.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cm.h?rev=2…
==============================================================================
--- trunk/reactos/ntoskrnl/config/cm.h (original)
+++ trunk/reactos/ntoskrnl/config/cm.h Sat Oct 27 00:59:42 2007
@@ -710,7 +710,7 @@
 VALUE_SEARCH_RETURN_TYPE
 NTAPI
 CmpFindValueByNameFromCache(
-    IN PKEY_OBJECT KeyObject,
+    IN PCM_KEY_CONTROL_BLOCK Kcb,
     IN PCUNICODE_STRING Name,
     OUT PCM_CACHED_VALUE **CachedValue,
     OUT ULONG *Index,
@@ -722,7 +722,7 @@
 VALUE_SEARCH_RETURN_TYPE
 NTAPI
 CmpQueryKeyValueData(
-    IN PKEY_OBJECT KeyObject,
+    IN PCM_KEY_CONTROL_BLOCK Kcb,
     IN PCM_CACHED_VALUE *CachedValue,
     IN PCM_KEY_VALUE ValueKey,
     IN BOOLEAN ValueIsCached,
@@ -736,7 +736,7 @@
 VALUE_SEARCH_RETURN_TYPE
 NTAPI
 CmpGetValueListFromCache(
-    IN PKEY_OBJECT KeyObject,
+    IN PCM_KEY_CONTROL_BLOCK Kcb,
     OUT PCELL_DATA *CellData,
     OUT BOOLEAN *IndexIsCached,
     OUT PHCELL_INDEX ValueListToRelease
@@ -745,7 +745,7 @@
 VALUE_SEARCH_RETURN_TYPE
 NTAPI
 CmpGetValueKeyFromCache(
-    IN PKEY_OBJECT KeyObject,
+    IN PCM_KEY_CONTROL_BLOCK Kcb,
     IN PCELL_DATA CellData,
     IN ULONG Index,
     OUT PCM_CACHED_VALUE **CachedValue,
@@ -979,7 +979,7 @@
 #if 0
     IN PCM_KEY_BODY KeyObject,
 #else
-    IN PKEY_OBJECT KeyObject,
+    IN PVOID KeyObject,
 #endif
     IN ULONG Flags
 );
Modified: trunk/reactos/ntoskrnl/config/cmapi.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmapi.c?re…
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmapi.c (original)
+++ trunk/reactos/ntoskrnl/config/cmapi.c Sat Oct 27 00:59:42 2007
@@ -216,7 +216,7 @@
 NTSTATUS
 NTAPI
-CmSetValueKey(IN PKEY_OBJECT KeyObject,
+CmSetValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
               IN PUNICODE_STRING ValueName,
               IN ULONG Type,
               IN PVOID Data,
@@ -235,11 +235,11 @@
     ExAcquireResourceExclusiveLite(&CmpRegistryLock, TRUE);
     /* Get pointer to key cell */
-    Parent = KeyObject->KeyCell;
-    Hive = &KeyObject->RegistryHive->Hive;
-    Cell = KeyObject->KeyCellOffset;
+    Hive = Kcb->KeyHive;
+    Cell = Kcb->KeyCell;
     /* Prepare to scan the key node */
+    Parent = (PCM_KEY_NODE)HvGetCell(Hive, Cell);
     Count = Parent->ValueList.Count;
     Found = FALSE;
     if (Count > 0)
@@ -343,7 +343,7 @@
 NTSTATUS
 NTAPI
-CmDeleteValueKey(IN PKEY_OBJECT KeyObject,
+CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
                  IN UNICODE_STRING ValueName)
 {
     NTSTATUS Status = STATUS_OBJECT_NAME_NOT_FOUND;
@@ -360,8 +360,8 @@
     ExAcquireResourceExclusiveLite(&CmpRegistryLock, TRUE);
     /* Get the hive and the cell index */
-    Hive = &KeyObject->RegistryHive->Hive;
-    Cell = KeyObject->KeyCellOffset;
+    Hive = Kcb->KeyHive;
+    Cell = Kcb->KeyCell;
     /* Get the parent key node */
     Parent = (PCM_KEY_NODE)HvGetCell(Hive, Cell);
@@ -458,7 +458,7 @@
 NTSTATUS
 NTAPI
-CmQueryValueKey(IN PKEY_OBJECT KeyObject,
+CmQueryValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
                 IN UNICODE_STRING ValueName,
                 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                 IN PVOID KeyValueInformation,
@@ -480,10 +480,10 @@
     ExAcquireResourceExclusiveLite(&CmpRegistryLock, TRUE);
     /* Get the hive */
-    Hive = &KeyObject->RegistryHive->Hive;
+    Hive = Kcb->KeyHive;
     /* Find the key value */
-    Result = CmpFindValueByNameFromCache(KeyObject,
+    Result = CmpFindValueByNameFromCache(Kcb,
                                          &ValueName,
                                          &CachedValue,
                                          &Index,
@@ -496,7 +496,7 @@
         ASSERT(ValueData != NULL);
         /* Query the information requested */
-        Result = CmpQueryKeyValueData(KeyObject,
+        Result = CmpQueryKeyValueData(Kcb,
                                       CachedValue,
                                       ValueData,
                                       ValueCached,
@@ -523,7 +523,7 @@
 NTSTATUS
 NTAPI
-CmEnumerateValueKey(IN PKEY_OBJECT KeyObject,
+CmEnumerateValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
                     IN ULONG Index,
                     IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                     IN PVOID KeyValueInformation,
@@ -546,8 +546,8 @@
     ExAcquireResourceExclusiveLite(&CmpRegistryLock, TRUE);
     /* Get the hive and parent */
-    Hive = &KeyObject->RegistryHive->Hive;
-    Parent = (PCM_KEY_NODE)HvGetCell(Hive, KeyObject->KeyCellOffset);
+    Hive = Kcb->KeyHive;
+    Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell);
     if (!Parent)
     {
         /* Fail */
@@ -556,17 +556,17 @@
     }
     /* Make sure the index is valid */
-    //if (Index >= KeyObject->ValueCache.Count)
-    if (Index >= KeyObject->KeyCell->ValueList.Count)
+    //if (Index >= Kcb->ValueCache.Count)
+    if (Index >= Parent->ValueList.Count)
     {
         /* Release the cell and fail */
-        HvReleaseCell(Hive, KeyObject->KeyCellOffset);
+        HvReleaseCell(Hive, Kcb->KeyCell);
         Status = STATUS_NO_MORE_ENTRIES;
         goto Quickie;
     }
     /* Find the value list */
-    Result = CmpGetValueListFromCache(KeyObject,
+    Result = CmpGetValueListFromCache(Kcb,
                                       &CellData,
                                       &IndexIsCached,
                                       &CellToRelease);
@@ -581,7 +581,7 @@
     }
     /* Now get the key value */
-    Result = CmpGetValueKeyFromCache(KeyObject,
+    Result = CmpGetValueKeyFromCache(Kcb,
                                      CellData,
                                      Index,
                                      &CachedValue,
@@ -600,7 +600,7 @@
     }
     /* Query the information requested */
-    Result = CmpQueryKeyValueData(KeyObject,
+    Result = CmpQueryKeyValueData(Kcb,
                                   CachedValue,
                                   ValueData,
                                   ValueIsCached,
@@ -615,7 +615,7 @@
     if (CellToRelease != HCELL_NIL) HvReleaseCell(Hive, CellToRelease);
     /* Release the parent cell */
-    HvReleaseCell(Hive, KeyObject->KeyCellOffset);
+    HvReleaseCell(Hive, Kcb->KeyCell);
     /* If we have a cell to release, do so */
     if (CellToRelease2 != HCELL_NIL) HvReleaseCell(Hive, CellToRelease2);
@@ -852,7 +852,7 @@
 NTSTATUS
 NTAPI
-CmQueryKey(IN PKEY_OBJECT KeyObject,
+CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
            IN KEY_INFORMATION_CLASS KeyInformationClass,
            IN PVOID KeyInformation,
            IN ULONG Length,
@@ -867,8 +867,8 @@
     ExAcquireResourceExclusiveLite(&CmpRegistryLock, TRUE);
     /* Get the hive and parent */
-    Hive = &KeyObject->RegistryHive->Hive;
-    Parent = (PCM_KEY_NODE)HvGetCell(Hive, KeyObject->KeyCellOffset);
+    Hive = Kcb->KeyHive;
+    Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell);
     if (!Parent)
     {
         /* Fail */
@@ -921,7 +921,7 @@
 NTSTATUS
 NTAPI
-CmEnumerateKey(IN PKEY_OBJECT KeyObject,
+CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
                IN ULONG Index,
                IN KEY_INFORMATION_CLASS KeyInformationClass,
                IN PVOID KeyInformation,
@@ -938,8 +938,8 @@
     ExAcquireResourceExclusiveLite(&CmpRegistryLock, TRUE);
     /* Get the hive and parent */
-    Hive = &KeyObject->RegistryHive->Hive;
-    Parent = (PCM_KEY_NODE)HvGetCell(Hive, KeyObject->KeyCellOffset);
+    Hive = Kcb->KeyHive;
+    Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell);
     if (!Parent)
     {
         /* Fail */
@@ -951,7 +951,7 @@
     ChildCell = CmpFindSubKeyByNumber(Hive, Parent, Index);
     /* Release the parent cell */
-    HvReleaseCell(Hive, KeyObject->KeyCellOffset);
+    HvReleaseCell(Hive, Kcb->KeyCell);
     /* Check if we found the child */
     if (ChildCell == HCELL_NIL)
@@ -987,7 +987,7 @@
 NTSTATUS
 NTAPI
-CmDeleteKey(IN PKEY_OBJECT KeyObject)
+CmDeleteKey(IN PCM_KEY_CONTROL_BLOCK Kcb)
 {
     NTSTATUS Status;
     PHHIVE Hive;
@@ -999,23 +999,23 @@
     ExAcquireResourceExclusiveLite(&CmpRegistryLock, TRUE);
     /* Get the hive and node */
-    Hive = &KeyObject->RegistryHive->Hive;
-    Cell = KeyObject->KeyCellOffset;
-
-    /* Check if we have no parent */
-    if (!KeyObject->ParentKey)
-    {
-        /* This is an attempt to delete \Registry itself! */
-        Status = STATUS_CANNOT_DELETE;
-        goto Quickie;
-    }
-
+    Hive = Kcb->KeyHive;
+    Cell = Kcb->KeyCell;
+
     /* Get the key node */
     Node = (PCM_KEY_NODE)HvGetCell(Hive, Cell);
     if (!Node)
     {
         /* Fail */
         Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto Quickie;
+    }
+
+    /* Check if we have no parent */
+    if (!Node->Parent)
+    {
+        /* This is an attempt to delete \Registry itself! */
+        Status = STATUS_CANNOT_DELETE;
         goto Quickie;
     }
@@ -1042,26 +1042,26 @@
             }
             /* Clear the cell */
-            KeyObject->KeyCellOffset = HCELL_NIL;
+            Kcb->KeyCell = HCELL_NIL;
         }
     }
     else
     {
         /* Fail */
         Status = STATUS_CANNOT_DELETE;
+    }
+
+    /* Make sure we're file-backed */
+    if (!(IsNoFileHive((PEREGISTRY_HIVE)Kcb->KeyHive)) ||
+        !(IsNoFileHive((PEREGISTRY_HIVE)Kcb->ParentKcb->KeyHive)))
+    {
+        /* Sync up the hives */
+        CmiSyncHives();
     }
 Quickie:
     /* Release the cell */
     HvReleaseCell(Hive, Cell);
-
-    /* Make sure we're file-backed */
-    if (!(IsNoFileHive(KeyObject->RegistryHive)) ||
-        !(IsNoFileHive(KeyObject->ParentKey->RegistryHive)))
-    {
-        /* Sync up the hives */
-        CmiSyncHives();
-    }
     /* Release hive lock */
     ExReleaseResourceLite(&CmpRegistryLock);
Modified: trunk/reactos/ntoskrnl/config/cmvalche.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmvalche.c…
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmvalche.c (original)
+++ trunk/reactos/ntoskrnl/config/cmvalche.c Sat Oct 27 00:59:42 2007
@@ -42,7 +42,7 @@
 VALUE_SEARCH_RETURN_TYPE
 NTAPI
-CmpGetValueListFromCache(IN PKEY_OBJECT KeyObject,
+CmpGetValueListFromCache(IN PCM_KEY_CONTROL_BLOCK Kcb,
                          OUT PCELL_DATA *CellData,
                          OUT BOOLEAN *IndexIsCached,
                          OUT PHCELL_INDEX ValueListToRelease)
@@ -50,17 +50,19 @@
     PHHIVE Hive;
     PCACHED_CHILD_LIST ChildList;
     HCELL_INDEX CellToRelease;
+    PCM_KEY_NODE KeyNode;
     /* Set defaults */
     *ValueListToRelease = HCELL_NIL;
     *IndexIsCached = FALSE;
     /* Get the hive */
-    Hive = &KeyObject->RegistryHive->Hive;
+    Hive = Kcb->KeyHive;
+    KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell);
     /* Get the child value cache */
-    //ChildList = &KeyObject->ValueCache;
-    ChildList = (PCACHED_CHILD_LIST)&KeyObject->KeyCell->ValueList;
+    //ChildList = &Kcb->ValueCache;
+    ChildList = (PCACHED_CHILD_LIST)&KeyNode->ValueList;
     /* Check if the value is cached */
     if (CmpIsValueCached(ChildList->ValueList))
@@ -87,7 +89,7 @@
 VALUE_SEARCH_RETURN_TYPE
 NTAPI
-CmpGetValueKeyFromCache(IN PKEY_OBJECT KeyObject,
+CmpGetValueKeyFromCache(IN PCM_KEY_CONTROL_BLOCK Kcb,
                         IN PCELL_DATA CellData,
                         IN ULONG Index,
                         OUT PCM_CACHED_VALUE **CachedValue,
@@ -106,7 +108,7 @@
     *ValueIsCached = FALSE;
     /* Get the hive */
-    Hive = &KeyObject->RegistryHive->Hive;
+    Hive = Kcb->KeyHive;
     /* Check if the index was cached */
     if (IndexIsCached)
@@ -133,7 +135,7 @@
 VALUE_SEARCH_RETURN_TYPE
 NTAPI
-CmpGetValueDataFromCache(IN PKEY_OBJECT KeyObject,
+CmpGetValueDataFromCache(IN PCM_KEY_CONTROL_BLOCK Kcb,
                          IN PCM_CACHED_VALUE *CachedValue,
                          IN PCELL_DATA ValueKey,
                          IN BOOLEAN ValueIsCached,
@@ -154,7 +156,7 @@
     *CellToRelease = HCELL_NIL;
     /* Get the hive */
-    Hive = &KeyObject->RegistryHive->Hive;
+    Hive = Kcb->KeyHive;
     /* Check it the value is cached */
     if (ValueIsCached)
@@ -185,7 +187,7 @@
 VALUE_SEARCH_RETURN_TYPE
 NTAPI
-CmpFindValueByNameFromCache(IN PKEY_OBJECT KeyObject,
+CmpFindValueByNameFromCache(IN PCM_KEY_CONTROL_BLOCK Kcb,
                             IN PCUNICODE_STRING Name,
                             OUT PCM_CACHED_VALUE **CachedValue,
                             OUT ULONG *Index,
@@ -203,21 +205,25 @@
     BOOLEAN IndexIsCached;
     ULONG i = 0;
     HCELL_INDEX Cell = HCELL_NIL;
+    PCM_KEY_NODE KeyNode;
     /* Set defaults */
     *CellToRelease = HCELL_NIL;
     *Value = NULL;
-    /* Get the hive and child list */
-    Hive = &KeyObject->RegistryHive->Hive;
-    //ChildList = &KeyObject->ValueCache;
-    ChildList = (PCACHED_CHILD_LIST)&KeyObject->KeyCell->ValueList;
+    /* Get the hive */
+    Hive = Kcb->KeyHive;
+    KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell);
+
+    /* Get the child value cache */
+    //ChildList = &Kcb->ValueCache;
+    ChildList = (PCACHED_CHILD_LIST)&KeyNode->ValueList;
     /* Check if the child list has any entries */
     if (ChildList->Count != 0)
     {
         /* Get the value list associated to this child list */
-        SearchResult = CmpGetValueListFromCache(KeyObject,
+        SearchResult = CmpGetValueListFromCache(Kcb,
                                                 &CellData,
                                                 &IndexIsCached,
                                                 &Cell);
@@ -238,7 +244,7 @@
             }
             /* Get the key value for this index */
-            SearchResult =  CmpGetValueKeyFromCache(KeyObject,
+            SearchResult =  CmpGetValueKeyFromCache(Kcb,
                                                     CellData,
                                                     i,
                                                     CachedValue,
@@ -307,7 +313,7 @@
 VALUE_SEARCH_RETURN_TYPE
 NTAPI
-CmpQueryKeyValueData(IN PKEY_OBJECT KeyObject,
+CmpQueryKeyValueData(IN PCM_KEY_CONTROL_BLOCK Kcb,
                      IN PCM_CACHED_VALUE *CachedValue,
                      IN PCM_KEY_VALUE ValueKey,
                      IN BOOLEAN ValueIsCached,
@@ -328,7 +334,7 @@
     VALUE_SEARCH_RETURN_TYPE Result = SearchSuccess;
     /* Get the hive and cell data */
-    Hive = &KeyObject->RegistryHive->Hive;
+    Hive = Kcb->KeyHive;
     CellData = (PCELL_DATA)ValueKey;
     /* Check if the value is compressed */
@@ -492,7 +498,7 @@
                 else
                 {
                     /* Otherwise, we must retrieve it from the value cache */
-                    Result = CmpGetValueDataFromCache(KeyObject,
+                    Result = CmpGetValueDataFromCache(Kcb,
                                                       CachedValue,
                                                       CellData,
                                                       ValueIsCached,
@@ -587,7 +593,7 @@
                 else
                 {
                     /* Otherwise, we must retrieve it from the value cache */
-                    Result = CmpGetValueDataFromCache(KeyObject,
+                    Result = CmpGetValueDataFromCache(Kcb,
                                                       CachedValue,
                                                       CellData,
                                                       ValueIsCached,
Modified: trunk/reactos/tools/mkhive/registry.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/mkhive/registry.h?re…
==============================================================================
--- trunk/reactos/tools/mkhive/registry.h (original)
+++ trunk/reactos/tools/mkhive/registry.h Sat Oct 27 00:59:42 2007
@@ -63,121 +63,6 @@
 #define ERROR_MORE_DATA                  234L
 #define ERROR_NO_MORE_ITEMS              259L
-/*
- * VOID
- * InitializeListHead (
- *             PLIST_ENTRY     ListHead
- *             );
- *
- * FUNCTION: Initializes a double linked list
- * ARGUMENTS:
- *         ListHead = Caller supplied storage for the head of the list
- */
-#define InitializeListHead(ListHead) \
-{ \
-       (ListHead)->Flink = (ListHead); \
-       (ListHead)->Blink = (ListHead); \
-}
-
-
-/*
- * VOID
- * InsertHeadList (
- *             PLIST_ENTRY     ListHead,
- *             PLIST_ENTRY     Entry
- *             );
- *
- * FUNCTION: Inserts an entry in a double linked list
- * ARGUMENTS:
- *        ListHead = Head of the list
- *        Entry = Entry to insert
- */
-#define InsertHeadList(ListHead, ListEntry) \
-{ \
-       PLIST_ENTRY OldFlink; \
-       OldFlink = (ListHead)->Flink; \
-       (ListEntry)->Flink = OldFlink; \
-       (ListEntry)->Blink = (ListHead); \
-       OldFlink->Blink = (ListEntry); \
-       (ListHead)->Flink = (ListEntry); \
-       assert((ListEntry) != NULL); \
-       assert((ListEntry)->Blink!=NULL); \
-       assert((ListEntry)->Blink->Flink == (ListEntry)); \
-       assert((ListEntry)->Flink != NULL); \
-       assert((ListEntry)->Flink->Blink == (ListEntry)); \
-}
-
-
-/*
- * VOID
- * InsertTailList (
- *             PLIST_ENTRY     ListHead,
- *             PLIST_ENTRY     Entry
- *             );
- *
- * FUNCTION:
- *     Inserts an entry in a double linked list
- *
- * ARGUMENTS:
- *     ListHead = Head of the list
- *     Entry = Entry to insert
- */
-#define InsertTailList(ListHead, ListEntry) \
-{ \
-       PLIST_ENTRY OldBlink; \
-       OldBlink = (ListHead)->Blink; \
-       (ListEntry)->Flink = (ListHead); \
-       (ListEntry)->Blink = OldBlink; \
-       OldBlink->Flink = (ListEntry); \
-       (ListHead)->Blink = (ListEntry); \
-       assert((ListEntry) != NULL); \
-       assert((ListEntry)->Blink != NULL); \
-       assert((ListEntry)->Blink->Flink == (ListEntry)); \
-       assert((ListEntry)->Flink != NULL); \
-       assert((ListEntry)->Flink->Blink == (ListEntry)); \
-}
-
-/*
- *VOID
- *RemoveEntryList (
- *     PLIST_ENTRY     Entry
- *     );
- *
- * FUNCTION:
- *     Removes an entry from a double linked list
- *
- * ARGUMENTS:
- *     ListEntry = Entry to remove
- */
-#define RemoveEntryList(ListEntry) \
-{ \
-       PLIST_ENTRY OldFlink; \
-       PLIST_ENTRY OldBlink; \
-       assert((ListEntry) != NULL); \
-       assert((ListEntry)->Blink!=NULL); \
-       assert((ListEntry)->Blink->Flink == (ListEntry)); \
-       assert((ListEntry)->Flink != NULL); \
-       assert((ListEntry)->Flink->Blink == (ListEntry)); \
-       OldFlink = (ListEntry)->Flink; \
-       OldBlink = (ListEntry)->Blink; \
-       OldFlink->Blink = OldBlink; \
-       OldBlink->Flink = OldFlink; \
-       (ListEntry)->Flink = NULL; \
-       (ListEntry)->Blink = NULL; \
-}
-
-/*
- * PURPOSE: Returns the base address structure if the caller knows the
- * address of a field within the structure
- * ARGUMENTS:
- *          Address = address of the field
- *          Type = Type of the whole structure
- *          Field = Name of the field whose address is none
- */
-#define CONTAINING_RECORD(address, type, field) \
-    ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
-
-
 #define REG_NONE 0
 #define REG_SZ 1
 #define REG_EXPAND_SZ 2
@@ -241,3 +126,4 @@
 /* EOF */
+