/*
- * PROJECT: registry manipulation library
+ * PROJECT: Registry manipulation library
* LICENSE: GPL - See COPYING in the top level directory
* COPYRIGHT: Copyright 2005 Filip Navara <navaraf@reactos.org>
* Copyright 2001 - 2005 Eric Kohl
BOOLEAN CMAPI
CmCreateRootNode(
- PHHIVE Hive,
- PCWSTR Name)
+ PHHIVE Hive,
+ PCWSTR Name)
{
- PCM_KEY_NODE KeyCell;
- HCELL_INDEX RootCellIndex;
- ULONG NameSize;
-
- /* Allocate the cell */
- NameSize = (ULONG)strlenW(Name) * sizeof(WCHAR);
- RootCellIndex = HvAllocateCell(Hive,
- FIELD_OFFSET(CM_KEY_NODE, Name) + NameSize,
- Stable,
- HCELL_NIL);
- if (RootCellIndex == HCELL_NIL) return FALSE;
-
- /* 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);
- 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_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_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;
- RtlCopyMemory(KeyCell->Name, Name, NameSize);
-
- /* Return success */
- HvReleaseCell(Hive, RootCellIndex);
- return TRUE;
+ PCM_KEY_NODE KeyCell;
+ HCELL_INDEX RootCellIndex;
+ ULONG NameSize;
+
+ /* Allocate the cell */
+ NameSize = (ULONG)strlenW(Name) * sizeof(WCHAR);
+ RootCellIndex = HvAllocateCell(Hive,
+ FIELD_OFFSET(CM_KEY_NODE, Name) + NameSize,
+ Stable,
+ HCELL_NIL);
+ if (RootCellIndex == HCELL_NIL) return FALSE;
+
+ /* 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);
+ 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_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_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;
+ RtlCopyMemory(KeyCell->Name, Name, NameSize);
+
+ /* Return success */
+ HvReleaseCell(Hive, RootCellIndex);
+ return TRUE;
}
static VOID CMAPI
CmpPrepareKey(
- PHHIVE RegistryHive,
- PCM_KEY_NODE KeyCell);
+ PHHIVE RegistryHive,
+ PCM_KEY_NODE KeyCell);
static VOID CMAPI
CmpPrepareIndexOfKeys(
- PHHIVE RegistryHive,
- PCM_KEY_INDEX IndexCell)
+ PHHIVE RegistryHive,
+ PCM_KEY_INDEX IndexCell)
{
- ULONG i;
-
- if (IndexCell->Signature == CM_KEY_INDEX_ROOT ||
- IndexCell->Signature == CM_KEY_INDEX_LEAF)
- {
- for (i = 0; i < IndexCell->Count; i++)
- {
- 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);
+ ULONG i;
+
+ if (IndexCell->Signature == CM_KEY_INDEX_ROOT ||
+ IndexCell->Signature == CM_KEY_INDEX_LEAF)
+ {
+ for (i = 0; i < IndexCell->Count; i++)
+ {
+ 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)
+ PHHIVE RegistryHive,
+ PCM_KEY_NODE KeyCell)
{
- PCM_KEY_INDEX IndexCell;
+ PCM_KEY_INDEX IndexCell;
- ASSERT(KeyCell->Signature == CM_KEY_NODE_SIGNATURE);
+ ASSERT(KeyCell->Signature == CM_KEY_NODE_SIGNATURE);
- KeyCell->SubKeyLists[Volatile] = HCELL_NIL;
- KeyCell->SubKeyCounts[Volatile] = 0;
+ 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);
- }
+ /* Enumerate and add subkeys */
+ if (KeyCell->SubKeyCounts[Stable] > 0)
+ {
+ IndexCell = HvGetCell(RegistryHive, KeyCell->SubKeyLists[Stable]);
+ CmpPrepareIndexOfKeys(RegistryHive, IndexCell);
+ }
}
VOID CMAPI
CmPrepareHive(
- PHHIVE RegistryHive)
+ PHHIVE RegistryHive)
{
- PCM_KEY_NODE RootCell;
+ PCM_KEY_NODE RootCell;
- RootCell = HvGetCell(RegistryHive, RegistryHive->BaseBlock->RootCell);
- CmpPrepareKey(RegistryHive, RootCell);
+ RootCell = HvGetCell(RegistryHive, RegistryHive->BaseBlock->RootCell);
+ CmpPrepareKey(RegistryHive, RootCell);
}