- CELL_HEADER -> HCELL.
authorAlex Ionescu <aionescu@gmail.com>
Mon, 14 Aug 2006 12:22:00 +0000 (12:22 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Mon, 14 Aug 2006 12:22:00 +0000 (12:22 +0000)
svn path=/trunk/; revision=23576

reactos/lib/cmlib/hivebin.c
reactos/lib/cmlib/hivecell.c
reactos/lib/cmlib/hivedata.h
reactos/ntoskrnl/cm/regfile.c

index d650975..ad13e92 100644 (file)
@@ -21,7 +21,7 @@ HvpAddBin(
    ULONG BitmapSize;\r
    ULONG BlockCount;\r
    ULONG OldBlockListSize;\r
-   PCELL_HEADER Block;\r
+   PHCELL Block;\r
 \r
    BinSize = ROUND_UP(Size + sizeof(HBIN), HV_BLOCK_SIZE);\r
    BlockCount = BinSize / HV_BLOCK_SIZE;\r
@@ -64,8 +64,8 @@ HvpAddBin(
    }\r
 \r
    /* Initialize a free block in this heap. */\r
-   Block = (PCELL_HEADER)(Bin + 1);\r
-   Block->CellSize = BinSize - sizeof(HBIN);\r
+   Block = (PHCELL)(Bin + 1);\r
+   Block->Size = BinSize - sizeof(HBIN);\r
 \r
    if (Storage == HvStable)\r
    {\r
index a00eca1..1487083 100644 (file)
@@ -9,7 +9,7 @@
 #define NDEBUG\r
 #include <debug.h>\r
 \r
-static PCELL_HEADER __inline CMAPI\r
+static PHCELL __inline CMAPI\r
 HvpGetCellHeader(\r
    PHHIVE RegistryHive,\r
    HCELL_INDEX CellIndex)\r
@@ -52,7 +52,7 @@ HvpGetCellFullSize(
    PHHIVE RegistryHive,\r
    PVOID Cell)\r
 {\r
-   return ((PCELL_HEADER)Cell - 1)->CellSize;\r
+   return ((PHCELL)Cell - 1)->Size;\r
 }\r
 \r
 LONG CMAPI\r
@@ -60,13 +60,13 @@ HvGetCellSize(
    PHHIVE RegistryHive,\r
    PVOID Cell)\r
 {\r
-   PCELL_HEADER CellHeader;\r
+   PHCELL CellHeader;\r
 \r
-   CellHeader = (PCELL_HEADER)Cell - 1;\r
-   if (CellHeader->CellSize < 0)\r
-      return CellHeader->CellSize + sizeof(CELL_HEADER);\r
+   CellHeader = (PHCELL)Cell - 1;\r
+   if (CellHeader->Size < 0)\r
+      return CellHeader->Size + sizeof(HCELL);\r
    else\r
-      return CellHeader->CellSize - sizeof(CELL_HEADER);\r
+      return CellHeader->Size - sizeof(HCELL);\r
 }\r
 \r
 VOID CMAPI\r
@@ -132,7 +132,7 @@ HvpComputeFreeListIndex(
 static NTSTATUS CMAPI\r
 HvpAddFree(\r
    PHHIVE RegistryHive,\r
-   PCELL_HEADER FreeBlock,\r
+   PHCELL FreeBlock,\r
    HCELL_INDEX FreeIndex)\r
 {\r
    PHCELL_INDEX FreeBlockData;\r
@@ -143,7 +143,7 @@ HvpAddFree(
    ASSERT(FreeBlock != NULL);\r
 \r
    Storage = (FreeIndex & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT;\r
-   Index = HvpComputeFreeListIndex(FreeBlock->CellSize);\r
+   Index = HvpComputeFreeListIndex(FreeBlock->Size);\r
 \r
    FreeBlockData = (PHCELL_INDEX)(FreeBlock + 1);\r
    *FreeBlockData = RegistryHive->Storage[Storage].FreeDisplay[Index];\r
@@ -157,7 +157,7 @@ HvpAddFree(
 static VOID CMAPI\r
 HvpRemoveFree(\r
    PHHIVE RegistryHive,\r
-   PCELL_HEADER CellBlock,\r
+   PHCELL CellBlock,\r
    HCELL_INDEX CellIndex)\r
 {\r
    PHCELL_INDEX FreeCellData;\r
@@ -168,7 +168,7 @@ HvpRemoveFree(
    ASSERT(RegistryHive->ReadOnly == FALSE);\r
 \r
    Storage = (CellIndex & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT;\r
-   Index = HvpComputeFreeListIndex(CellBlock->CellSize);\r
+   Index = HvpComputeFreeListIndex(CellBlock->Size);\r
 \r
    pFreeCellOffset = &RegistryHive->Storage[Storage].FreeDisplay[Index];\r
    while (*pFreeCellOffset != HCELL_NULL)\r
@@ -220,7 +220,7 @@ HvpCreateHiveFreeCellList(
    PHHIVE Hive)\r
 {\r
    HCELL_INDEX BlockOffset;\r
-   PCELL_HEADER FreeBlock;\r
+   PHCELL FreeBlock;\r
    ULONG BlockIndex;\r
    ULONG FreeOffset;\r
    PHBIN Bin;\r
@@ -244,18 +244,18 @@ HvpCreateHiveFreeCellList(
       FreeOffset = sizeof(HBIN);\r
       while (FreeOffset < Bin->Size)\r
       {\r
-         FreeBlock = (PCELL_HEADER)((ULONG_PTR)Bin + FreeOffset);\r
-         if (FreeBlock->CellSize > 0)\r
+         FreeBlock = (PHCELL)((ULONG_PTR)Bin + FreeOffset);\r
+         if (FreeBlock->Size > 0)\r
          {\r
             Status = HvpAddFree(Hive, FreeBlock, Bin->FileOffset + FreeOffset);\r
             if (!NT_SUCCESS(Status))\r
                return Status;\r
 \r
-            FreeOffset += FreeBlock->CellSize;\r
+            FreeOffset += FreeBlock->Size;\r
          }\r
          else\r
          {\r
-            FreeOffset -= FreeBlock->CellSize;\r
+            FreeOffset -= FreeBlock->Size;\r
          }\r
       }\r
 \r
@@ -272,15 +272,15 @@ HvAllocateCell(
    ULONG Size,\r
    HV_STORAGE_TYPE Storage)\r
 {\r
-   PCELL_HEADER FreeCell;\r
+   PHCELL FreeCell;\r
    HCELL_INDEX FreeCellOffset;\r
-   PCELL_HEADER NewCell;\r
+   PHCELL NewCell;\r
    PHBIN Bin;\r
 \r
    ASSERT(RegistryHive->ReadOnly == FALSE);\r
 \r
    /* Round to 16 bytes multiple. */\r
-   Size = ROUND_UP(Size + sizeof(CELL_HEADER), 16);\r
+   Size = ROUND_UP(Size + sizeof(HCELL), 16);\r
 \r
    /* First search in free blocks. */\r
    FreeCellOffset = HvpFindFree(RegistryHive, Size, Storage);\r
@@ -299,11 +299,11 @@ HvAllocateCell(
 \r
    /* Split the block in two parts */\r
    /* FIXME: There is some minimal cell size that we must respect. */\r
-   if (FreeCell->CellSize > Size + sizeof(HCELL_INDEX))\r
+   if (FreeCell->Size > Size + sizeof(HCELL_INDEX))\r
    {\r
-      NewCell = (PCELL_HEADER)((ULONG_PTR)FreeCell + Size);\r
-      NewCell->CellSize = FreeCell->CellSize - Size;\r
-      FreeCell->CellSize = Size;\r
+      NewCell = (PHCELL)((ULONG_PTR)FreeCell + Size);\r
+      NewCell->Size = FreeCell->Size - Size;\r
+      FreeCell->Size = Size;\r
       HvpAddFree(RegistryHive, NewCell, FreeCellOffset + Size);\r
       if (Storage == HvStable)\r
          HvMarkCellDirty(RegistryHive, FreeCellOffset + Size);\r
@@ -311,8 +311,8 @@ HvAllocateCell(
 \r
    if (Storage == HvStable)\r
       HvMarkCellDirty(RegistryHive, FreeCellOffset);\r
-   FreeCell->CellSize = -FreeCell->CellSize;\r
-   RtlZeroMemory(FreeCell + 1, Size - sizeof(CELL_HEADER));\r
+   FreeCell->Size = -FreeCell->Size;\r
+   RtlZeroMemory(FreeCell + 1, Size - sizeof(HCELL));\r
 \r
    return FreeCellOffset;\r
 }\r
@@ -366,8 +366,8 @@ HvFreeCell(
    PHHIVE RegistryHive,\r
    HCELL_INDEX CellIndex)\r
 {\r
-   PCELL_HEADER Free;\r
-   PCELL_HEADER Neighbor;\r
+   PHCELL Free;\r
+   PHCELL Neighbor;\r
    PHBIN Bin;\r
    ULONG CellType;\r
    ULONG CellBlock;\r
@@ -376,9 +376,9 @@ HvFreeCell(
    \r
    Free = HvpGetCellHeader(RegistryHive, CellIndex);\r
 \r
-   ASSERT(Free->CellSize < 0);   \r
+   ASSERT(Free->Size < 0);   \r
    \r
-   Free->CellSize = -Free->CellSize;\r
+   Free->Size = -Free->Size;\r
 \r
    CellType = (CellIndex & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT;\r
    CellBlock = (CellIndex & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT;\r
@@ -386,38 +386,38 @@ HvFreeCell(
    /* FIXME: Merge free blocks */\r
    Bin = (PHBIN)RegistryHive->Storage[CellType].BlockList[CellBlock].Bin;\r
 \r
-   if ((CellIndex & ~HCELL_TYPE_MASK) + Free->CellSize <\r
+   if ((CellIndex & ~HCELL_TYPE_MASK) + Free->Size <\r
        Bin->FileOffset + Bin->Size)\r
    {\r
-      Neighbor = (PCELL_HEADER)((ULONG_PTR)Free + Free->CellSize);\r
-      if (Neighbor->CellSize > 0)\r
+      Neighbor = (PHCELL)((ULONG_PTR)Free + Free->Size);\r
+      if (Neighbor->Size > 0)\r
       {\r
          HvpRemoveFree(RegistryHive, Neighbor,\r
                        ((HCELL_INDEX)Neighbor - (HCELL_INDEX)Bin +\r
                        Bin->FileOffset) | (CellIndex & HCELL_TYPE_MASK));\r
-         Free->CellSize += Neighbor->CellSize;\r
+         Free->Size += Neighbor->Size;\r
       }\r
    }\r
 \r
-   Neighbor = (PCELL_HEADER)(Bin + 1);\r
+   Neighbor = (PHCELL)(Bin + 1);\r
    while (Neighbor < Free)\r
    {\r
-      if (Neighbor->CellSize > 0)\r
+      if (Neighbor->Size > 0)\r
       {\r
-         if ((ULONG_PTR)Neighbor + Neighbor->CellSize == (ULONG_PTR)Free)\r
+         if ((ULONG_PTR)Neighbor + Neighbor->Size == (ULONG_PTR)Free)\r
          {\r
-            Neighbor->CellSize += Free->CellSize;\r
+            Neighbor->Size += Free->Size;\r
             if (CellType == HvStable)\r
                HvMarkCellDirty(RegistryHive,\r
                                (HCELL_INDEX)Neighbor - (HCELL_INDEX)Bin +\r
                                Bin->FileOffset);\r
             return;\r
          }\r
-         Neighbor = (PCELL_HEADER)((ULONG_PTR)Neighbor + Neighbor->CellSize);\r
+         Neighbor = (PHCELL)((ULONG_PTR)Neighbor + Neighbor->Size);\r
       }\r
       else\r
       {\r
-         Neighbor = (PCELL_HEADER)((ULONG_PTR)Neighbor - Neighbor->CellSize);\r
+         Neighbor = (PHCELL)((ULONG_PTR)Neighbor - Neighbor->Size);\r
       }\r
    }\r
 \r
index 9b2a52b..d7a5ec9 100644 (file)
@@ -119,16 +119,36 @@ typedef struct _HBIN
    ULONG MemAlloc;\r
 } HBIN, *PHBIN;\r
 \r
-typedef struct _CELL_HEADER\r
+typedef struct _HCELL\r
 {\r
    /* <0 if used, >0 if free */\r
-   LONG CellSize;\r
-} CELL_HEADER, *PCELL_HEADER;\r
+   LONG Size;\r
+   union\r
+   {\r
+       struct\r
+       {\r
+           ULONG Last;\r
+           union\r
+           {\r
+               ULONG UserData;\r
+               HCELL_INDEX Next;\r
+           } u;\r
+       } OldCell;\r
+       struct\r
+       {\r
+           union\r
+           {\r
+               ULONG UserData;\r
+               HCELL_INDEX Next;\r
+           } u;\r
+       } NewCell;\r
+   } u;\r
+} HCELL, *PHCELL;\r
 \r
 #include <poppack.h>\r
 \r
-#define IsFreeCell(Cell)(Cell->CellSize >= 0)\r
-#define IsUsedCell(Cell)(Cell->CellSize < 0)\r
+#define IsFreeCell(Cell)(Cell->Size >= 0)\r
+#define IsUsedCell(Cell)(Cell->Size < 0)\r
 \r
 typedef enum _HV_STORAGE_TYPE\r
 {\r
index 7548f58..955d5d3 100644 (file)
@@ -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,