diff --git a/reactos/lib/cmlib/hivebin.c b/reactos/lib/cmlib/hivebin.c index d650975c32b..ad13e9286b3 100644 --- a/reactos/lib/cmlib/hivebin.c +++ b/reactos/lib/cmlib/hivebin.c @@ -21,7 +21,7 @@ HvpAddBin( ULONG BitmapSize; ULONG BlockCount; ULONG OldBlockListSize; - PCELL_HEADER Block; + PHCELL Block; BinSize = ROUND_UP(Size + sizeof(HBIN), HV_BLOCK_SIZE); BlockCount = BinSize / HV_BLOCK_SIZE; @@ -64,8 +64,8 @@ HvpAddBin( } /* Initialize a free block in this heap. */ - Block = (PCELL_HEADER)(Bin + 1); - Block->CellSize = BinSize - sizeof(HBIN); + Block = (PHCELL)(Bin + 1); + Block->Size = BinSize - sizeof(HBIN); if (Storage == HvStable) { diff --git a/reactos/lib/cmlib/hivecell.c b/reactos/lib/cmlib/hivecell.c index a00eca1f766..14870833012 100644 --- a/reactos/lib/cmlib/hivecell.c +++ b/reactos/lib/cmlib/hivecell.c @@ -9,7 +9,7 @@ #define NDEBUG #include -static PCELL_HEADER __inline CMAPI +static PHCELL __inline CMAPI HvpGetCellHeader( PHHIVE RegistryHive, HCELL_INDEX CellIndex) @@ -52,7 +52,7 @@ HvpGetCellFullSize( PHHIVE RegistryHive, PVOID Cell) { - return ((PCELL_HEADER)Cell - 1)->CellSize; + return ((PHCELL)Cell - 1)->Size; } LONG CMAPI @@ -60,13 +60,13 @@ HvGetCellSize( PHHIVE RegistryHive, PVOID Cell) { - PCELL_HEADER CellHeader; + PHCELL CellHeader; - CellHeader = (PCELL_HEADER)Cell - 1; - if (CellHeader->CellSize < 0) - return CellHeader->CellSize + sizeof(CELL_HEADER); + CellHeader = (PHCELL)Cell - 1; + if (CellHeader->Size < 0) + return CellHeader->Size + sizeof(HCELL); else - return CellHeader->CellSize - sizeof(CELL_HEADER); + return CellHeader->Size - sizeof(HCELL); } VOID CMAPI @@ -132,7 +132,7 @@ HvpComputeFreeListIndex( static NTSTATUS CMAPI HvpAddFree( PHHIVE RegistryHive, - PCELL_HEADER FreeBlock, + PHCELL FreeBlock, HCELL_INDEX FreeIndex) { PHCELL_INDEX FreeBlockData; @@ -143,7 +143,7 @@ HvpAddFree( ASSERT(FreeBlock != NULL); Storage = (FreeIndex & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT; - Index = HvpComputeFreeListIndex(FreeBlock->CellSize); + Index = HvpComputeFreeListIndex(FreeBlock->Size); FreeBlockData = (PHCELL_INDEX)(FreeBlock + 1); *FreeBlockData = RegistryHive->Storage[Storage].FreeDisplay[Index]; @@ -157,7 +157,7 @@ HvpAddFree( static VOID CMAPI HvpRemoveFree( PHHIVE RegistryHive, - PCELL_HEADER CellBlock, + PHCELL CellBlock, HCELL_INDEX CellIndex) { PHCELL_INDEX FreeCellData; @@ -168,7 +168,7 @@ HvpRemoveFree( ASSERT(RegistryHive->ReadOnly == FALSE); Storage = (CellIndex & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT; - Index = HvpComputeFreeListIndex(CellBlock->CellSize); + Index = HvpComputeFreeListIndex(CellBlock->Size); pFreeCellOffset = &RegistryHive->Storage[Storage].FreeDisplay[Index]; while (*pFreeCellOffset != HCELL_NULL) @@ -220,7 +220,7 @@ HvpCreateHiveFreeCellList( PHHIVE Hive) { HCELL_INDEX BlockOffset; - PCELL_HEADER FreeBlock; + PHCELL FreeBlock; ULONG BlockIndex; ULONG FreeOffset; PHBIN Bin; @@ -244,18 +244,18 @@ HvpCreateHiveFreeCellList( FreeOffset = sizeof(HBIN); while (FreeOffset < Bin->Size) { - FreeBlock = (PCELL_HEADER)((ULONG_PTR)Bin + FreeOffset); - if (FreeBlock->CellSize > 0) + FreeBlock = (PHCELL)((ULONG_PTR)Bin + FreeOffset); + if (FreeBlock->Size > 0) { Status = HvpAddFree(Hive, FreeBlock, Bin->FileOffset + FreeOffset); if (!NT_SUCCESS(Status)) return Status; - FreeOffset += FreeBlock->CellSize; + FreeOffset += FreeBlock->Size; } else { - FreeOffset -= FreeBlock->CellSize; + FreeOffset -= FreeBlock->Size; } } @@ -272,15 +272,15 @@ HvAllocateCell( ULONG Size, HV_STORAGE_TYPE Storage) { - PCELL_HEADER FreeCell; + PHCELL FreeCell; HCELL_INDEX FreeCellOffset; - PCELL_HEADER NewCell; + PHCELL NewCell; PHBIN Bin; ASSERT(RegistryHive->ReadOnly == FALSE); /* Round to 16 bytes multiple. */ - Size = ROUND_UP(Size + sizeof(CELL_HEADER), 16); + Size = ROUND_UP(Size + sizeof(HCELL), 16); /* First search in free blocks. */ FreeCellOffset = HvpFindFree(RegistryHive, Size, Storage); @@ -299,11 +299,11 @@ HvAllocateCell( /* Split the block in two parts */ /* FIXME: There is some minimal cell size that we must respect. */ - if (FreeCell->CellSize > Size + sizeof(HCELL_INDEX)) + if (FreeCell->Size > Size + sizeof(HCELL_INDEX)) { - NewCell = (PCELL_HEADER)((ULONG_PTR)FreeCell + Size); - NewCell->CellSize = FreeCell->CellSize - Size; - FreeCell->CellSize = Size; + NewCell = (PHCELL)((ULONG_PTR)FreeCell + Size); + NewCell->Size = FreeCell->Size - Size; + FreeCell->Size = Size; HvpAddFree(RegistryHive, NewCell, FreeCellOffset + Size); if (Storage == HvStable) HvMarkCellDirty(RegistryHive, FreeCellOffset + Size); @@ -311,8 +311,8 @@ HvAllocateCell( if (Storage == HvStable) HvMarkCellDirty(RegistryHive, FreeCellOffset); - FreeCell->CellSize = -FreeCell->CellSize; - RtlZeroMemory(FreeCell + 1, Size - sizeof(CELL_HEADER)); + FreeCell->Size = -FreeCell->Size; + RtlZeroMemory(FreeCell + 1, Size - sizeof(HCELL)); return FreeCellOffset; } @@ -366,8 +366,8 @@ HvFreeCell( PHHIVE RegistryHive, HCELL_INDEX CellIndex) { - PCELL_HEADER Free; - PCELL_HEADER Neighbor; + PHCELL Free; + PHCELL Neighbor; PHBIN Bin; ULONG CellType; ULONG CellBlock; @@ -376,9 +376,9 @@ HvFreeCell( Free = HvpGetCellHeader(RegistryHive, CellIndex); - ASSERT(Free->CellSize < 0); + ASSERT(Free->Size < 0); - Free->CellSize = -Free->CellSize; + Free->Size = -Free->Size; CellType = (CellIndex & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT; CellBlock = (CellIndex & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT; @@ -386,38 +386,38 @@ HvFreeCell( /* FIXME: Merge free blocks */ Bin = (PHBIN)RegistryHive->Storage[CellType].BlockList[CellBlock].Bin; - if ((CellIndex & ~HCELL_TYPE_MASK) + Free->CellSize < + if ((CellIndex & ~HCELL_TYPE_MASK) + Free->Size < Bin->FileOffset + Bin->Size) { - Neighbor = (PCELL_HEADER)((ULONG_PTR)Free + Free->CellSize); - if (Neighbor->CellSize > 0) + Neighbor = (PHCELL)((ULONG_PTR)Free + Free->Size); + if (Neighbor->Size > 0) { HvpRemoveFree(RegistryHive, Neighbor, ((HCELL_INDEX)Neighbor - (HCELL_INDEX)Bin + Bin->FileOffset) | (CellIndex & HCELL_TYPE_MASK)); - Free->CellSize += Neighbor->CellSize; + Free->Size += Neighbor->Size; } } - Neighbor = (PCELL_HEADER)(Bin + 1); + Neighbor = (PHCELL)(Bin + 1); while (Neighbor < Free) { - if (Neighbor->CellSize > 0) + if (Neighbor->Size > 0) { - if ((ULONG_PTR)Neighbor + Neighbor->CellSize == (ULONG_PTR)Free) + if ((ULONG_PTR)Neighbor + Neighbor->Size == (ULONG_PTR)Free) { - Neighbor->CellSize += Free->CellSize; + Neighbor->Size += Free->Size; if (CellType == HvStable) HvMarkCellDirty(RegistryHive, (HCELL_INDEX)Neighbor - (HCELL_INDEX)Bin + Bin->FileOffset); return; } - Neighbor = (PCELL_HEADER)((ULONG_PTR)Neighbor + Neighbor->CellSize); + Neighbor = (PHCELL)((ULONG_PTR)Neighbor + Neighbor->Size); } else { - Neighbor = (PCELL_HEADER)((ULONG_PTR)Neighbor - Neighbor->CellSize); + Neighbor = (PHCELL)((ULONG_PTR)Neighbor - Neighbor->Size); } } diff --git a/reactos/lib/cmlib/hivedata.h b/reactos/lib/cmlib/hivedata.h index 9b2a52bb2d4..d7a5ec94a81 100644 --- a/reactos/lib/cmlib/hivedata.h +++ b/reactos/lib/cmlib/hivedata.h @@ -119,16 +119,36 @@ typedef struct _HBIN ULONG MemAlloc; } HBIN, *PHBIN; -typedef struct _CELL_HEADER +typedef struct _HCELL { /* <0 if used, >0 if free */ - LONG CellSize; -} CELL_HEADER, *PCELL_HEADER; + LONG Size; + union + { + struct + { + ULONG Last; + union + { + ULONG UserData; + HCELL_INDEX Next; + } u; + } OldCell; + struct + { + union + { + ULONG UserData; + HCELL_INDEX Next; + } u; + } NewCell; + } u; +} HCELL, *PHCELL; #include -#define IsFreeCell(Cell)(Cell->CellSize >= 0) -#define IsUsedCell(Cell)(Cell->CellSize < 0) +#define IsFreeCell(Cell)(Cell->Size >= 0) +#define IsUsedCell(Cell)(Cell->Size < 0) typedef enum _HV_STORAGE_TYPE { diff --git a/reactos/ntoskrnl/cm/regfile.c b/reactos/ntoskrnl/cm/regfile.c index 7548f58103c..955d5d36fa5 100644 --- a/reactos/ntoskrnl/cm/regfile.c +++ b/reactos/ntoskrnl/cm/regfile.c @@ -1522,11 +1522,11 @@ CmiAddValueToKey(IN PEREGISTRY_HIVE RegistryHive, } #if 0 - DPRINT("KeyCell->ValueList.Count %lu, ValueListCell->CellSize %lu (%lu %lx)\n", + DPRINT("KeyCell->ValueList.Count %lu, ValueListCell->Size %lu (%lu %lx)\n", KeyCell->ValueList.Count, - (ULONG)ABS_VALUE(ValueListCell->CellSize), - ((ULONG)ABS_VALUE(ValueListCell->CellSize) - sizeof(CELL_HEADER)) / sizeof(HCELL_INDEX), - ((ULONG)ABS_VALUE(ValueListCell->CellSize) - sizeof(CELL_HEADER)) / sizeof(HCELL_INDEX)); + (ULONG)ABS_VALUE(ValueListCell->Size), + ((ULONG)ABS_VALUE(ValueListCell->Size) - sizeof(HCELL)) / sizeof(HCELL_INDEX), + ((ULONG)ABS_VALUE(ValueListCell->Size) - sizeof(HCELL)) / sizeof(HCELL_INDEX)); #endif Status = CmiAllocateValueCell(RegistryHive,