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?rev... ============================================================================== --- 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?rev... ============================================================================== --- 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;