Author: fireball Date: Mon Oct 29 00:31:46 2007 New Revision: 29943
URL: http://svn.reactos.org/svn/reactos?rev=29943&view=rev Log: - Move registry shareable types (not internal to ntoskrnl's configuration manager) to cmdata.h, so that freeldr/mkhive can access them too. - Remove all the ReactOS-specific versions of those types. - Change all code referencing the ReactOS-specific versions to use the real NT versions, and fix any related code to properly use the new fields.
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/binhive.c trunk/reactos/include/host/typedefs.h trunk/reactos/lib/cmlib/cmdata.h trunk/reactos/lib/cmlib/cminit.c trunk/reactos/lib/cmlib/cmlib.h trunk/reactos/lib/cmlib/hivedata.h trunk/reactos/ntoskrnl/cm/cm.h trunk/reactos/ntoskrnl/cm/ntfunc.c trunk/reactos/ntoskrnl/cm/regfile.c trunk/reactos/ntoskrnl/cm/regobj.c trunk/reactos/ntoskrnl/config/cm.h trunk/reactos/ntoskrnl/config/cmsysini.c trunk/reactos/tools/mkhive/cmi.c trunk/reactos/tools/mkhive/registry.c
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/binhive.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/reacto... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/reactos/binhive.c (original) +++ trunk/reactos/boot/freeldr/freeldr/reactos/binhive.c Mon Oct 29 00:31:46 2007 @@ -23,6 +23,9 @@ #include <cmlib.h> #include <debug.h>
+#define REG_DATA_SIZE_MASK 0x7FFFFFFF +#define REG_DATA_IN_OFFSET 0x80000000 + /* FUNCTIONS ****************************************************************/
static PVOID @@ -46,20 +49,20 @@ PHCELL_INDEX HBOffset, ULONG SubKeyCount) { - PHASH_TABLE_CELL HashCell; + PCM_KEY_FAST_INDEX HashCell; ULONG NewHashSize;
- NewHashSize = sizeof(HASH_TABLE_CELL) + - (SubKeyCount * sizeof(HASH_RECORD)); + NewHashSize = sizeof(CM_KEY_FAST_INDEX) + + (SubKeyCount * sizeof(CM_INDEX)); *HBOffset = HvAllocateCell (Hive, NewHashSize, Stable, HCELL_NIL); if (*HBOffset == HCELL_NIL) { return FALSE; }
- HashCell = (PHASH_TABLE_CELL)HvGetCell (Hive, *HBOffset); - HashCell->Id = REG_HASH_TABLE_CELL_ID; - HashCell->HashTableSize = SubKeyCount; + HashCell = (PCM_KEY_FAST_INDEX)HvGetCell (Hive, *HBOffset); + HashCell->Signature = CM_KEY_FAST_LEAF; + HashCell->Count = SubKeyCount;
return TRUE; } @@ -71,21 +74,21 @@ PCM_KEY_NODE NewKeyCell, HCELL_INDEX NKBOffset) { - PHASH_TABLE_CELL HashBlock; + PCM_KEY_FAST_INDEX HashBlock; PCM_KEY_NODE ParentKeyCell; ULONG i;
ParentKeyCell = (PVOID)HvGetCell (Hive, Parent); HashBlock = (PVOID)HvGetCell (Hive, ParentKeyCell->SubKeyLists[Stable]);
- for (i = 0; i < HashBlock->HashTableSize; i++) - { - if (HashBlock->Table[i].KeyOffset == 0) - { - HashBlock->Table[i].KeyOffset = NKBOffset; - memcpy (&HashBlock->Table[i].HashValue, + for (i = 0; i < HashBlock->Count; i++) + { + if (HashBlock->List[i].Cell == 0) + { + HashBlock->List[i].Cell = NKBOffset; + memcpy (&HashBlock->List[i].HashKey, NewKeyCell->Name, - min(NewKeyCell->NameSize, sizeof(ULONG))); + min(NewKeyCell->NameLength, sizeof(ULONG))); ParentKeyCell->SubKeyCounts[Stable]++; return TRUE; } @@ -122,21 +125,21 @@ PWCHAR ValueName) { PCM_KEY_VALUE NewValueCell; - ULONG NameSize; + ULONG NameLength; BOOLEAN Packable = TRUE; ULONG i;
- NameSize = (ValueName == NULL) ? 0 : wcslen (ValueName); - for (i = 0; i < NameSize; i++) + NameLength = (ValueName == NULL) ? 0 : wcslen (ValueName); + for (i = 0; i < NameLength; i++) { if (ValueName[i] & 0xFF00) { - NameSize *= sizeof(WCHAR); + NameLength *= sizeof(WCHAR); Packable = FALSE; break; } } - *ValueCellOffset = HvAllocateCell (Hive, sizeof(CM_KEY_VALUE) + NameSize, Stable, HCELL_NIL); + *ValueCellOffset = HvAllocateCell (Hive, sizeof(CM_KEY_VALUE) + NameLength, Stable, HCELL_NIL); if (*ValueCellOffset == HCELL_NIL) { DbgPrint((DPRINT_REGISTRY, "CmiAllocateCell() failed\n")); @@ -144,29 +147,29 @@ }
NewValueCell = (PCM_KEY_VALUE) HvGetCell (Hive, *ValueCellOffset); - NewValueCell->Id = REG_VALUE_CELL_ID; - NewValueCell->NameSize = NameSize; + NewValueCell->Signature = CM_KEY_VALUE_SIGNATURE; + NewValueCell->NameLength = NameLength; NewValueCell->Flags = 0; - if (NameSize > 0) + if (NameLength > 0) { if (Packable) { - for (i = 0; i < NameSize; i++) + for (i = 0; i < NameLength; i++) { ((PCHAR)NewValueCell->Name)[i] = (CHAR)ValueName[i]; } - NewValueCell->Flags |= REG_VALUE_NAME_PACKED; + NewValueCell->Flags |= VALUE_COMP_NAME; } else { memcpy (NewValueCell->Name, ValueName, - NameSize); + NameLength); } } - NewValueCell->DataType = 0; - NewValueCell->DataSize = 0; - NewValueCell->DataOffset = -1; + NewValueCell->Type = 0; + NewValueCell->DataLength = 0; + NewValueCell->Data = -1;
*ValueCell = NewValueCell;
@@ -212,13 +215,13 @@ HCELL_INDEX DataCellOffset; PCM_KEY_VALUE ValueCell; PVOID DataCell; - ULONG DataSize; - ULONG DataType; + ULONG DataLength; + ULONG Type; PCHAR Data;
DbgPrint((DPRINT_REGISTRY, "CmiExportValue('%S') called\n", (Value == NULL) ? "<default>" : (PCHAR)Value->Name)); - DbgPrint((DPRINT_REGISTRY, "DataSize %lu\n", + DbgPrint((DPRINT_REGISTRY, "DataLength %lu\n", (Value == NULL) ? Key->DataSize : Value->DataSize));
/* Allocate value cell */ @@ -234,42 +237,42 @@
if (Value == NULL) { - DataType = Key->DataType; - DataSize = Key->DataSize; + Type = Key->DataType; + DataLength = Key->DataSize; Data = Key->Data; } else { - DataType = Value->DataType; - DataSize = Value->DataSize; + Type = Value->DataType; + DataLength = Value->DataSize; Data = Value->Data; }
- if (DataSize <= sizeof(HCELL_INDEX)) - { - ValueCell->DataSize = DataSize | REG_DATA_IN_OFFSET; - ValueCell->DataType = DataType; - memcpy (&ValueCell->DataOffset, + if (DataLength <= sizeof(HCELL_INDEX)) + { + ValueCell->DataLength = DataLength | REG_DATA_IN_OFFSET; + ValueCell->Type = Type; + memcpy (&ValueCell->Data, &Data, - DataSize); + DataLength); } else { /* Allocate data cell */ - DataCellOffset = HvAllocateCell (Hive, DataSize, Stable, HCELL_NIL); + DataCellOffset = HvAllocateCell (Hive, DataLength, Stable, HCELL_NIL); if (DataCellOffset == HCELL_NIL) { return FALSE; }
- ValueCell->DataOffset = DataCellOffset; - ValueCell->DataSize = DataSize; - ValueCell->DataType = DataType; + ValueCell->Data = DataCellOffset; + ValueCell->DataLength = DataLength; + ValueCell->Type = Type;
DataCell = (PVOID)HvGetCell (Hive, DataCellOffset); memcpy (DataCell, Data, - DataSize); + DataLength); }
return TRUE; @@ -292,7 +295,7 @@ PVALUE Value; BOOLEAN Packable = TRUE; ULONG i; - ULONG NameSize; + ULONG NameLength;
DbgPrint((DPRINT_REGISTRY, "CmiExportSubKey('%S') called\n", Key->Name));
@@ -300,19 +303,19 @@ if (Key->DataType == REG_LINK) return TRUE;
- NameSize = (Key->NameSize - sizeof(WCHAR)) / sizeof(WCHAR); - for (i = 0; i < NameSize; i++) + NameLength = (Key->NameSize - sizeof(WCHAR)) / sizeof(WCHAR); + for (i = 0; i < NameLength; i++) { if (Key->Name[i] & 0xFF00) { Packable = FALSE; - NameSize *= sizeof(WCHAR); + NameLength *= sizeof(WCHAR); break; } }
/* Allocate key cell */ - KeyCellSize = sizeof(CM_KEY_NODE) + NameSize; + KeyCellSize = sizeof(CM_KEY_NODE) + NameLength; NKBOffset = HvAllocateCell (Hive, KeyCellSize, Stable, HCELL_NIL); if (NKBOffset == HCELL_NIL) { @@ -322,7 +325,7 @@
/* Initialize key cell */ NewKeyCell = (PCM_KEY_NODE) HvGetCell (Hive, NKBOffset); - NewKeyCell->Id = REG_KEY_CELL_ID; + NewKeyCell->Signature = CM_KEY_NODE_SIGNATURE; NewKeyCell->Flags = 0; NewKeyCell->LastWriteTime.QuadPart = 0ULL; NewKeyCell->Parent = Parent; @@ -330,24 +333,24 @@ NewKeyCell->SubKeyLists[Stable] = -1; NewKeyCell->ValueList.Count = 0; NewKeyCell->ValueList.List = -1; - NewKeyCell->SecurityKeyOffset = -1; - NewKeyCell->ClassNameOffset = -1; - NewKeyCell->NameSize = NameSize; - NewKeyCell->ClassSize = 0; + NewKeyCell->Security = -1; + NewKeyCell->Class = -1; + NewKeyCell->NameLength = NameLength; + NewKeyCell->ClassLength = 0; if (Packable) { - for (i = 0; i < NameSize; i++) + for (i = 0; i < NameLength; i++) { ((PCHAR)NewKeyCell->Name)[i] = (CHAR)Key->Name[i]; } - NewKeyCell->Flags |= REG_KEY_NAME_PACKED; + NewKeyCell->Flags |= KEY_COMP_NAME;
} else { memcpy (NewKeyCell->Name, Key->Name, - NameSize); + NameLength); }
/* Add key cell to the parent key's hash table */ @@ -527,45 +530,45 @@ PVOID DataCell; PWCHAR wName; LONG Error; - ULONG DataSize; + ULONG DataLength; ULONG i;
- if (ValueCell->Id != REG_VALUE_CELL_ID) + if (ValueCell->Signature != CM_KEY_VALUE_SIGNATURE) { DbgPrint((DPRINT_REGISTRY, "Invalid key cell!\n")); return FALSE; }
- if (ValueCell->Flags & REG_VALUE_NAME_PACKED) - { - wName = MmAllocateMemory ((ValueCell->NameSize + 1)*sizeof(WCHAR)); - for (i = 0; i < ValueCell->NameSize; i++) + if (ValueCell->Flags & VALUE_COMP_NAME) + { + wName = MmAllocateMemory ((ValueCell->NameLength + 1)*sizeof(WCHAR)); + for (i = 0; i < ValueCell->NameLength; i++) { wName[i] = ((PCHAR)ValueCell->Name)[i]; } - wName[ValueCell->NameSize] = 0; + wName[ValueCell->NameLength] = 0; } else { - wName = MmAllocateMemory (ValueCell->NameSize + sizeof(WCHAR)); + wName = MmAllocateMemory (ValueCell->NameLength + sizeof(WCHAR)); memcpy (wName, ValueCell->Name, - ValueCell->NameSize); - wName[ValueCell->NameSize / sizeof(WCHAR)] = 0; - } - - DataSize = ValueCell->DataSize & REG_DATA_SIZE_MASK; + ValueCell->NameLength); + wName[ValueCell->NameLength / sizeof(WCHAR)] = 0; + } + + DataLength = ValueCell->DataLength & REG_DATA_SIZE_MASK;
DbgPrint((DPRINT_REGISTRY, "ValueName: '%S'\n", wName)); - DbgPrint((DPRINT_REGISTRY, "DataSize: %u\n", DataSize)); - - if (DataSize <= sizeof(HCELL_INDEX) && (ValueCell->DataSize & REG_DATA_IN_OFFSET)) + DbgPrint((DPRINT_REGISTRY, "DataLength: %u\n", DataLength)); + + if (DataLength <= sizeof(HCELL_INDEX) && (ValueCell->DataLength & REG_DATA_IN_OFFSET)) { Error = RegSetValue(Key, wName, - ValueCell->DataType, - (PCHAR)&ValueCell->DataOffset, - DataSize); + ValueCell->Type, + (PCHAR)&ValueCell->Data, + DataLength); if (Error != ERROR_SUCCESS) { DbgPrint((DPRINT_REGISTRY, "RegSetValue() failed!\n")); @@ -575,14 +578,14 @@ } else { - DataCell = (PVOID)HvGetCell (Hive, ValueCell->DataOffset); + DataCell = (PVOID)HvGetCell (Hive, ValueCell->Data); DbgPrint((DPRINT_REGISTRY, "DataCell: %x\n", DataCell));
Error = RegSetValue (Key, wName, - ValueCell->DataType, + ValueCell->Type, DataCell, - DataSize); + DataLength);
if (Error != ERROR_SUCCESS) { @@ -603,7 +606,7 @@ PCM_KEY_NODE KeyCell, FRLDRHKEY ParentKey) { - PHASH_TABLE_CELL HashCell; + PCM_KEY_FAST_INDEX HashCell; PCM_KEY_NODE SubKeyCell; PVALUE_LIST_CELL ValueListCell; PCM_KEY_VALUE ValueCell = NULL; @@ -614,29 +617,29 @@
DbgPrint((DPRINT_REGISTRY, "KeyCell: %x\n", KeyCell)); - DbgPrint((DPRINT_REGISTRY, "KeyCell->Id: %x\n", KeyCell->Id)); - if (KeyCell->Id != REG_KEY_CELL_ID) - { - DbgPrint((DPRINT_REGISTRY, "Invalid key cell id!\n")); - return FALSE; - } - - if (KeyCell->Flags & REG_KEY_NAME_PACKED) - { - wName = MmAllocateMemory ((KeyCell->NameSize + 1) * sizeof(WCHAR)); - for (i = 0; i < KeyCell->NameSize; i++) + DbgPrint((DPRINT_REGISTRY, "KeyCell->Signature: %x\n", KeyCell->Signature)); + if (KeyCell->Signature != CM_KEY_NODE_SIGNATURE) + { + DbgPrint((DPRINT_REGISTRY, "Invalid key cell Signature!\n")); + return FALSE; + } + + if (KeyCell->Flags & KEY_COMP_NAME) + { + wName = MmAllocateMemory ((KeyCell->NameLength + 1) * sizeof(WCHAR)); + for (i = 0; i < KeyCell->NameLength; i++) { wName[i] = ((PCHAR)KeyCell->Name)[i]; } - wName[KeyCell->NameSize] = 0; + wName[KeyCell->NameLength] = 0; } else { - wName = MmAllocateMemory (KeyCell->NameSize + sizeof(WCHAR)); + wName = MmAllocateMemory (KeyCell->NameLength + sizeof(WCHAR)); memcpy (wName, KeyCell->Name, - KeyCell->NameSize); - wName[KeyCell->NameSize/sizeof(WCHAR)] = 0; + KeyCell->NameLength); + wName[KeyCell->NameLength/sizeof(WCHAR)] = 0; }
DbgPrint((DPRINT_REGISTRY, "KeyName: '%S'\n", wName)); @@ -676,15 +679,15 @@ /* Enumerate and add subkeys */ if (KeyCell->SubKeyCounts[Stable] > 0) { - HashCell = (PHASH_TABLE_CELL) HvGetCell (Hive, KeyCell->SubKeyLists[Stable]); + HashCell = (PCM_KEY_FAST_INDEX) HvGetCell (Hive, KeyCell->SubKeyLists[Stable]); DbgPrint((DPRINT_REGISTRY, "HashCell: %x\n", HashCell)); DbgPrint((DPRINT_REGISTRY, "SubKeyCounts: %x\n", KeyCell->SubKeyCounts));
for (i = 0; i < KeyCell->SubKeyCounts[Stable]; i++) { - DbgPrint((DPRINT_REGISTRY, "KeyOffset[%d]: %x\n", i, HashCell->Table[i].KeyOffset)); - - SubKeyCell = (PCM_KEY_NODE) HvGetCell (Hive, HashCell->Table[i].KeyOffset); + DbgPrint((DPRINT_REGISTRY, "Cell[%d]: %x\n", i, HashCell->List[i].Cell)); + + SubKeyCell = (PCM_KEY_NODE) HvGetCell (Hive, HashCell->List[i].Cell);
DbgPrint((DPRINT_REGISTRY, "SubKeyCell[%d]: %x\n", i, SubKeyCell));
@@ -702,7 +705,7 @@ ULONG ChunkSize) { PCM_KEY_NODE KeyCell; - PHASH_TABLE_CELL HashCell; + PCM_KEY_FAST_INDEX HashCell; PCM_KEY_NODE SubKeyCell; FRLDRHKEY SystemKey; ULONG i; @@ -729,17 +732,17 @@ NULL); if (!NT_SUCCESS(Status)) { - DbgPrint((DPRINT_REGISTRY, "Invalid hive id!\n")); + DbgPrint((DPRINT_REGISTRY, "Invalid hive Signature!\n")); return FALSE; }
Hive = &CmHive->Hive; KeyCell = (PCM_KEY_NODE)HvGetCell (Hive, Hive->BaseBlock->RootCell); DbgPrint((DPRINT_REGISTRY, "KeyCell: %x\n", KeyCell)); - DbgPrint((DPRINT_REGISTRY, "KeyCell->Id: %x\n", KeyCell->Id)); - if (KeyCell->Id != REG_KEY_CELL_ID) - { - DbgPrint((DPRINT_REGISTRY, "Invalid key cell id!\n")); + DbgPrint((DPRINT_REGISTRY, "KeyCell->Signature: %x\n", KeyCell->Signature)); + if (KeyCell->Signature != CM_KEY_NODE_SIGNATURE) + { + DbgPrint((DPRINT_REGISTRY, "Invalid key cell Signature!\n")); return FALSE; }
@@ -759,15 +762,15 @@ /* Enumerate and add subkeys */ if (KeyCell->SubKeyCounts[Stable] > 0) { - HashCell = (PHASH_TABLE_CELL)HvGetCell (Hive, KeyCell->SubKeyLists[Stable]); + HashCell = (PCM_KEY_FAST_INDEX)HvGetCell (Hive, KeyCell->SubKeyLists[Stable]); DbgPrint((DPRINT_REGISTRY, "HashCell: %x\n", HashCell)); DbgPrint((DPRINT_REGISTRY, "SubKeyCounts: %x\n", KeyCell->SubKeyCounts[Stable]));
for (i = 0; i < KeyCell->SubKeyCounts[Stable]; i++) { - DbgPrint((DPRINT_REGISTRY, "KeyOffset[%d]: %x\n", i, HashCell->Table[i].KeyOffset)); - - SubKeyCell = (PCM_KEY_NODE)HvGetCell (Hive, HashCell->Table[i].KeyOffset); + DbgPrint((DPRINT_REGISTRY, "Cell[%d]: %x\n", i, HashCell->List[i].Cell)); + + SubKeyCell = (PCM_KEY_NODE)HvGetCell (Hive, HashCell->List[i].Cell);
DbgPrint((DPRINT_REGISTRY, "SubKeyCell[%d]: %x\n", i, SubKeyCell));
Modified: trunk/reactos/include/host/typedefs.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/host/typedefs.h?rev... ============================================================================== --- trunk/reactos/include/host/typedefs.h (original) +++ trunk/reactos/include/host/typedefs.h Mon Oct 29 00:31:46 2007 @@ -50,6 +50,8 @@ /* FIXME: this value is target specific, host tools MUST not use it * and this line has to be removed */ #define PAGE_SIZE 4096 + +#define ANYSIZE_ARRAY 1
typedef void VOID, *PVOID, *HANDLE; typedef HANDLE HKEY, *PHKEY;
Modified: trunk/reactos/lib/cmlib/cmdata.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/cmlib/cmdata.h?rev=2994... ============================================================================== --- trunk/reactos/lib/cmlib/cmdata.h (original) +++ trunk/reactos/lib/cmlib/cmdata.h Mon Oct 29 00:31:46 2007 @@ -13,12 +13,39 @@ #define REG_EXTEND_HASH_TABLE_SIZE 4 #define REG_VALUE_LIST_CELL_MULTIPLE 4
-#define REG_KEY_CELL_ID 0x6b6e -#define REG_HASH_TABLE_CELL_ID 0x666c -#define REG_VALUE_CELL_ID 0x6b76 -#define REG_SECURITY_CELL_ID 0x6b73 +// +// Key Types +// +#define CM_KEY_INDEX_ROOT 0x6972 +#define CM_KEY_INDEX_LEAF 0x696c +#define CM_KEY_FAST_LEAF 0x666c +#define CM_KEY_HASH_LEAF 0x686c
-#ifndef _CM_ +// +// Key Signatures +// +#define CM_KEY_NODE_SIGNATURE 0x6B6E +#define CM_LINK_NODE_SIGNATURE 0x6B6C +#define CM_KEY_VALUE_SIGNATURE 0x6B76 + +// +// CM_KEY_NODE Flags +// +#define KEY_IS_VOLATILE 0x01 +#define KEY_HIVE_EXIT 0x02 +#define KEY_HIVE_ENTRY 0x04 +#define KEY_NO_DELETE 0x08 +#define KEY_SYM_LINK 0x10 +#define KEY_COMP_NAME 0x20 +#define KEY_PREFEF_HANDLE 0x40 +#define KEY_VIRT_MIRRORED 0x80 +#define KEY_VIRT_TARGET 0x100 +#define KEY_VIRTUAL_STORE 0x200 + +// +// CM_KEY_VALUE Flags +// +#define VALUE_COMP_NAME 0x0001
#ifdef CMLIB_HOST #include <host/pshpack1.h> @@ -26,6 +53,9 @@ #include <pshpack1.h> #endif
+// +// For memory-mapped Hives +// typedef struct _CM_VIEW_OF_FILE { LIST_ENTRY LRUViewList; @@ -37,111 +67,69 @@ ULONG UseCount; } CM_VIEW_OF_FILE, *PCM_VIEW_OF_FILE;
+// +// Children of Key Notes +// typedef struct _CHILD_LIST { ULONG Count; HCELL_INDEX List; } CHILD_LIST, *PCHILD_LIST;
+// +// Node Key +// typedef struct _CM_KEY_NODE { - /* Key cell identifier "kn" (0x6b6e) */ - USHORT Id; - - /* Flags */ - USHORT Flags; - - /* Time of last flush */ - LARGE_INTEGER LastWriteTime; - - ULONG Spare; - - /* BlockAddress offset of parent key cell */ - HCELL_INDEX Parent; - - /* Count of sub keys for the key in this key cell (stable & volatile) */ - ULONG SubKeyCounts[HTYPE_COUNT]; - - /* BlockAddress offset of has table for FIXME: subkeys/values? (stable & volatile) */ - HCELL_INDEX SubKeyLists[HTYPE_COUNT]; - - CHILD_LIST ValueList; - - /* BlockAddress offset of security cell */ - HCELL_INDEX SecurityKeyOffset; - - /* BlockAddress offset of registry key class */ - HCELL_INDEX ClassNameOffset; - - ULONG MaxNameLen; - ULONG MaxClassLen; - ULONG MaxValueNameLen; - ULONG MaxValueDataLen; - ULONG WorkVar; - - /* Size in bytes of key name */ - USHORT NameSize; - - /* Size of class name in bytes */ - USHORT ClassSize; - - /* Name of key (not zero terminated) */ - UCHAR Name[0]; + USHORT Signature; + USHORT Flags; + LARGE_INTEGER LastWriteTime; + ULONG Spare; + HCELL_INDEX Parent; + ULONG SubKeyCounts[HTYPE_COUNT]; + HCELL_INDEX SubKeyLists[HTYPE_COUNT]; + CHILD_LIST ValueList; + HCELL_INDEX Security; + HCELL_INDEX Class; + ULONG MaxNameLen; + ULONG MaxClassLen; + ULONG MaxValueNameLen; + ULONG MaxValueDataLen; + ULONG WorkVar; + USHORT NameLength; + USHORT ClassLength; + WCHAR Name[0]; } CM_KEY_NODE, *PCM_KEY_NODE;
-/* CM_KEY_NODE.Flags constants */ -#define REG_KEY_VOLATILE_CELL 0x01 -#define REG_KEY_ROOT_CELL 0x0C -#define REG_KEY_LINK_CELL 0x10 -#define REG_KEY_NAME_PACKED 0x20 - -/* - * Hash record - * - * HashValue: - * packed name: four letters of value's name - * otherwise: Zero! - */ -typedef struct _HASH_RECORD -{ - HCELL_INDEX KeyOffset; - ULONG HashValue; -} HASH_RECORD, *PHASH_RECORD; - -typedef struct _HASH_TABLE_CELL -{ - USHORT Id; - USHORT HashTableSize; - HASH_RECORD Table[0]; -} HASH_TABLE_CELL, *PHASH_TABLE_CELL; - +// +// Value List +// typedef struct _VALUE_LIST_CELL { - HCELL_INDEX ValueOffset[0]; + HCELL_INDEX ValueOffset[0]; } VALUE_LIST_CELL, *PVALUE_LIST_CELL;
+// +// Value Key +// typedef struct _CM_KEY_VALUE { - USHORT Id; // "kv" - USHORT NameSize; // length of Name - ULONG DataSize; // length of datas in the cell pointed by DataOffset - HCELL_INDEX DataOffset;// datas are here if high bit of DataSize is set - ULONG DataType; - USHORT Flags; - USHORT Unused1; - UCHAR Name[0]; /* warning : not zero terminated */ + USHORT Signature; + USHORT NameLength; + ULONG DataLength; + HCELL_INDEX Data; + ULONG Type; + USHORT Flags; + USHORT Unused1; + WCHAR Name[0]; } CM_KEY_VALUE, *PCM_KEY_VALUE;
-/* CM_KEY_VALUE.Flags constants */ -#define REG_VALUE_NAME_PACKED 0x0001 - -/* CM_KEY_VALUE.DataSize mask constants */ -#define REG_DATA_SIZE_MASK 0x7FFFFFFF -#define REG_DATA_IN_OFFSET 0x80000000 - +// +// Security Key +// typedef struct _CM_KEY_SECURITY { - USHORT Signature; // "sk" + USHORT Signature; USHORT Reserved; HCELL_INDEX Flink; HCELL_INDEX Blink; @@ -157,6 +145,53 @@ #include <poppack.h> #endif
-#endif +// +// Generic Index Entry +// +typedef struct _CM_INDEX +{ + HCELL_INDEX Cell; + union + { + UCHAR NameHint[4]; + ULONG HashKey; + }; +} CM_INDEX, *PCM_INDEX; + +// +// Key Index +// +typedef struct _CM_KEY_INDEX +{ + USHORT Signature; + USHORT Count; + HCELL_INDEX List[ANYSIZE_ARRAY]; +} CM_KEY_INDEX, *PCM_KEY_INDEX; + +// +// Fast/Hash Key Index +// +typedef struct _CM_KEY_FAST_INDEX +{ + USHORT Signature; + USHORT Count; + CM_INDEX List[ANYSIZE_ARRAY]; +} CM_KEY_FAST_INDEX, *PCM_KEY_FAST_INDEX; + +// +// Cell Data +// +typedef struct _CELL_DATA +{ + union + { + CM_KEY_NODE KeyNode; + CM_KEY_VALUE KeyValue; + CM_KEY_SECURITY KeySecurity; + CM_KEY_INDEX KeyIndex; + HCELL_INDEX KeyList[ANYSIZE_ARRAY]; + WCHAR KeyString[ANYSIZE_ARRAY]; + } u; +} CELL_DATA, *PCELL_DATA;
#endif /* CMLIB_CMDATA_H */
Modified: trunk/reactos/lib/cmlib/cminit.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/cmlib/cminit.c?rev=2994... ============================================================================== --- trunk/reactos/lib/cmlib/cminit.c (original) +++ trunk/reactos/lib/cmlib/cminit.c Mon Oct 29 00:31:46 2007 @@ -16,34 +16,47 @@ HCELL_INDEX RootCellIndex; SIZE_T NameSize;
+ /* Allocate the cell */ NameSize = wcslen(Name) * sizeof(WCHAR); RootCellIndex = HvAllocateCell(Hive, - sizeof(CM_KEY_NODE) + NameSize, + FIELD_OFFSET(CM_KEY_NODE, Name) + NameSize, Stable, HCELL_NIL); - if (RootCellIndex == HCELL_NIL) - return FALSE; + 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); - 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_NIL; - KeyCell->SubKeyCounts[0] = 0; - KeyCell->SubKeyCounts[1] = 0; - KeyCell->SubKeyLists[0] = HCELL_NIL; - KeyCell->SubKeyLists[1] = 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->SecurityKeyOffset = HCELL_NIL; - KeyCell->ClassNameOffset = HCELL_NIL; - KeyCell->NameSize = (USHORT)NameSize; - KeyCell->ClassSize = 0; + 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; }
@@ -53,10 +66,10 @@ PCM_KEY_NODE KeyCell) { PCM_KEY_NODE SubKeyCell; - PHASH_TABLE_CELL HashCell; + PCM_KEY_FAST_INDEX HashCell; ULONG i;
- ASSERT(KeyCell->Id == REG_KEY_CELL_ID); + ASSERT(KeyCell->Signature == CM_KEY_NODE_SIGNATURE);
KeyCell->SubKeyLists[Volatile] = HCELL_NIL; KeyCell->SubKeyCounts[Volatile] = 0; @@ -68,7 +81,7 @@
for (i = 0; i < KeyCell->SubKeyCounts[Stable]; i++) { - SubKeyCell = HvGetCell(RegistryHive, HashCell->Table[i].KeyOffset); + SubKeyCell = HvGetCell(RegistryHive, HashCell->List[i].Cell); CmpPrepareKey(RegistryHive, SubKeyCell); } }
Modified: trunk/reactos/lib/cmlib/cmlib.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/cmlib/cmlib.h?rev=29943... ============================================================================== --- trunk/reactos/lib/cmlib/cmlib.h (original) +++ trunk/reactos/lib/cmlib/cmlib.h Mon Oct 29 00:31:46 2007 @@ -62,10 +62,6 @@
#endif
-#include <wchar.h> -#include "hivedata.h" -#include "cmdata.h" - #ifndef ROUND_UP #define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b)) #define ROUND_DOWN(a,b) (((a)/(b))*(b)) @@ -75,112 +71,9 @@
#define CMAPI NTAPI
-struct _HHIVE; - -typedef struct _CELL_DATA* (CMAPI *PGET_CELL_ROUTINE)( - struct _HHIVE *Hive, - HCELL_INDEX Cell); - -typedef VOID (CMAPI *PRELEASE_CELL_ROUTINE)( - struct _HHIVE *Hive, - HCELL_INDEX Cell); - -typedef PVOID (CMAPI *PALLOCATE_ROUTINE)( - SIZE_T Size, - BOOLEAN Paged, - ULONG Tag); - -typedef VOID (CMAPI *PFREE_ROUTINE)( - PVOID Ptr, - ULONG Quota); - -typedef BOOLEAN (CMAPI *PFILE_READ_ROUTINE)( - struct _HHIVE *RegistryHive, - ULONG FileType, - PULONG FileOffset, - PVOID Buffer, - SIZE_T BufferLength); - -typedef BOOLEAN (CMAPI *PFILE_WRITE_ROUTINE)( - struct _HHIVE *RegistryHive, - ULONG FileType, - PULONG FileOffset, - PVOID Buffer, - SIZE_T BufferLength); - -typedef BOOLEAN (CMAPI *PFILE_SET_SIZE_ROUTINE)( - struct _HHIVE *RegistryHive, - ULONG FileType, - ULONG FileSize, - ULONG OldfileSize); - -typedef BOOLEAN (CMAPI *PFILE_FLUSH_ROUTINE)( - struct _HHIVE *RegistryHive, - ULONG FileType, - PLARGE_INTEGER FileOffset, - ULONG Length); - -typedef struct _HMAP_ENTRY -{ - ULONG_PTR BlockAddress; - ULONG_PTR BinAddress; - struct _CM_VIEW_OF_FILE *CmView; - ULONG MemAlloc; -} HMAP_ENTRY, *PHMAP_ENTRY; - -typedef struct _HMAP_TABLE -{ - HMAP_ENTRY Table[512]; -} HMAP_TABLE, *PHMAP_TABLE; - -typedef struct _HMAP_DIRECTORY -{ - PHMAP_TABLE Directory[2048]; -} HMAP_DIRECTORY, *PHMAP_DIRECTORY; - -typedef struct _DUAL -{ - ULONG Length; - PHMAP_DIRECTORY Map; - PHMAP_ENTRY BlockList; // PHMAP_TABLE SmallDir; - ULONG Guard; - HCELL_INDEX FreeDisplay[24]; //FREE_DISPLAY FreeDisplay[24]; - ULONG FreeSummary; - LIST_ENTRY FreeBins; -} DUAL, *PDUAL; - -typedef struct _HHIVE -{ - ULONG Signature; - PGET_CELL_ROUTINE GetCellRoutine; - PRELEASE_CELL_ROUTINE ReleaseCellRoutine; - PALLOCATE_ROUTINE Allocate; - PFREE_ROUTINE Free; - PFILE_READ_ROUTINE FileRead; - PFILE_WRITE_ROUTINE FileWrite; - PFILE_SET_SIZE_ROUTINE FileSetSize; - PFILE_FLUSH_ROUTINE FileFlush; - PHBASE_BLOCK BaseBlock; - RTL_BITMAP DirtyVector; - ULONG DirtyCount; - ULONG DirtyAlloc; - ULONG BaseBlockAlloc; - ULONG Cluster; - BOOLEAN Flat; - BOOLEAN ReadOnly; - BOOLEAN Log; - BOOLEAN DirtyFlag; - ULONG HvBinHeadersUse; - ULONG HvFreeCellsUse; - ULONG HvUsedcellsUse; - ULONG CmUsedCellsUse; - ULONG HiveFlags; - ULONG LogSize; - ULONG RefreshCount; - ULONG StorageTypeCount; - ULONG Version; - DUAL Storage[HTYPE_COUNT]; -} HHIVE, *PHHIVE; +#include <wchar.h> +#include "hivedata.h" +#include "cmdata.h"
#ifndef _CM_ typedef struct _EREGISTRY_HIVE
Modified: trunk/reactos/lib/cmlib/hivedata.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/cmlib/hivedata.h?rev=29... ============================================================================== --- trunk/reactos/lib/cmlib/hivedata.h (original) +++ trunk/reactos/lib/cmlib/hivedata.h Mon Oct 29 00:31:46 2007 @@ -24,6 +24,9 @@ #define HIVE_VOLATILE 1 #define HIVE_NOLAZYFLUSH 2 #define HIVE_HAS_BEEN_REPLACED 4 +#define HIVE_HAS_BEEN_FREED 8 +#define HIVE_UNKNOWN 0x10 +#define HIVE_IS_UNLOADING 0x20
// // Hive types @@ -190,6 +193,114 @@ #include <poppack.h> #endif
+struct _HHIVE; + +typedef struct _CELL_DATA* (CMAPI *PGET_CELL_ROUTINE)( + struct _HHIVE *Hive, + HCELL_INDEX Cell); + +typedef VOID (CMAPI *PRELEASE_CELL_ROUTINE)( + struct _HHIVE *Hive, + HCELL_INDEX Cell); + +typedef PVOID (CMAPI *PALLOCATE_ROUTINE)( + SIZE_T Size, + BOOLEAN Paged, + ULONG Tag); + +typedef VOID (CMAPI *PFREE_ROUTINE)( + PVOID Ptr, + ULONG Quota); + +typedef BOOLEAN (CMAPI *PFILE_READ_ROUTINE)( + struct _HHIVE *RegistryHive, + ULONG FileType, + PULONG FileOffset, + PVOID Buffer, + SIZE_T BufferLength); + +typedef BOOLEAN (CMAPI *PFILE_WRITE_ROUTINE)( + struct _HHIVE *RegistryHive, + ULONG FileType, + PULONG FileOffset, + PVOID Buffer, + SIZE_T BufferLength); + +typedef BOOLEAN (CMAPI *PFILE_SET_SIZE_ROUTINE)( + struct _HHIVE *RegistryHive, + ULONG FileType, + ULONG FileSize, + ULONG OldfileSize); + +typedef BOOLEAN (CMAPI *PFILE_FLUSH_ROUTINE)( + struct _HHIVE *RegistryHive, + ULONG FileType, + PLARGE_INTEGER FileOffset, + ULONG Length +); + +typedef struct _HMAP_ENTRY +{ + ULONG_PTR BlockAddress; + ULONG_PTR BinAddress; + struct _CM_VIEW_OF_FILE *CmView; + ULONG MemAlloc; +} HMAP_ENTRY, *PHMAP_ENTRY; + +typedef struct _HMAP_TABLE +{ + HMAP_ENTRY Table[512]; +} HMAP_TABLE, *PHMAP_TABLE; + +typedef struct _HMAP_DIRECTORY +{ + PHMAP_TABLE Directory[2048]; +} HMAP_DIRECTORY, *PHMAP_DIRECTORY; + +typedef struct _DUAL +{ + ULONG Length; + PHMAP_DIRECTORY Map; + PHMAP_ENTRY BlockList; // PHMAP_TABLE SmallDir; + ULONG Guard; + HCELL_INDEX FreeDisplay[24]; //FREE_DISPLAY FreeDisplay[24]; + ULONG FreeSummary; + LIST_ENTRY FreeBins; +} DUAL, *PDUAL; + +typedef struct _HHIVE +{ + ULONG Signature; + PGET_CELL_ROUTINE GetCellRoutine; + PRELEASE_CELL_ROUTINE ReleaseCellRoutine; + PALLOCATE_ROUTINE Allocate; + PFREE_ROUTINE Free; + PFILE_READ_ROUTINE FileRead; + PFILE_WRITE_ROUTINE FileWrite; + PFILE_SET_SIZE_ROUTINE FileSetSize; + PFILE_FLUSH_ROUTINE FileFlush; + PHBASE_BLOCK BaseBlock; + RTL_BITMAP DirtyVector; + ULONG DirtyCount; + ULONG DirtyAlloc; + ULONG BaseBlockAlloc; + ULONG Cluster; + BOOLEAN Flat; + BOOLEAN ReadOnly; + BOOLEAN Log; + BOOLEAN DirtyFlag; + ULONG HvBinHeadersUse; + ULONG HvFreeCellsUse; + ULONG HvUsedcellsUse; + ULONG CmUsedCellsUse; + ULONG HiveFlags; + ULONG LogSize; + ULONG RefreshCount; + ULONG StorageTypeCount; + ULONG Version; + DUAL Storage[HTYPE_COUNT]; +} HHIVE, *PHHIVE; + #define IsFreeCell(Cell)(Cell->Size >= 0) #define IsUsedCell(Cell)(Cell->Size < 0)
Modified: trunk/reactos/ntoskrnl/cm/cm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/cm.h?rev=29943&... ============================================================================== --- trunk/reactos/ntoskrnl/cm/cm.h (original) +++ trunk/reactos/ntoskrnl/cm/cm.h Mon Oct 29 00:31:46 2007 @@ -192,9 +192,9 @@ IN PVOID Argument2);
#define VERIFY_BIN_HEADER(x) ASSERT(x->HeaderId == REG_BIN_ID) -#define VERIFY_KEY_CELL(x) ASSERT(x->Id == REG_KEY_CELL_ID) -#define VERIFY_ROOT_KEY_CELL(x) ASSERT(x->Id == REG_KEY_CELL_ID) -#define VERIFY_VALUE_CELL(x) ASSERT(x->Id == REG_VALUE_CELL_ID) +#define VERIFY_KEY_CELL(x) ASSERT(x->Signature == CM_KEY_NODE_SIGNATURE) +#define VERIFY_ROOT_KEY_CELL(x) ASSERT(x->Signature == CM_KEY_NODE_SIGNATURE) +#define VERIFY_VALUE_CELL(x) ASSERT(x->Signature == CM_KEY_VALUE_SIGNATURE) #define VERIFY_VALUE_LIST_CELL(x) #define VERIFY_KEY_OBJECT(x) #define VERIFY_REGISTRY_HIVE(x) @@ -316,21 +316,6 @@ NTSTATUS NTAPI CmDeleteKey(IN PCM_KEY_CONTROL_BLOCK Kcb); - -NTSTATUS -CmiAllocateHashTableCell(IN PEREGISTRY_HIVE RegistryHive, - OUT PHASH_TABLE_CELL *HashBlock, - OUT HCELL_INDEX *HBOffset, - IN ULONG HashTableSize, - IN HSTORAGE_TYPE Storage); - -NTSTATUS -CmiAddKeyToHashTable(PEREGISTRY_HIVE RegistryHive, - PHASH_TABLE_CELL HashCell, - PCM_KEY_NODE KeyCell, - HSTORAGE_TYPE StorageType, - PCM_KEY_NODE NewKeyCell, - HCELL_INDEX NKBOffset);
NTSTATUS CmiConnectHive(POBJECT_ATTRIBUTES KeyObjectAttributes,
Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/ntfunc.c?rev=29... ============================================================================== --- trunk/reactos/ntoskrnl/cm/ntfunc.c (original) +++ trunk/reactos/ntoskrnl/cm/ntfunc.c Mon Oct 29 00:31:46 2007 @@ -333,7 +333,7 @@ RtlCreateUnicodeString(&KeyObject->Name, Start);
KeyObject->KeyCell->Parent = KeyObject->ParentKey->KeyCellOffset; - KeyObject->KeyCell->SecurityKeyOffset = KeyObject->ParentKey->KeyCell->SecurityKeyOffset; + KeyObject->KeyCell->Security = KeyObject->ParentKey->KeyCell->Security; KeyObject->ValueCache.ValueList = KeyObject->KeyCell->ValueList.List; KeyObject->ValueCache.Count = KeyObject->KeyCell->ValueList.Count;
Modified: trunk/reactos/ntoskrnl/cm/regfile.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/regfile.c?rev=2... ============================================================================== --- trunk/reactos/ntoskrnl/cm/regfile.c (original) +++ trunk/reactos/ntoskrnl/cm/regfile.c Mon Oct 29 00:31:46 2007 @@ -19,6 +19,8 @@ /* LOCAL MACROS *************************************************************/
#define ABS_VALUE(V) (((V) < 0) ? -(V) : (V)) +#define REG_DATA_SIZE_MASK 0x7FFFFFFF +#define REG_DATA_IN_OFFSET 0x80000000
/* FUNCTIONS ****************************************************************/
@@ -105,10 +107,10 @@ CmiGetMaxNameLength(PHHIVE Hive, PCM_KEY_NODE KeyCell) { - PHASH_TABLE_CELL HashBlock; + PCM_KEY_FAST_INDEX HashBlock; PCM_KEY_NODE CurSubKeyCell; ULONG MaxName; - ULONG NameSize; + ULONG NameLength; ULONG i; ULONG Storage;
@@ -117,18 +119,18 @@ { if (KeyCell->SubKeyLists[Storage] != HCELL_NIL) { - HashBlock = (PHASH_TABLE_CELL)HvGetCell (Hive, KeyCell->SubKeyLists[Storage]); - ASSERT(HashBlock->Id == REG_HASH_TABLE_CELL_ID); + HashBlock = (PCM_KEY_FAST_INDEX)HvGetCell (Hive, KeyCell->SubKeyLists[Storage]); + ASSERT(HashBlock->Signature == CM_KEY_FAST_LEAF);
for (i = 0; i < KeyCell->SubKeyCounts[Storage]; i++) { CurSubKeyCell = (PCM_KEY_NODE)HvGetCell (Hive, - HashBlock->Table[i].KeyOffset); - NameSize = CurSubKeyCell->NameSize; - if (CurSubKeyCell->Flags & REG_KEY_NAME_PACKED) - NameSize *= sizeof(WCHAR); - if (NameSize > MaxName) - MaxName = NameSize; + HashBlock->List[i].Cell); + NameLength = CurSubKeyCell->NameLength; + if (CurSubKeyCell->Flags & KEY_COMP_NAME) + NameLength *= sizeof(WCHAR); + if (NameLength > MaxName) + MaxName = NameLength; } } } @@ -142,7 +144,7 @@ CmiGetMaxClassLength(PHHIVE Hive, PCM_KEY_NODE KeyCell) { - PHASH_TABLE_CELL HashBlock; + PCM_KEY_FAST_INDEX HashBlock; PCM_KEY_NODE CurSubKeyCell; ULONG MaxClass; ULONG i; @@ -153,18 +155,18 @@ { if (KeyCell->SubKeyLists[Storage] != HCELL_NIL) { - HashBlock = (PHASH_TABLE_CELL)HvGetCell (Hive, + HashBlock = (PCM_KEY_FAST_INDEX)HvGetCell (Hive, KeyCell->SubKeyLists[Storage]); - ASSERT(HashBlock->Id == REG_HASH_TABLE_CELL_ID); + ASSERT(HashBlock->Signature == CM_KEY_FAST_LEAF);
for (i = 0; i < KeyCell->SubKeyCounts[Storage]; i++) { CurSubKeyCell = (PCM_KEY_NODE)HvGetCell (Hive, - HashBlock->Table[i].KeyOffset); - - if (MaxClass < CurSubKeyCell->ClassSize) + HashBlock->List[i].Cell); + + if (MaxClass < CurSubKeyCell->ClassLength) { - MaxClass = CurSubKeyCell->ClassSize; + MaxClass = CurSubKeyCell->ClassLength; } } } @@ -205,8 +207,8 @@
if (CurValueCell != NULL) { - Size = CurValueCell->NameSize; - if (CurValueCell->Flags & REG_VALUE_NAME_PACKED) + Size = CurValueCell->NameLength; + if (CurValueCell->Flags & VALUE_COMP_NAME) { Size *= sizeof(WCHAR); } @@ -243,9 +245,9 @@ { CurValueCell = (PCM_KEY_VALUE)HvGetCell (Hive, ValueListCell->ValueOffset[i]); - if ((MaxValueData < (LONG)(CurValueCell->DataSize & REG_DATA_SIZE_MASK))) - { - MaxValueData = CurValueCell->DataSize & REG_DATA_SIZE_MASK; + if ((MaxValueData < (LONG)(CurValueCell->DataLength & REG_DATA_SIZE_MASK))) + { + MaxValueData = CurValueCell->DataLength & REG_DATA_SIZE_MASK; } }
@@ -299,252 +301,4 @@ return STATUS_SUCCESS; }
-NTSTATUS -CmiAddSubKey(PEREGISTRY_HIVE RegistryHive, - PKEY_OBJECT ParentKey, - PKEY_OBJECT SubKey, - PUNICODE_STRING SubKeyName, - ULONG TitleIndex, - PUNICODE_STRING Class, - ULONG CreateOptions) -{ - PHASH_TABLE_CELL HashBlock; - HCELL_INDEX NKBOffset; - PCM_KEY_NODE NewKeyCell; - ULONG NewBlockSize; - PCM_KEY_NODE ParentKeyCell; - PVOID ClassCell; - NTSTATUS Status; - USHORT NameSize; - PWSTR NamePtr; - BOOLEAN Packable; - HSTORAGE_TYPE Storage; - ULONG i; - - ParentKeyCell = ParentKey->KeyCell; - - VERIFY_KEY_CELL(ParentKeyCell); - - /* Skip leading backslash */ - if (SubKeyName->Buffer[0] == L'\') - { - NamePtr = &SubKeyName->Buffer[1]; - NameSize = SubKeyName->Length - sizeof(WCHAR); - } - else - { - NamePtr = SubKeyName->Buffer; - NameSize = SubKeyName->Length; - } - - /* Check whether key name can be packed */ - Packable = TRUE; - for (i = 0; i < NameSize / sizeof(WCHAR); i++) - { - if (NamePtr[i] & 0xFF00) - { - Packable = FALSE; - break; - } - } - - /* Adjust name size */ - if (Packable) - { - NameSize = NameSize / sizeof(WCHAR); - } - - DPRINT("Key %S Length %lu %s\n", NamePtr, NameSize, (Packable)?"True":"False"); - - Status = STATUS_SUCCESS; - - Storage = (CreateOptions & REG_OPTION_VOLATILE) ? Volatile : Stable; - NewBlockSize = sizeof(CM_KEY_NODE) + NameSize; - NKBOffset = HvAllocateCell (&RegistryHive->Hive, NewBlockSize, Storage, HCELL_NIL); - if (NKBOffset == HCELL_NIL) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - } - else - { - NewKeyCell = (PCM_KEY_NODE)HvGetCell (&RegistryHive->Hive, NKBOffset); - NewKeyCell->Id = REG_KEY_CELL_ID; - if (CreateOptions & REG_OPTION_VOLATILE) - { - NewKeyCell->Flags = REG_KEY_VOLATILE_CELL; - } - else - { - NewKeyCell->Flags = 0; - } - KeQuerySystemTime(&NewKeyCell->LastWriteTime); - NewKeyCell->Parent = HCELL_NIL; - NewKeyCell->SubKeyCounts[Stable] = 0; - NewKeyCell->SubKeyCounts[Volatile] = 0; - NewKeyCell->SubKeyLists[Stable] = HCELL_NIL; - NewKeyCell->SubKeyLists[Volatile] = HCELL_NIL; - NewKeyCell->ValueList.Count = 0; - NewKeyCell->ValueList.List = HCELL_NIL; - NewKeyCell->SecurityKeyOffset = HCELL_NIL; - NewKeyCell->ClassNameOffset = HCELL_NIL; - - /* Pack the key name */ - NewKeyCell->NameSize = NameSize; - if (Packable) - { - NewKeyCell->Flags |= REG_KEY_NAME_PACKED; - for (i = 0; i < NameSize; i++) - { - NewKeyCell->Name[i] = (CHAR)(NamePtr[i] & 0x00FF); - } - } - else - { - RtlCopyMemory(NewKeyCell->Name, - NamePtr, - NameSize); - } - - VERIFY_KEY_CELL(NewKeyCell); - - if (Class != NULL && Class->Length) - { - NewKeyCell->ClassSize = Class->Length; - NewKeyCell->ClassNameOffset = HvAllocateCell( - &RegistryHive->Hive, NewKeyCell->ClassSize, Stable, HCELL_NIL); - ASSERT(NewKeyCell->ClassNameOffset != HCELL_NIL); /* FIXME */ - - ClassCell = (PVOID)HvGetCell(&RegistryHive->Hive, NewKeyCell->ClassNameOffset); - RtlCopyMemory (ClassCell, - Class->Buffer, - Class->Length); - } - } - - if (!NT_SUCCESS(Status)) - { - return Status; - } - - SubKey->KeyCell = NewKeyCell; - SubKey->KeyCellOffset = NKBOffset; - - if (ParentKeyCell->SubKeyLists[Storage] == HCELL_NIL) - { - Status = CmiAllocateHashTableCell (RegistryHive, - &HashBlock, - &ParentKeyCell->SubKeyLists[Storage], - REG_INIT_HASH_TABLE_SIZE, - Storage); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - } - else - { - HashBlock = (PHASH_TABLE_CELL)HvGetCell (&RegistryHive->Hive, - ParentKeyCell->SubKeyLists[Storage]); - ASSERT(HashBlock->Id == REG_HASH_TABLE_CELL_ID); - - if (((ParentKeyCell->SubKeyCounts[Storage] + 1) >= HashBlock->HashTableSize)) - { - PHASH_TABLE_CELL NewHashBlock; - HCELL_INDEX HTOffset; - - /* Reallocate the hash table cell */ - Status = CmiAllocateHashTableCell (RegistryHive, - &NewHashBlock, - &HTOffset, - HashBlock->HashTableSize + - REG_EXTEND_HASH_TABLE_SIZE, - Storage); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - RtlZeroMemory(&NewHashBlock->Table[0], - sizeof(NewHashBlock->Table[0]) * NewHashBlock->HashTableSize); - RtlCopyMemory(&NewHashBlock->Table[0], - &HashBlock->Table[0], - sizeof(NewHashBlock->Table[0]) * HashBlock->HashTableSize); - HvFreeCell (&RegistryHive->Hive, ParentKeyCell->SubKeyLists[Storage]); - ParentKeyCell->SubKeyLists[Storage] = HTOffset; - HashBlock = NewHashBlock; - } - } - - Status = CmiAddKeyToHashTable(RegistryHive, - HashBlock, - ParentKeyCell, - Storage, - NewKeyCell, - NKBOffset); - if (NT_SUCCESS(Status)) - { - ParentKeyCell->SubKeyCounts[Storage]++; - } - - KeQuerySystemTime (&ParentKeyCell->LastWriteTime); - HvMarkCellDirty (&RegistryHive->Hive, ParentKey->KeyCellOffset, FALSE); - - return(Status); -} - -NTSTATUS -CmiAllocateHashTableCell (IN PEREGISTRY_HIVE RegistryHive, - OUT PHASH_TABLE_CELL *HashBlock, - OUT HCELL_INDEX *HBOffset, - IN ULONG SubKeyCount, - IN HSTORAGE_TYPE Storage) -{ - PHASH_TABLE_CELL NewHashBlock; - ULONG NewHashSize; - NTSTATUS Status; - - Status = STATUS_SUCCESS; - *HashBlock = NULL; - NewHashSize = sizeof(HASH_TABLE_CELL) + - (SubKeyCount * sizeof(HASH_RECORD)); - *HBOffset = HvAllocateCell (&RegistryHive->Hive, NewHashSize, Storage, HCELL_NIL); - - if (*HBOffset == HCELL_NIL) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - } - else - { - ASSERT(SubKeyCount <= 0xffff); /* should really be USHORT_MAX or similar */ - NewHashBlock = (PHASH_TABLE_CELL)HvGetCell (&RegistryHive->Hive, *HBOffset); - NewHashBlock->Id = REG_HASH_TABLE_CELL_ID; - NewHashBlock->HashTableSize = (USHORT)SubKeyCount; - *HashBlock = NewHashBlock; - } - - return Status; -} - -NTSTATUS -CmiAddKeyToHashTable(PEREGISTRY_HIVE RegistryHive, - PHASH_TABLE_CELL HashCell, - PCM_KEY_NODE KeyCell, - HSTORAGE_TYPE StorageType, - PCM_KEY_NODE NewKeyCell, - HCELL_INDEX NKBOffset) -{ - ULONG i = KeyCell->SubKeyCounts[StorageType]; - - HashCell->Table[i].KeyOffset = NKBOffset; - HashCell->Table[i].HashValue = 0; - if (NewKeyCell->Flags & REG_KEY_NAME_PACKED) - { - RtlCopyMemory(&HashCell->Table[i].HashValue, - NewKeyCell->Name, - min(NewKeyCell->NameSize, sizeof(ULONG))); - } - HvMarkCellDirty(&RegistryHive->Hive, KeyCell->SubKeyLists[StorageType], FALSE); - return STATUS_SUCCESS; -} - /* EOF */
Modified: trunk/reactos/ntoskrnl/cm/regobj.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cm/regobj.c?rev=29... ============================================================================== --- trunk/reactos/ntoskrnl/cm/regobj.c (original) +++ trunk/reactos/ntoskrnl/cm/regobj.c Mon Oct 29 00:31:46 2007 @@ -432,7 +432,7 @@ return(STATUS_UNSUCCESSFUL); }
- if ((SubKeyCell->Flags & REG_KEY_LINK_CELL) && + if ((SubKeyCell->Flags & KEY_SYM_LINK) && !((Attributes & OBJ_OPENLINK) && (EndPtr == NULL))) { RtlInitUnicodeString(&LinkPath, NULL); @@ -526,7 +526,7 @@ } else { - if ((FoundObject->KeyCell->Flags & REG_KEY_LINK_CELL) && + if ((FoundObject->KeyCell->Flags & KEY_SYM_LINK) && !((Attributes & OBJ_OPENLINK) && (EndPtr == NULL))) { DPRINT("Found link\n"); @@ -832,7 +832,7 @@ return(Status); }
- if (ValueCell->DataType != REG_LINK) + if (ValueCell->Type != REG_LINK) { DPRINT1("Type != REG_LINK\n!"); return(STATUS_UNSUCCESSFUL); @@ -841,17 +841,17 @@ if (TargetPath->Buffer == NULL && TargetPath->MaximumLength == 0) { TargetPath->Length = 0; - TargetPath->MaximumLength = (USHORT)ValueCell->DataSize + sizeof(WCHAR); + TargetPath->MaximumLength = (USHORT)ValueCell->DataLength + sizeof(WCHAR); TargetPath->Buffer = ExAllocatePool(NonPagedPool, TargetPath->MaximumLength); }
TargetPath->Length = min((USHORT)TargetPath->MaximumLength - sizeof(WCHAR), - (USHORT)ValueCell->DataSize); - - if (ValueCell->DataSize > 0) - { - DataCell = HvGetCell (&RegistryHive->Hive, ValueCell->DataOffset); + (USHORT)ValueCell->DataLength); + + if (ValueCell->DataLength > 0) + { + DataCell = HvGetCell (&RegistryHive->Hive, ValueCell->Data); RtlCopyMemory(TargetPath->Buffer, DataCell, TargetPath->Length); @@ -860,7 +860,7 @@ else { RtlCopyMemory(TargetPath->Buffer, - &ValueCell->DataOffset, + &ValueCell->Data, TargetPath->Length); TargetPath->Buffer[TargetPath->Length / sizeof(WCHAR)] = 0; }
Modified: trunk/reactos/ntoskrnl/config/cm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cm.h?rev=29... ============================================================================== --- trunk/reactos/ntoskrnl/config/cm.h (original) +++ trunk/reactos/ntoskrnl/config/cm.h Mon Oct 29 00:31:46 2007 @@ -44,14 +44,6 @@ ASSERTMSG("Big keys not supported!", !CmpIsKeyValueBig(h, s));
// -// Key Types -// -#define CM_KEY_INDEX_ROOT 0x6972 -#define CM_KEY_INDEX_LEAF 0x696c -#define CM_KEY_FAST_LEAF 0x666c -#define CM_KEY_HASH_LEAF 0x686c - -// // CM_KEY_CONTROL_BLOCK Flags // #define CM_KCB_NO_SUBKEY 0x01 @@ -64,29 +56,11 @@ #define CM_KEY_READ_ONLY_KEY 0x80
// -// CM_KEY_NODE Signature and Flags -// -#define CM_KEY_NODE_SIGNATURE 0x6B6E -#define CM_LINK_NODE_SIGNATURE 0x6B6C -#define KEY_IS_VOLATILE 0x01 -#define KEY_HIVE_EXIT 0x02 -#define KEY_HIVE_ENTRY 0x04 -#define KEY_NO_DELETE 0x08 -#define KEY_SYM_LINK 0x10 -#define KEY_COMP_NAME 0x20 -#define KEY_PREFEF_HANDLE 0x40 -#define KEY_VIRT_MIRRORED 0x80 -#define KEY_VIRT_TARGET 0x100 -#define KEY_VIRTUAL_STORE 0x200 - -// -// CM_KEY_VALUE Signature and Flags -// -#define CM_KEY_VALUE_SIGNATURE 0x6b76 +// CM_KEY_VALUE Types +// #define CM_KEY_VALUE_SMALL 0x4 #define CM_KEY_VALUE_BIG 0x3FD8 #define CM_KEY_VALUE_SPECIAL_SIZE 0x80000000 -#define VALUE_COMP_NAME 0x0001
// // Number of various lists and hashes @@ -419,127 +393,6 @@ PKTHREAD CreatorOwner; } CMHIVE, *PCMHIVE;
-#include <pshpack1.h> - -typedef struct _CM_VIEW_OF_FILE -{ - LIST_ENTRY LRUViewList; - LIST_ENTRY PinViewList; - ULONG FileOffset; - ULONG Size; - PULONG ViewAddress; - PVOID Bcb; - ULONG UseCount; -} CM_VIEW_OF_FILE, *PCM_VIEW_OF_FILE; - -typedef struct _CHILD_LIST -{ - ULONG Count; - HCELL_INDEX List; -} CHILD_LIST, *PCHILD_LIST; - -typedef struct _CM_KEY_NODE -{ - USHORT Signature; - USHORT Flags; - LARGE_INTEGER LastWriteTime; - ULONG Spare; - HCELL_INDEX Parent; - ULONG SubKeyCounts[HTYPE_COUNT]; - HCELL_INDEX SubKeyLists[HTYPE_COUNT]; - CHILD_LIST ValueList; - HCELL_INDEX Security; - HCELL_INDEX Class; - ULONG MaxNameLen; - ULONG MaxClassLen; - ULONG MaxValueNameLen; - ULONG MaxValueDataLen; - ULONG WorkVar; - USHORT NameLength; - USHORT ClassLength; - WCHAR Name[0]; -} CM_KEY_NODE, *PCM_KEY_NODE; - -typedef struct _VALUE_LIST_CELL -{ - HCELL_INDEX ValueOffset[0]; -} VALUE_LIST_CELL, *PVALUE_LIST_CELL; - -typedef struct _CM_KEY_VALUE -{ - USHORT Signature; // "kv" - USHORT NameLength; // length of Name - ULONG DataLength; // length of datas in the cell pointed by DataOffset - HCELL_INDEX Data;// datas are here if high bit of DataSize is set - ULONG Type; - USHORT Flags; - USHORT Unused1; - WCHAR Name[0]; /* warning : not zero terminated */ -} CM_KEY_VALUE, *PCM_KEY_VALUE; - -typedef struct _CM_KEY_SECURITY -{ - USHORT Signature; // "sk" - USHORT Reserved; - HCELL_INDEX Flink; - HCELL_INDEX Blink; - ULONG ReferenceCount; - ULONG DescriptorLength; - //SECURITY_DESCRIPTOR_RELATIVE Descriptor; - UCHAR Data[0]; -} CM_KEY_SECURITY, *PCM_KEY_SECURITY; - -#include <poppack.h> - -// -// Generic Index Entry -// -typedef struct _CM_INDEX -{ - HCELL_INDEX Cell; - union - { - UCHAR NameHint[4]; - ULONG HashKey; - }; -} CM_INDEX, *PCM_INDEX; - -// -// Key Index -// -typedef struct _CM_KEY_INDEX -{ - USHORT Signature; - USHORT Count; - HCELL_INDEX List[ANYSIZE_ARRAY]; -} CM_KEY_INDEX, *PCM_KEY_INDEX; - -// -// Fast/Hash Key Index -// -typedef struct _CM_KEY_FAST_INDEX -{ - USHORT Signature; - USHORT Count; - CM_INDEX List[ANYSIZE_ARRAY]; -} CM_KEY_FAST_INDEX, *PCM_KEY_FAST_INDEX; - -// -// Cell Data -// -typedef struct _CELL_DATA -{ - union - { - CM_KEY_NODE KeyNode; - CM_KEY_VALUE KeyValue; - CM_KEY_SECURITY KeySecurity; - CM_KEY_INDEX KeyIndex; - HCELL_INDEX KeyList[ANYSIZE_ARRAY]; - WCHAR KeyString[ANYSIZE_ARRAY]; - } u; -} CELL_DATA, *PCELL_DATA; - // // Cached Value Index //
Modified: trunk/reactos/ntoskrnl/config/cmsysini.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmsysini.c?... ============================================================================== --- trunk/reactos/ntoskrnl/config/cmsysini.c (original) +++ trunk/reactos/ntoskrnl/config/cmsysini.c Mon Oct 29 00:31:46 2007 @@ -607,7 +607,7 @@ if (!KeyCell) return FALSE;
/* Setup the cell */ - KeyCell->Signature = (USHORT)CM_KEY_NODE_SIGNATURE;; + KeyCell->Signature = (USHORT)CM_KEY_NODE_SIGNATURE; KeyCell->Flags = KEY_HIVE_ENTRY | KEY_NO_DELETE; KeQuerySystemTime(&SystemTime); KeyCell->LastWriteTime = SystemTime;
Modified: trunk/reactos/tools/mkhive/cmi.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/mkhive/cmi.c?rev=2994... ============================================================================== --- trunk/reactos/tools/mkhive/cmi.c (original) +++ trunk/reactos/tools/mkhive/cmi.c Mon Oct 29 00:31:46 2007 @@ -150,39 +150,39 @@ static NTSTATUS CmiAddKeyToHashTable( IN PEREGISTRY_HIVE RegistryHive, - IN OUT PHASH_TABLE_CELL HashCell, + IN OUT PCM_KEY_FAST_INDEX HashCell, IN PCM_KEY_NODE KeyCell, IN HSTORAGE_TYPE StorageType, IN PCM_KEY_NODE NewKeyCell, IN HCELL_INDEX NKBOffset) { ULONG i = KeyCell->SubKeyCounts[StorageType]; - ULONG HashValue; - - if (NewKeyCell->Flags & REG_KEY_NAME_PACKED) + ULONG HashKey; + + if (NewKeyCell->Flags & KEY_COMP_NAME) { RtlCopyMemory( - &HashValue, + &HashKey, NewKeyCell->Name, - min(NewKeyCell->NameSize, sizeof(ULONG))); + min(NewKeyCell->NameLength, sizeof(ULONG))); }
for (i = 0; i < KeyCell->SubKeyCounts[StorageType]; i++) { - if (HashCell->Table[i].HashValue > HashValue) + if (HashCell->List[i].HashKey > HashKey) break; }
if (i < KeyCell->SubKeyCounts[StorageType]) { - RtlMoveMemory(HashCell->Table + i + 1, - HashCell->Table + i, - (HashCell->HashTableSize - 1 - i) * - sizeof(HashCell->Table[0])); - } - - HashCell->Table[i].KeyOffset = NKBOffset; - HashCell->Table[i].HashValue = HashValue; + RtlMoveMemory(HashCell->List + i + 1, + HashCell->List + i, + (HashCell->Count - 1 - i) * + sizeof(HashCell->List[0])); + } + + HashCell->List[i].Cell = NKBOffset; + HashCell->List[i].HashKey = HashKey; HvMarkCellDirty(&RegistryHive->Hive, KeyCell->SubKeyLists[StorageType], FALSE); return STATUS_SUCCESS; } @@ -190,19 +190,19 @@ static NTSTATUS CmiAllocateHashTableCell ( IN PEREGISTRY_HIVE RegistryHive, - OUT PHASH_TABLE_CELL *HashBlock, + OUT PCM_KEY_FAST_INDEX *HashBlock, OUT HCELL_INDEX *HBOffset, IN USHORT SubKeyCount, IN HSTORAGE_TYPE Storage) { - PHASH_TABLE_CELL NewHashBlock; + PCM_KEY_FAST_INDEX NewHashBlock; ULONG NewHashSize; NTSTATUS Status;
Status = STATUS_SUCCESS; *HashBlock = NULL; - NewHashSize = sizeof(HASH_TABLE_CELL) + - (SubKeyCount * sizeof(HASH_RECORD)); + NewHashSize = sizeof(CM_KEY_FAST_INDEX) + + (SubKeyCount * sizeof(CM_INDEX)); *HBOffset = HvAllocateCell(&RegistryHive->Hive, NewHashSize, Storage, HCELL_NIL);
if (*HBOffset == HCELL_NIL) @@ -212,9 +212,9 @@ else { ASSERT(SubKeyCount <= USHORT_MAX); - NewHashBlock = (PHASH_TABLE_CELL)HvGetCell (&RegistryHive->Hive, *HBOffset); - NewHashBlock->Id = REG_HASH_TABLE_CELL_ID; - NewHashBlock->HashTableSize = SubKeyCount; + NewHashBlock = (PCM_KEY_FAST_INDEX)HvGetCell (&RegistryHive->Hive, *HBOffset); + NewHashBlock->Signature = CM_KEY_FAST_LEAF; + NewHashBlock->Count = SubKeyCount; *HashBlock = NewHashBlock; }
@@ -231,12 +231,12 @@ OUT PCM_KEY_NODE *pSubKeyCell, OUT HCELL_INDEX *pBlockOffset) { - PHASH_TABLE_CELL HashBlock; + PCM_KEY_FAST_INDEX HashBlock; HCELL_INDEX NKBOffset; PCM_KEY_NODE NewKeyCell; ULONG NewBlockSize; NTSTATUS Status; - USHORT NameSize; + USHORT NameLength; PWSTR NamePtr; BOOLEAN Packable; HSTORAGE_TYPE Storage; @@ -250,17 +250,17 @@ if (SubKeyName->Buffer[0] == L'\') { NamePtr = &SubKeyName->Buffer[1]; - NameSize = SubKeyName->Length - sizeof(WCHAR); + NameLength = SubKeyName->Length - sizeof(WCHAR); } else { NamePtr = SubKeyName->Buffer; - NameSize = SubKeyName->Length; + NameLength = SubKeyName->Length; }
/* Check whether key name can be packed */ Packable = TRUE; - for (i = 0; i < NameSize / sizeof(WCHAR); i++) + for (i = 0; i < NameLength / sizeof(WCHAR); i++) { if (NamePtr[i] & 0xFF00) { @@ -272,13 +272,13 @@ /* Adjust name size */ if (Packable) { - NameSize = NameSize / sizeof(WCHAR); + NameLength = NameLength / sizeof(WCHAR); }
Status = STATUS_SUCCESS;
Storage = (CreateOptions & REG_OPTION_VOLATILE) ? Volatile : Stable; - NewBlockSize = sizeof(CM_KEY_NODE) + NameSize; + NewBlockSize = sizeof(CM_KEY_NODE) + NameLength; NKBOffset = HvAllocateCell(&RegistryHive->Hive, NewBlockSize, Storage, HCELL_NIL); if (NKBOffset == HCELL_NIL) { @@ -287,10 +287,10 @@ else { NewKeyCell = (PCM_KEY_NODE)HvGetCell (&RegistryHive->Hive, NKBOffset); - NewKeyCell->Id = REG_KEY_CELL_ID; + NewKeyCell->Signature = CM_KEY_NODE_SIGNATURE; if (CreateOptions & REG_OPTION_VOLATILE) { - NewKeyCell->Flags = REG_KEY_VOLATILE_CELL; + NewKeyCell->Flags = KEY_IS_VOLATILE; } else { @@ -304,17 +304,17 @@ NewKeyCell->SubKeyLists[Volatile] = HCELL_NIL; NewKeyCell->ValueList.Count = 0; NewKeyCell->ValueList.List = HCELL_NIL; - NewKeyCell->SecurityKeyOffset = HCELL_NIL; - NewKeyCell->ClassNameOffset = HCELL_NIL; + NewKeyCell->Security = HCELL_NIL; + NewKeyCell->Class = HCELL_NIL;
/* Pack the key name */ - NewKeyCell->NameSize = NameSize; + NewKeyCell->NameLength = NameLength; if (Packable) { - NewKeyCell->Flags |= REG_KEY_NAME_PACKED; - for (i = 0; i < NameSize; i++) + NewKeyCell->Flags |= KEY_COMP_NAME; + for (i = 0; i < NameLength; i++) { - NewKeyCell->Name[i] = (CHAR)(NamePtr[i] & 0x00FF); + ((PCHAR)NewKeyCell->Name)[i] = (CHAR)(NamePtr[i] & 0x00FF); } } else @@ -322,7 +322,7 @@ RtlCopyMemory( NewKeyCell->Name, NamePtr, - NameSize); + NameLength); }
VERIFY_KEY_CELL(NewKeyCell); @@ -348,14 +348,14 @@ } else { - HashBlock = (PHASH_TABLE_CELL)HvGetCell ( + HashBlock = (PCM_KEY_FAST_INDEX)HvGetCell ( &RegistryHive->Hive, ParentKeyCell->SubKeyLists[Storage]); - ASSERT(HashBlock->Id == REG_HASH_TABLE_CELL_ID); - - if (((ParentKeyCell->SubKeyCounts[Storage] + 1) >= HashBlock->HashTableSize)) - { - PHASH_TABLE_CELL NewHashBlock; + ASSERT(HashBlock->Signature == CM_KEY_FAST_LEAF); + + if (((ParentKeyCell->SubKeyCounts[Storage] + 1) >= HashBlock->Count)) + { + PCM_KEY_FAST_INDEX NewHashBlock; HCELL_INDEX HTOffset;
/* Reallocate the hash table cell */ @@ -363,7 +363,7 @@ RegistryHive, &NewHashBlock, &HTOffset, - HashBlock->HashTableSize + + HashBlock->Count + REG_EXTEND_HASH_TABLE_SIZE, Storage); if (!NT_SUCCESS(Status)) @@ -372,12 +372,12 @@ }
RtlZeroMemory( - &NewHashBlock->Table[0], - sizeof(NewHashBlock->Table[0]) * NewHashBlock->HashTableSize); + &NewHashBlock->List[0], + sizeof(NewHashBlock->List[0]) * NewHashBlock->Count); RtlCopyMemory( - &NewHashBlock->Table[0], - &HashBlock->Table[0], - sizeof(NewHashBlock->Table[0]) * HashBlock->HashTableSize); + &NewHashBlock->List[0], + &HashBlock->List[0], + sizeof(NewHashBlock->List[0]) * HashBlock->Count); HvFreeCell (&RegistryHive->Hive, ParentKeyCell->SubKeyLists[Storage]); ParentKeyCell->SubKeyLists[Storage] = HTOffset; HashBlock = NewHashBlock; @@ -443,24 +443,24 @@ PWCHAR UnicodeName; USHORT i;
- if (KeyCell->Flags & REG_KEY_NAME_PACKED) - { - if (KeyName->Length != KeyCell->NameSize * sizeof(WCHAR)) + if (KeyCell->Flags & KEY_COMP_NAME) + { + if (KeyName->Length != KeyCell->NameLength * sizeof(WCHAR)) return FALSE;
- for (i = 0; i < KeyCell->NameSize; i++) - { - if (KeyName->Buffer[i] != (WCHAR)KeyCell->Name[i]) + for (i = 0; i < KeyCell->NameLength; i++) + { + if (((PCHAR)KeyName->Buffer)[i] != (WCHAR)KeyCell->Name[i]) return FALSE; } } else { - if (KeyName->Length != KeyCell->NameSize) + if (KeyName->Length != KeyCell->NameLength) return FALSE;
UnicodeName = (PWCHAR)KeyCell->Name; - for (i = 0; i < KeyCell->NameSize / sizeof(WCHAR); i++) + for (i = 0; i < KeyCell->NameLength / sizeof(WCHAR); i++) { if (KeyName->Buffer[i] != UnicodeName[i]) return FALSE; @@ -480,27 +480,27 @@
DPRINT("Flags: %hx\n", KeyCell->Flags);
- if (KeyCell->Flags & REG_KEY_NAME_PACKED) - { - if (KeyName->Length != KeyCell->NameSize * sizeof(WCHAR)) + if (KeyCell->Flags & KEY_COMP_NAME) + { + if (KeyName->Length != KeyCell->NameLength * sizeof(WCHAR)) return FALSE;
/* FIXME: use _strnicmp */ - for (i = 0; i < KeyCell->NameSize; i++) - { - if (RtlUpcaseUnicodeChar(KeyName->Buffer[i]) != + for (i = 0; i < KeyCell->NameLength; i++) + { + if (RtlUpcaseUnicodeChar(((PCHAR)KeyName->Buffer)[i]) != RtlUpcaseUnicodeChar((WCHAR)KeyCell->Name[i])) return FALSE; } } else { - if (KeyName->Length != KeyCell->NameSize) + if (KeyName->Length != KeyCell->NameLength) return FALSE;
UnicodeName = (PWCHAR)KeyCell->Name; /* FIXME: use _strnicmp */ - for (i = 0; i < KeyCell->NameSize / sizeof(WCHAR); i++) + for (i = 0; i < KeyCell->NameLength / sizeof(WCHAR); i++) { if (RtlUpcaseUnicodeChar(KeyName->Buffer[i]) != RtlUpcaseUnicodeChar(UnicodeName[i])) @@ -520,7 +520,7 @@ OUT PCM_KEY_NODE *pSubKeyCell, OUT HCELL_INDEX *pBlockOffset) { - PHASH_TABLE_CELL HashBlock; + PCM_KEY_FAST_INDEX HashBlock; PCM_KEY_NODE CurSubKeyCell; ULONG Storage; ULONG i; @@ -542,42 +542,42 @@ }
/* Get hash table */ - HashBlock = (PHASH_TABLE_CELL)HvGetCell (&RegistryHive->Hive, KeyCell->SubKeyLists[Storage]); - if (!HashBlock || HashBlock->Id != REG_HASH_TABLE_CELL_ID) + HashBlock = (PCM_KEY_FAST_INDEX)HvGetCell (&RegistryHive->Hive, KeyCell->SubKeyLists[Storage]); + if (!HashBlock || HashBlock->Signature != CM_KEY_FAST_LEAF) return STATUS_UNSUCCESSFUL;
for (i = 0; i < KeyCell->SubKeyCounts[Storage]; i++) { if (Attributes & OBJ_CASE_INSENSITIVE) { - if ((HashBlock->Table[i].HashValue == 0 - || CmiCompareHashI(SubKeyName, (PCHAR)&HashBlock->Table[i].HashValue))) + if ((HashBlock->List[i].HashKey == 0 + || CmiCompareHashI(SubKeyName, (PCHAR)&HashBlock->List[i].HashKey))) { CurSubKeyCell = (PCM_KEY_NODE)HvGetCell ( &RegistryHive->Hive, - HashBlock->Table[i].KeyOffset); + HashBlock->List[i].Cell);
if (CmiCompareKeyNamesI(SubKeyName, CurSubKeyCell)) { *pSubKeyCell = CurSubKeyCell; - *pBlockOffset = HashBlock->Table[i].KeyOffset; + *pBlockOffset = HashBlock->List[i].Cell; return STATUS_SUCCESS; } } } else { - if ((HashBlock->Table[i].HashValue == 0 - || CmiCompareHash(SubKeyName, (PCHAR)&HashBlock->Table[i].HashValue))) + if ((HashBlock->List[i].HashKey == 0 + || CmiCompareHash(SubKeyName, (PCHAR)&HashBlock->List[i].HashKey))) { CurSubKeyCell = (PCM_KEY_NODE)HvGetCell ( &RegistryHive->Hive, - HashBlock->Table[i].KeyOffset); + HashBlock->List[i].Cell);
if (CmiCompareKeyNames(SubKeyName, CurSubKeyCell)) { *pSubKeyCell = CurSubKeyCell; - *pBlockOffset = HashBlock->Table[i].KeyOffset; + *pBlockOffset = HashBlock->List[i].Cell; return STATUS_SUCCESS; } } @@ -619,32 +619,32 @@ { PCM_KEY_VALUE NewValueCell; BOOLEAN Packable; - USHORT NameSize, i; + USHORT NameLength, i; NTSTATUS Status;
Status = STATUS_SUCCESS;
- NameSize = CmiGetPackedNameLength(ValueName, &Packable); - - DPRINT("ValueName->Length %lu NameSize %lu\n", ValueName->Length, NameSize); - - *VBOffset = HvAllocateCell(&RegistryHive->Hive, sizeof(CM_KEY_VALUE) + NameSize, Storage, HCELL_NIL); + NameLength = CmiGetPackedNameLength(ValueName, &Packable); + + DPRINT("ValueName->Length %lu NameLength %lu\n", ValueName->Length, NameLength); + + *VBOffset = HvAllocateCell(&RegistryHive->Hive, sizeof(CM_KEY_VALUE) + NameLength, Storage, HCELL_NIL); if (*VBOffset == HCELL_NIL) { Status = STATUS_INSUFFICIENT_RESOURCES; } else { - ASSERT(NameSize <= USHORT_MAX); + ASSERT(NameLength <= USHORT_MAX); NewValueCell = (PCM_KEY_VALUE)HvGetCell (&RegistryHive->Hive, *VBOffset); - NewValueCell->Id = REG_VALUE_CELL_ID; - NewValueCell->NameSize = (USHORT)NameSize; + NewValueCell->Signature = CM_KEY_VALUE_SIGNATURE; + NewValueCell->NameLength = (USHORT)NameLength; if (Packable) { /* Pack the value name */ - for (i = 0; i < NameSize; i++) - NewValueCell->Name[i] = (CHAR)ValueName->Buffer[i]; - NewValueCell->Flags |= REG_VALUE_NAME_PACKED; + for (i = 0; i < NameLength; i++) + ((PCHAR)NewValueCell->Name)[i] = (CHAR)ValueName->Buffer[i]; + NewValueCell->Flags |= VALUE_COMP_NAME; } else { @@ -652,12 +652,12 @@ RtlCopyMemory( NewValueCell->Name, ValueName->Buffer, - NameSize); + NameLength); NewValueCell->Flags = 0; } - NewValueCell->DataType = 0; - NewValueCell->DataSize = 0; - NewValueCell->DataOffset = HCELL_NIL; + NewValueCell->Type = 0; + NewValueCell->DataLength = 0; + NewValueCell->Data = HCELL_NIL; *ValueCell = NewValueCell; }
@@ -681,7 +681,7 @@ HSTORAGE_TYPE Storage; NTSTATUS Status;
- Storage = (KeyCell->Flags & REG_KEY_VOLATILE_CELL) ? Volatile : Stable; + Storage = (KeyCell->Flags & KEY_IS_VOLATILE) ? Volatile : Stable; if (KeyCell->ValueList.List == HCELL_NIL) { /* Allocate some room for the value list */ @@ -811,9 +811,9 @@
if (CmiComparePackedNames( ValueName, - CurValueCell->Name, - CurValueCell->NameSize, - (BOOLEAN)((CurValueCell->Flags & REG_VALUE_NAME_PACKED) ? TRUE : FALSE))) + (PUCHAR)CurValueCell->Name, + CurValueCell->NameLength, + (BOOLEAN)((CurValueCell->Flags & VALUE_COMP_NAME) ? TRUE : FALSE))) { *pValueCell = CurValueCell; *pValueCellOffset = ValueListCell->ValueOffset[i];
Modified: trunk/reactos/tools/mkhive/registry.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/mkhive/registry.c?rev... ============================================================================== --- trunk/reactos/tools/mkhive/registry.c (original) +++ trunk/reactos/tools/mkhive/registry.c Mon Oct 29 00:31:46 2007 @@ -37,6 +37,9 @@ #define NDEBUG #include "mkhive.h"
+#define REG_DATA_SIZE_MASK 0x7FFFFFFF +#define REG_DATA_IN_OFFSET 0x80000000 + static EREGISTRY_HIVE RootHive; static MEMKEY RootKey; EREGISTRY_HIVE DefaultHive; /* \Registry\User.DEFAULT */ @@ -362,10 +365,10 @@ return ERROR_UNSUCCESSFUL;
/* Get size of the allocated cellule (if any) */ - if (!(ValueCell->DataSize & REG_DATA_IN_OFFSET) && - (ValueCell->DataSize & REG_DATA_SIZE_MASK) != 0) - { - DataCell = HvGetCell(&Key->RegistryHive->Hive, ValueCell->DataOffset); + if (!(ValueCell->DataLength & REG_DATA_IN_OFFSET) && + (ValueCell->DataLength & REG_DATA_SIZE_MASK) != 0) + { + DataCell = HvGetCell(&Key->RegistryHive->Hive, ValueCell->Data); if (!DataCell) return ERROR_UNSUCCESSFUL; DataCellSize = -HvGetCellSize(&Key->RegistryHive->Hive, DataCell); @@ -379,13 +382,13 @@ if (cbData <= sizeof(HCELL_INDEX)) { /* If data size <= sizeof(HCELL_INDEX) then store data in the data offset */ - DPRINT("ValueCell->DataSize %lu\n", ValueCell->DataSize); + DPRINT("ValueCell->DataLength %lu\n", ValueCell->DataLength); if (DataCell) - HvFreeCell(&Key->RegistryHive->Hive, ValueCell->DataOffset); - - RtlCopyMemory(&ValueCell->DataOffset, lpData, cbData); - ValueCell->DataSize = (ULONG)(cbData | REG_DATA_IN_OFFSET); - ValueCell->DataType = dwType; + HvFreeCell(&Key->RegistryHive->Hive, ValueCell->Data); + + RtlCopyMemory(&ValueCell->Data, lpData, cbData); + ValueCell->DataLength = (ULONG)(cbData | REG_DATA_IN_OFFSET); + ValueCell->Type = dwType; HvMarkCellDirty(&Key->RegistryHive->Hive, ValueCellOffset, FALSE); } else @@ -396,7 +399,7 @@ * data block and allocate a new one. */ HCELL_INDEX NewOffset;
- DPRINT("ValueCell->DataSize %lu\n", ValueCell->DataSize); + DPRINT("ValueCell->DataLength %lu\n", ValueCell->DataLength);
NewOffset = HvAllocateCell(&Key->RegistryHive->Hive, cbData, Stable, HCELL_NIL); if (NewOffset == HCELL_NIL) @@ -406,17 +409,17 @@ }
if (DataCell) - HvFreeCell(&Key->RegistryHive->Hive, ValueCell->DataOffset); - - ValueCell->DataOffset = NewOffset; + HvFreeCell(&Key->RegistryHive->Hive, ValueCell->Data); + + ValueCell->Data = NewOffset; DataCell = (PVOID)HvGetCell(&Key->RegistryHive->Hive, NewOffset); }
/* Copy new contents to cellule */ RtlCopyMemory(DataCell, lpData, cbData); - ValueCell->DataSize = (ULONG)(cbData & REG_DATA_SIZE_MASK); - ValueCell->DataType = dwType; - HvMarkCellDirty(&Key->RegistryHive->Hive, ValueCell->DataOffset, FALSE); + ValueCell->DataLength = (ULONG)(cbData & REG_DATA_SIZE_MASK); + ValueCell->Type = dwType; + HvMarkCellDirty(&Key->RegistryHive->Hive, ValueCell->Data, FALSE); HvMarkCellDirty(&Key->RegistryHive->Hive, ValueCellOffset, FALSE); }