From 0744b08c526a59d86025036fd26a14fef5fe7c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sun, 5 Oct 2014 19:45:37 +0000 Subject: [PATCH] [MKHIVE] Remove key name in our custom registry tree; use cell index instead svn path=/trunk/; revision=64547 --- reactos/tools/mkhive/registry.c | 79 +++++++++++++++++---------------- reactos/tools/mkhive/registry.h | 4 +- 2 files changed, 41 insertions(+), 42 deletions(-) diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index 36e3a7c49cf..d42454d37e4 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.c @@ -67,24 +67,15 @@ CreateInMemoryStructure( 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 @@ RegpOpenOrCreateKey( PLIST_ENTRY Ptr; PCM_KEY_NODE SubKeyCell; HCELL_INDEX BlockOffset; + BOOLEAN ParentIsSystem = FALSE; DPRINT("RegpCreateOpenKey('%S')\n", KeyName); @@ -148,23 +140,14 @@ RegpOpenOrCreateKey( } /* Redirect from 'CurrentControlSet' to 'ControlSet001' */ - if (!strncmpW(LocalKeyName, L"CurrentControlSet", 17) && - ParentKey->NameSize == 12 && - !memcmp(ParentKey->Name, L"SYSTEM", 12)) - RtlInitUnicodeString(&KeyString, L"ControlSet001"); - - /* Check subkey in memory structure */ - Ptr = ParentKey->SubKeyList.Flink; - while (Ptr != &ParentKey->SubKeyList) + if (!strncmpiW(LocalKeyName, L"CurrentControlSet", 17) && ParentIsSystem) { - 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; + RtlInitUnicodeString(&KeyString, L"ControlSet001"); + ParentIsSystem = FALSE; + } + else + { + ParentIsSystem = (strncmpiW(LocalKeyName, L"SYSTEM", 6) == 0); } Status = CmiScanForSubKey( @@ -174,6 +157,24 @@ RegpOpenOrCreateKey( 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,22 +185,23 @@ RegpOpenOrCreateKey( 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; if (End) @@ -700,7 +702,6 @@ RegShutdownRegistry(VOID) { /* FIXME: clean up the complete hive */ - free(RootKey->Name); free(RootKey); } diff --git a/reactos/tools/mkhive/registry.h b/reactos/tools/mkhive/registry.h index 40df369b54d..27843d44abd 100644 --- a/reactos/tools/mkhive/registry.h +++ b/reactos/tools/mkhive/registry.h @@ -29,15 +29,13 @@ typedef struct _REG_KEY 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;