From: Hermès Bélusca-Maïto Date: Sun, 14 Oct 2018 13:14:52 +0000 (+0200) Subject: [MKHIVE] Simplify CmiAddValueKey() by using CmpAddValueToList(). X-Git-Tag: 0.4.12-dev~530 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=ec3c61c23315e4f15b1541b2095d0a08e8305653 [MKHIVE] Simplify CmiAddValueKey() by using CmpAddValueToList(). --- diff --git a/sdk/tools/mkhive/cmi.c b/sdk/tools/mkhive/cmi.c index 34f8580d820..6856cd19026 100644 --- a/sdk/tools/mkhive/cmi.c +++ b/sdk/tools/mkhive/cmi.c @@ -21,7 +21,8 @@ * PROJECT: ReactOS hive maker * FILE: tools/mkhive/cmi.c * PURPOSE: Registry file manipulation routines - * PROGRAMMER: Hervé Poussineau + * PROGRAMMERS: Hervé Poussineau + * Hermès Bélusca-Maïto */ #define NDEBUG @@ -343,62 +344,17 @@ NTSTATUS CmiAddValueKey( IN PCMHIVE RegistryHive, IN PCM_KEY_NODE Parent, + IN ULONG ChildIndex, IN PCUNICODE_STRING ValueName, OUT PCM_KEY_VALUE *pValueCell, OUT HCELL_INDEX *pValueCellOffset) { - PCELL_DATA ValueListCell; + NTSTATUS Status; + HSTORAGE_TYPE Storage; PCM_KEY_VALUE NewValueCell; - HCELL_INDEX ValueListCellOffset; HCELL_INDEX NewValueCellOffset; - ULONG CellSize; - HSTORAGE_TYPE Storage; - -#ifndef FIELD_SIZE -#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) -#endif Storage = (Parent->Flags & KEY_IS_VOLATILE) ? Volatile : Stable; - if (Parent->ValueList.List == HCELL_NIL) - { - /* Allocate some room for the value list */ - CellSize = FIELD_SIZE(CELL_DATA, u.KeyList) + (3 * sizeof(HCELL_INDEX)); - ValueListCellOffset = HvAllocateCell(&RegistryHive->Hive, CellSize, Storage, HCELL_NIL); - if (ValueListCellOffset == HCELL_NIL) - return STATUS_INSUFFICIENT_RESOURCES; - - ValueListCell = (PCELL_DATA)HvGetCell(&RegistryHive->Hive, ValueListCellOffset); - if (!ValueListCell) - { - HvFreeCell(&RegistryHive->Hive, ValueListCellOffset); - return STATUS_UNSUCCESSFUL; - } - - Parent->ValueList.List = ValueListCellOffset; - } - else - { - ValueListCell = (PCELL_DATA)HvGetCell(&RegistryHive->Hive, Parent->ValueList.List); - if (!ValueListCell) - return STATUS_UNSUCCESSFUL; - - CellSize = ABS_VALUE(HvGetCellSize(&RegistryHive->Hive, ValueListCell)); - - if (Parent->ValueList.Count >= CellSize / sizeof(HCELL_INDEX)) - { - CellSize *= 2; - ValueListCellOffset = HvReallocateCell(&RegistryHive->Hive, Parent->ValueList.List, CellSize); - if (ValueListCellOffset == HCELL_NIL) - return STATUS_INSUFFICIENT_RESOURCES; - - ValueListCell = (PCELL_DATA)HvGetCell(&RegistryHive->Hive, ValueListCellOffset); - if (!ValueListCell) - return STATUS_UNSUCCESSFUL; - - Parent->ValueList.List = ValueListCellOffset; - } - } - NewValueCellOffset = HvAllocateCell(&RegistryHive->Hive, FIELD_OFFSET(CM_KEY_VALUE, Name) + @@ -438,15 +394,35 @@ CmiAddValueKey( NewValueCell->DataLength = 0; NewValueCell->Data = HCELL_NIL; + HvMarkCellDirty(&RegistryHive->Hive, NewValueCellOffset, FALSE); - ValueListCell->u.KeyList[Parent->ValueList.Count] = NewValueCellOffset; - Parent->ValueList.Count++; + /* Check if we already have a value list */ + if (Parent->ValueList.Count) + { + /* Then make sure it's valid and dirty it */ + ASSERT(Parent->ValueList.List != HCELL_NIL); + HvMarkCellDirty(&RegistryHive->Hive, Parent->ValueList.List, FALSE); + } - HvMarkCellDirty(&RegistryHive->Hive, Parent->ValueList.List, FALSE); - HvMarkCellDirty(&RegistryHive->Hive, NewValueCellOffset, FALSE); + /* Add this value cell to the child list */ + Status = CmpAddValueToList(&RegistryHive->Hive, + NewValueCellOffset, + ChildIndex, + Storage, + &Parent->ValueList); - *pValueCell = NewValueCell; - *pValueCellOffset = NewValueCellOffset; + /* If we failed, free the entire cell, including the data */ + if (!NT_SUCCESS(Status)) + { + /* Overwrite the status with a known one */ + CmpFreeValue(&RegistryHive->Hive, NewValueCellOffset); + Status = STATUS_INSUFFICIENT_RESOURCES; + } + else + { + *pValueCell = NewValueCell; + *pValueCellOffset = NewValueCellOffset; + } - return STATUS_SUCCESS; + return Status; } diff --git a/sdk/tools/mkhive/cmi.h b/sdk/tools/mkhive/cmi.h index 2d1762392ea..88611c2d4cc 100644 --- a/sdk/tools/mkhive/cmi.h +++ b/sdk/tools/mkhive/cmi.h @@ -50,6 +50,7 @@ NTSTATUS CmiAddValueKey( IN PCMHIVE RegistryHive, IN PCM_KEY_NODE Parent, + IN ULONG ChildIndex, IN PCUNICODE_STRING ValueName, OUT PCM_KEY_VALUE *pValueCell, OUT HCELL_INDEX *pValueCellOffset); diff --git a/sdk/tools/mkhive/registry.c b/sdk/tools/mkhive/registry.c index cd238dcd95e..432b3df0cc0 100644 --- a/sdk/tools/mkhive/registry.c +++ b/sdk/tools/mkhive/registry.c @@ -557,6 +557,7 @@ RegSetValueExW( PHHIVE Hive; PCM_KEY_NODE KeyNode; // ParentNode PCM_KEY_VALUE ValueCell; + ULONG ChildIndex; HCELL_INDEX CellIndex; UNICODE_STRING ValueNameString; @@ -600,12 +601,24 @@ RegSetValueExW( /* Initialize value name string */ RtlInitUnicodeString(&ValueNameString, lpValueName); - CellIndex = CmpFindValueByName(Hive, KeyNode, &ValueNameString); + if (!CmpFindNameInList(Hive, + &KeyNode->ValueList, + &ValueNameString, + &ChildIndex, + &CellIndex)) + { + /* Sanity check */ + ASSERT(CellIndex == HCELL_NIL); + /* Fail */ + // Status = STATUS_INSUFFICIENT_RESOURCES; + return ERROR_UNSUCCESSFUL; + } if (CellIndex == HCELL_NIL) { /* The value doesn't exist, create a new one */ Status = CmiAddValueKey(Key->RegistryHive, KeyNode, + ChildIndex, &ValueNameString, &ValueCell, &CellIndex);