- DBGKD_WAIT_STATE_CHANGE64 is used in KD protocol 5, not number 6 that we use. Proto...
[reactos.git] / reactos / lib / cmlib / cminit.c
index c401396..59b3843 100644 (file)
@@ -6,6 +6,10 @@
  */
 
 #include "cmlib.h"
+#define NDEBUG
+#include <debug.h>
+
+ULONG CmlibTraceLevel = 0;
 
 BOOLEAN CMAPI
 CmCreateRootNode(
@@ -16,67 +20,117 @@ CmCreateRootNode(
    HCELL_INDEX RootCellIndex;
    SIZE_T NameSize;
 
-   NameSize = wcslen(Name) * sizeof(WCHAR);
-   RootCellIndex = HvAllocateCell(Hive, sizeof(CM_KEY_NODE) + NameSize, HvStable);
-   if (RootCellIndex == HCELL_NULL)
-      return FALSE;
+   /* Allocate the cell */
+   NameSize = utf16_wcslen(Name) * sizeof(WCHAR);
+   RootCellIndex = HvAllocateCell(Hive,
+                                  FIELD_OFFSET(CM_KEY_NODE, Name) + NameSize,
+                                  Stable,
+                                  HCELL_NIL);
+   if (RootCellIndex == HCELL_NIL) return FALSE;
 
-   Hive->HiveHeader->RootCell = RootCellIndex;
-   Hive->HiveHeader->Checksum = HvpHiveHeaderChecksum(Hive->HiveHeader);
+   /* Seutp the base block */
+   Hive->BaseBlock->RootCell = RootCellIndex;
+   Hive->BaseBlock->CheckSum = HvpHiveHeaderChecksum(Hive->BaseBlock);
 
+   /* Get the key cell */
    KeyCell = (PCM_KEY_NODE)HvGetCell(Hive, RootCellIndex);
-   KeyCell->Id = REG_KEY_CELL_ID;
-   KeyCell->Flags = REG_KEY_ROOT_CELL;
+   if (!KeyCell) return FALSE;
+
+   /* Setup the cell */
+   KeyCell->Signature = (USHORT)CM_KEY_NODE_SIGNATURE;
+   KeyCell->Flags = KEY_HIVE_ENTRY | KEY_NO_DELETE;
    KeyCell->LastWriteTime.QuadPart = 0;
-   KeyCell->Parent = HCELL_NULL;
-   KeyCell->SubKeyCounts[0] = 0;
-   KeyCell->SubKeyCounts[1] = 0;
-   KeyCell->SubKeyLists[0] = HCELL_NULL;
-   KeyCell->SubKeyLists[1] = HCELL_NULL;
+   KeyCell->Parent = HCELL_NIL;
+   KeyCell->SubKeyCounts[Stable] = 0;
+   KeyCell->SubKeyCounts[Volatile] = 0;
+   KeyCell->SubKeyLists[Stable] = HCELL_NIL;
+   KeyCell->SubKeyLists[Volatile] = HCELL_NIL;
    KeyCell->ValueList.Count = 0;
-   KeyCell->ValueList.List = HCELL_NULL;
-   KeyCell->SecurityKeyOffset = HCELL_NULL;
-   KeyCell->ClassNameOffset = HCELL_NULL; 
-   KeyCell->NameSize = (USHORT)NameSize;
-   KeyCell->ClassSize = 0;
+   KeyCell->ValueList.List = HCELL_NIL;
+   KeyCell->Security = HCELL_NIL;
+   KeyCell->Class = HCELL_NIL;
+   KeyCell->ClassLength = 0;
+   KeyCell->MaxNameLen = 0;
+   KeyCell->MaxClassLen = 0;
+   KeyCell->MaxValueNameLen = 0;
+   KeyCell->MaxValueDataLen = 0;
+   
+   /* Write the name */
+   KeyCell->NameLength = (USHORT)NameSize;
    memcpy(KeyCell->Name, Name, NameSize);
 
+   /* Return success */
+   HvReleaseCell(Hive, RootCellIndex);
    return TRUE;
 }
 
 static VOID CMAPI
 CmpPrepareKey(
    PHHIVE RegistryHive,
-   PCM_KEY_NODE KeyCell)
+   PCM_KEY_NODE KeyCell);
+
+static VOID CMAPI
+CmpPrepareIndexOfKeys(
+   PHHIVE RegistryHive,
+   PCM_KEY_INDEX IndexCell)
 {
-   PCM_KEY_NODE SubKeyCell;
-   PHASH_TABLE_CELL HashCell;
    ULONG i;
 
-   ASSERT(KeyCell->Id == REG_KEY_CELL_ID);
-
-   KeyCell->SubKeyLists[HvVolatile] = HCELL_NULL;
-   KeyCell->SubKeyCounts[HvVolatile] = 0;
-
-   /* Enumerate and add subkeys */
-   if (KeyCell->SubKeyCounts[HvStable] > 0)
+   if (IndexCell->Signature == CM_KEY_INDEX_ROOT ||
+       IndexCell->Signature == CM_KEY_INDEX_LEAF)
    {
-      HashCell = HvGetCell(RegistryHive, KeyCell->SubKeyLists[HvStable]);
-
-      for (i = 0; i < KeyCell->SubKeyCounts[HvStable]; i++)
+      for (i = 0; i < IndexCell->Count; i++)
       {
-         SubKeyCell = HvGetCell(RegistryHive, HashCell->Table[i].KeyOffset);
+         PCM_KEY_INDEX SubIndexCell = HvGetCell(RegistryHive, IndexCell->List[i]);
+         if (SubIndexCell->Signature == CM_KEY_NODE_SIGNATURE)
+            CmpPrepareKey(RegistryHive, (PCM_KEY_NODE)SubIndexCell);
+         else
+            CmpPrepareIndexOfKeys(RegistryHive, SubIndexCell);
+      }
+   }
+   else if (IndexCell->Signature == CM_KEY_FAST_LEAF ||
+            IndexCell->Signature == CM_KEY_HASH_LEAF)
+   {
+      PCM_KEY_FAST_INDEX HashCell = (PCM_KEY_FAST_INDEX)IndexCell;
+      for (i = 0; i < HashCell->Count; i++)
+      {
+         PCM_KEY_NODE SubKeyCell = HvGetCell(RegistryHive, HashCell->List[i].Cell);
          CmpPrepareKey(RegistryHive, SubKeyCell);
       }
    }
+   else
+   {
+      DPRINT1("IndexCell->Signature %x\n", IndexCell->Signature);
+      ASSERT(FALSE);
+   }
+}
+
+static VOID CMAPI
+CmpPrepareKey(
+   PHHIVE RegistryHive,
+   PCM_KEY_NODE KeyCell)
+{
+   PCM_KEY_INDEX IndexCell;
+
+   ASSERT(KeyCell->Signature == CM_KEY_NODE_SIGNATURE);
+
+   KeyCell->SubKeyLists[Volatile] = HCELL_NIL;
+   KeyCell->SubKeyCounts[Volatile] = 0;
+
+   /* Enumerate and add subkeys */
+   if (KeyCell->SubKeyCounts[Stable] > 0)
+   {
+      IndexCell = HvGetCell(RegistryHive, KeyCell->SubKeyLists[Stable]);
+      CmpPrepareIndexOfKeys(RegistryHive, IndexCell);
+   }
 }
 
 VOID CMAPI
 CmPrepareHive(
    PHHIVE RegistryHive)
-{ 
+{
    PCM_KEY_NODE RootCell;
 
-   RootCell = HvGetCell(RegistryHive, RegistryHive->HiveHeader->RootCell);
+   RootCell = HvGetCell(RegistryHive, RegistryHive->BaseBlock->RootCell);
    CmpPrepareKey(RegistryHive, RootCell);
 }