Author: hpoussin
Date: Sun Oct 5 19:45:37 2014
New Revision: 64547
URL:
http://svn.reactos.org/svn/reactos?rev=64547&view=rev
Log:
[MKHIVE] Remove key name in our custom registry tree; use cell index instead
Modified:
trunk/reactos/tools/mkhive/registry.c
trunk/reactos/tools/mkhive/registry.h
Modified: trunk/reactos/tools/mkhive/registry.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/mkhive/registry.c?re…
==============================================================================
--- trunk/reactos/tools/mkhive/registry.c [iso-8859-1] (original)
+++ trunk/reactos/tools/mkhive/registry.c [iso-8859-1] Sun Oct 5 19:45:37 2014
@@ -67,24 +67,15 @@
Key->SubKeyCount = 0;
Key->ValueCount = 0;
- Key->NameSize = KeyName->Length;
- /* FIXME: It's not enough to allocate this way, because later
- this memory gets overwritten with bigger names */
- Key->Name = malloc (Key->NameSize);
- if (!Key->Name)
- return NULL;
- memcpy(Key->Name, KeyName->Buffer, KeyName->Length);
-
Key->DataType = 0;
Key->DataSize = 0;
Key->Data = NULL;
Key->RegistryHive = RegistryHive;
- Key->KeyCellOffset = KeyCellOffset;
+ Key->KeyCellOffset = Key->KeyCellOffsetInParentHive = KeyCellOffset;
Key->KeyCell = (PCM_KEY_NODE)HvGetCell (&RegistryHive->Hive,
Key->KeyCellOffset);
if (!Key->KeyCell)
{
- free(Key->Name);
free(Key);
return NULL;
}
@@ -110,6 +101,7 @@
PLIST_ENTRY Ptr;
PCM_KEY_NODE SubKeyCell;
HCELL_INDEX BlockOffset;
+ BOOLEAN ParentIsSystem = FALSE;
DPRINT("RegpCreateOpenKey('%S')\n", KeyName);
@@ -148,23 +140,14 @@
}
/* Redirect from 'CurrentControlSet' to 'ControlSet001' */
- if (!strncmpW(LocalKeyName, L"CurrentControlSet", 17) &&
- ParentKey->NameSize == 12 &&
- !memcmp(ParentKey->Name, L"SYSTEM", 12))
+ if (!strncmpiW(LocalKeyName, L"CurrentControlSet", 17) &&
ParentIsSystem)
+ {
RtlInitUnicodeString(&KeyString, L"ControlSet001");
-
- /* Check subkey in memory structure */
- Ptr = ParentKey->SubKeyList.Flink;
- while (Ptr != &ParentKey->SubKeyList)
+ ParentIsSystem = FALSE;
+ }
+ else
{
- CurrentKey = CONTAINING_RECORD(Ptr, KEY, KeyList);
- if (CurrentKey->NameSize == KeyString.Length
- && strncmpiW(CurrentKey->Name, KeyString.Buffer, KeyString.Length /
sizeof(WCHAR)) == 0)
- {
- goto nextsubkey;
- }
-
- Ptr = Ptr->Flink;
+ ParentIsSystem = (strncmpiW(LocalKeyName, L"SYSTEM", 6) == 0);
}
Status = CmiScanForSubKey(
@@ -174,6 +157,24 @@
OBJ_CASE_INSENSITIVE,
&SubKeyCell,
&BlockOffset);
+ if (NT_SUCCESS(Status))
+ {
+ /* Check subkey in memory structure */
+ Ptr = ParentKey->SubKeyList.Flink;
+ while (Ptr != &ParentKey->SubKeyList)
+ {
+ CurrentKey = CONTAINING_RECORD(Ptr, KEY, KeyList);
+ if (CurrentKey->KeyCellOffsetInParentHive == BlockOffset)
+ {
+ goto nextsubkey;
+ }
+
+ Ptr = Ptr->Flink;
+ }
+ /* If we go there, this means that key exists, but we don't know it */
+ ASSERT(FALSE);
+ }
+
if (AllowCreation && Status == STATUS_OBJECT_NAME_NOT_FOUND)
{
Status = CmiAddSubKey(
@@ -184,21 +185,22 @@
0,
&SubKeyCell,
&BlockOffset);
+ if (NT_SUCCESS(Status))
+ {
+ /* Now, SubKeyCell/BlockOffset are valid */
+ CurrentKey = CreateInMemoryStructure(
+ ParentKey->RegistryHive,
+ BlockOffset,
+ &KeyString);
+ if (!CurrentKey)
+ return ERROR_OUTOFMEMORY;
+ /* Add CurrentKey in ParentKey */
+ InsertTailList(&ParentKey->SubKeyList, &CurrentKey->KeyList);
+ ParentKey->SubKeyCount++;
+ }
}
if (!NT_SUCCESS(Status))
return ERROR_UNSUCCESSFUL;
-
- /* Now, SubKeyCell/BlockOffset are valid */
- CurrentKey = CreateInMemoryStructure(
- ParentKey->RegistryHive,
- BlockOffset,
- &KeyString);
- if (!CurrentKey)
- return ERROR_OUTOFMEMORY;
-
- /* Add CurrentKey in ParentKey */
- InsertTailList(&ParentKey->SubKeyList, &CurrentKey->KeyList);
- ParentKey->SubKeyCount++;
nextsubkey:
ParentKey = CurrentKey;
@@ -700,7 +702,6 @@
{
/* FIXME: clean up the complete hive */
- free(RootKey->Name);
free(RootKey);
}
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 [iso-8859-1] (original)
+++ trunk/reactos/tools/mkhive/registry.h [iso-8859-1] Sun Oct 5 19:45:37 2014
@@ -29,15 +29,13 @@
ULONG SubKeyCount;
ULONG ValueCount;
- ULONG NameSize;
- PWCHAR Name;
-
/* default data */
ULONG DataType;
ULONG DataSize;
PCHAR Data;
/* Information on hard disk structure */
+ HCELL_INDEX KeyCellOffsetInParentHive;
HCELL_INDEX KeyCellOffset;
PCM_KEY_NODE KeyCell;
PCMHIVE RegistryHive;