- Fix calls to HvInitializeHive
[reactos.git] / reactos / lib / cmlib / cminit.c
1 /*
2 * PROJECT: registry manipulation library
3 * LICENSE: GPL - See COPYING in the top level directory
4 * COPYRIGHT: Copyright 2005 Filip Navara <navaraf@reactos.org>
5 * Copyright 2001 - 2005 Eric Kohl
6 */
7
8 #include "cmlib.h"
9
10 BOOLEAN CMAPI
11 CmCreateRootNode(
12 PHHIVE Hive,
13 PCWSTR Name)
14 {
15 PCM_KEY_NODE KeyCell;
16 HCELL_INDEX RootCellIndex;
17 SIZE_T NameSize;
18
19 NameSize = wcslen(Name) * sizeof(WCHAR);
20 RootCellIndex = HvAllocateCell(Hive, sizeof(CM_KEY_NODE) + NameSize, HvStable);
21 if (RootCellIndex == HCELL_NULL)
22 return FALSE;
23
24 Hive->HiveHeader->RootCell = RootCellIndex;
25 Hive->HiveHeader->Checksum = HvpHiveHeaderChecksum(Hive->HiveHeader);
26
27 KeyCell = (PCM_KEY_NODE)HvGetCell(Hive, RootCellIndex);
28 KeyCell->Id = REG_KEY_CELL_ID;
29 KeyCell->Flags = REG_KEY_ROOT_CELL;
30 KeyCell->LastWriteTime.QuadPart = 0;
31 KeyCell->Parent = HCELL_NULL;
32 KeyCell->SubKeyCounts[0] = 0;
33 KeyCell->SubKeyCounts[1] = 0;
34 KeyCell->SubKeyLists[0] = HCELL_NULL;
35 KeyCell->SubKeyLists[1] = HCELL_NULL;
36 KeyCell->ValueList.Count = 0;
37 KeyCell->ValueList.List = HCELL_NULL;
38 KeyCell->SecurityKeyOffset = HCELL_NULL;
39 KeyCell->ClassNameOffset = HCELL_NULL;
40 KeyCell->NameSize = (USHORT)NameSize;
41 KeyCell->ClassSize = 0;
42 memcpy(KeyCell->Name, Name, NameSize);
43
44 return TRUE;
45 }
46
47 static VOID CMAPI
48 CmpPrepareKey(
49 PHHIVE RegistryHive,
50 PCM_KEY_NODE KeyCell)
51 {
52 PCM_KEY_NODE SubKeyCell;
53 PHASH_TABLE_CELL HashCell;
54 ULONG i;
55
56 ASSERT(KeyCell->Id == REG_KEY_CELL_ID);
57
58 KeyCell->SubKeyLists[HvVolatile] = HCELL_NULL;
59 KeyCell->SubKeyCounts[HvVolatile] = 0;
60
61 /* Enumerate and add subkeys */
62 if (KeyCell->SubKeyCounts[HvStable] > 0)
63 {
64 HashCell = HvGetCell(RegistryHive, KeyCell->SubKeyLists[HvStable]);
65
66 for (i = 0; i < KeyCell->SubKeyCounts[HvStable]; i++)
67 {
68 SubKeyCell = HvGetCell(RegistryHive, HashCell->Table[i].KeyOffset);
69 CmpPrepareKey(RegistryHive, SubKeyCell);
70 }
71 }
72 }
73
74 VOID CMAPI
75 CmPrepareHive(
76 PHHIVE RegistryHive)
77 {
78 PCM_KEY_NODE RootCell;
79
80 RootCell = HvGetCell(RegistryHive, RegistryHive->HiveHeader->RootCell);
81 CmpPrepareKey(RegistryHive, RootCell);
82 }