diff --git a/reactos/lib/cmlib/hivecell.c b/reactos/lib/cmlib/hivecell.c index 83e129d7e35..25ec9a6a1cd 100644 --- a/reactos/lib/cmlib/hivecell.c +++ b/reactos/lib/cmlib/hivecell.c @@ -46,26 +46,24 @@ BOOLEAN CMAPI HvIsCellAllocated(IN PHHIVE RegistryHive, IN HCELL_INDEX CellIndex) { - ULONG Type, Block; + ULONG Type, Block; - /* If it's a flat hive, the cell is always allocated */ - if (RegistryHive->Flat) return TRUE; + /* If it's a flat hive, the cell is always allocated */ + if (RegistryHive->Flat) + return TRUE; - /* Otherwise, get the type and make sure it's valid */ - Type = HvGetCellType(CellIndex); - if (((CellIndex % ~HCELL_TYPE_MASK) > RegistryHive->Storage[Type].Length) || - (CellIndex % (RegistryHive->Version >= 2 ? 8 : 16))) - { - /* Invalid cell index */ - return FALSE; - } + /* Otherwise, get the type and make sure it's valid */ + Type = HvGetCellType(CellIndex); + Block = HvGetCellBlock(CellIndex); + if (Block >= RegistryHive->Storage[Type].Length) + return FALSE; - /* Try to get the cell block */ - Block = (CellIndex & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT; - if (RegistryHive->Storage[Type].BlockList[Block].BlockAddress) return TRUE; + /* Try to get the cell block */ + if (RegistryHive->Storage[Type].BlockList[Block].BlockAddress) + return TRUE; - /* No valid block, fail */ - return FALSE; + /* No valid block, fail */ + return FALSE; } PVOID CMAPI @@ -88,13 +86,13 @@ LONG CMAPI HvGetCellSize(IN PHHIVE Hive, IN PVOID Address) { - PHCELL CellHeader; - LONG Size; + PHCELL CellHeader; + LONG Size; - CellHeader = (PHCELL)Address - 1; - Size = CellHeader->Size * -1; - Size -= sizeof(HCELL); - return Size; + CellHeader = (PHCELL)Address - 1; + Size = CellHeader->Size * -1; + Size -= sizeof(HCELL); + return Size; } BOOLEAN CMAPI @@ -126,14 +124,15 @@ BOOLEAN CMAPI HvIsCellDirty(IN PHHIVE Hive, IN HCELL_INDEX Cell) { - /* Sanity checks */ - ASSERT(Hive->ReadOnly == FALSE); + /* Sanity checks */ + ASSERT(Hive->ReadOnly == FALSE); - /* Volatile cells are always "dirty" */ - if (HvGetCellType(Cell) == Volatile) return TRUE; + /* Volatile cells are always "dirty" */ + if (HvGetCellType(Cell) == Volatile) + return TRUE; - /* Check if the dirty bit is set */ - return RtlCheckBit(&Hive->DirtyVector, Cell / HV_BLOCK_SIZE); + /* Check if the dirty bit is set */ + return RtlCheckBit(&Hive->DirtyVector, Cell / HV_BLOCK_SIZE); } static ULONG __inline CMAPI diff --git a/reactos/lib/cmlib/hivedata.h b/reactos/lib/cmlib/hivedata.h index 6353a8963ec..adfd9824904 100644 --- a/reactos/lib/cmlib/hivedata.h +++ b/reactos/lib/cmlib/hivedata.h @@ -92,6 +92,8 @@ typedef ULONG HCELL_INDEX, *PHCELL_INDEX; #define HvGetCellType(Cell) \ ((ULONG)((Cell & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT)) +#define HvGetCellBlock(Cell) \ + ((ULONG)((Cell & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT)) typedef enum {