- DBGKD_WAIT_STATE_CHANGE64 is used in KD protocol 5, not number 6 that we use. Proto...
[reactos.git] / reactos / lib / cmlib / hivebin.c
index ad13e92..844e2f7 100644 (file)
-/*\r
- * PROJECT:   registry manipulation library\r
- * LICENSE:   GPL - See COPYING in the top level directory\r
- * COPYRIGHT: Copyright 2005 Filip Navara <navaraf@reactos.org>\r
- *            Copyright 2005 Hartmut Birr\r
- *            Copyright 2001 - 2005 Eric Kohl\r
- */\r
-\r
-#include "cmlib.h"\r
-\r
-PHBIN CMAPI\r
-HvpAddBin(\r
-   PHHIVE RegistryHive,\r
-   ULONG Size,\r
-   HV_STORAGE_TYPE Storage)\r
-{\r
-   PHMAP_ENTRY BlockList;\r
-   PHBIN Bin;\r
-   ULONG BinSize;\r
-   ULONG i;\r
-   ULONG BitmapSize;\r
-   ULONG BlockCount;\r
-   ULONG OldBlockListSize;\r
-   PHCELL Block;\r
-\r
-   BinSize = ROUND_UP(Size + sizeof(HBIN), HV_BLOCK_SIZE);\r
-   BlockCount = BinSize / HV_BLOCK_SIZE;\r
-\r
-   Bin = RegistryHive->Allocate(BinSize, TRUE);\r
-   if (Bin == NULL)\r
-      return NULL;\r
-   RtlZeroMemory(Bin, sizeof(HBIN));\r
-\r
-   Bin->Signature = HV_BIN_SIGNATURE;\r
-   Bin->FileOffset = RegistryHive->Storage[Storage].Length *\r
-                    HV_BLOCK_SIZE;\r
-   Bin->Size = BinSize;\r
-\r
-   /* Allocate new block list */\r
-   OldBlockListSize = RegistryHive->Storage[Storage].Length;\r
-   BlockList = RegistryHive->Allocate(sizeof(HMAP_ENTRY) *\r
-                                      (OldBlockListSize + BlockCount), TRUE);\r
-   if (BlockList == NULL)\r
-   {\r
-      RegistryHive->Free(Bin);\r
-      return NULL;\r
-   }\r
-\r
-   if (OldBlockListSize > 0)\r
-   {\r
-      RtlCopyMemory(BlockList, RegistryHive->Storage[Storage].BlockList,\r
-                    OldBlockListSize * sizeof(HMAP_ENTRY));\r
-      RegistryHive->Free(RegistryHive->Storage[Storage].BlockList);\r
-   }\r
-\r
-   RegistryHive->Storage[Storage].BlockList = BlockList;\r
-   RegistryHive->Storage[Storage].Length += BlockCount;\r
-  \r
-   for (i = 0; i < BlockCount; i++)\r
-   {\r
-      RegistryHive->Storage[Storage].BlockList[OldBlockListSize + i].Block =\r
-         ((ULONG_PTR)Bin + (i * HV_BLOCK_SIZE));\r
-      RegistryHive->Storage[Storage].BlockList[OldBlockListSize + i].Bin = (ULONG_PTR)Bin;\r
-   }\r
-\r
-   /* Initialize a free block in this heap. */\r
-   Block = (PHCELL)(Bin + 1);\r
-   Block->Size = BinSize - sizeof(HBIN);\r
-\r
-   if (Storage == HvStable)\r
-   {\r
-      /* Calculate bitmap size in bytes (always a multiple of 32 bits). */\r
-      BitmapSize = ROUND_UP(RegistryHive->Storage[HvStable].Length,\r
-                            sizeof(ULONG) * 8) / 8;\r
-\r
-      /* Grow bitmap if necessary. */\r
-      if (BitmapSize > RegistryHive->DirtyVector.SizeOfBitMap / 8)\r
-      {\r
-         PULONG BitmapBuffer;\r
-\r
-         BitmapBuffer = RegistryHive->Allocate(BitmapSize, TRUE);\r
-         RtlZeroMemory(BitmapBuffer, BitmapSize);\r
-         RtlCopyMemory(BitmapBuffer,\r
-                   RegistryHive->DirtyVector.Buffer,\r
-                   RegistryHive->DirtyVector.SizeOfBitMap / 8);\r
-         RegistryHive->Free(RegistryHive->DirtyVector.Buffer);\r
-         RtlInitializeBitMap(&RegistryHive->DirtyVector, BitmapBuffer,\r
-                             BitmapSize * 8);\r
-      }\r
-\r
-      /* Mark new bin dirty. */\r
-      RtlSetBits(&RegistryHive->DirtyVector,\r
-                 Bin->FileOffset / HV_BLOCK_SIZE,\r
-                 BlockCount);\r
-   }\r
-\r
-   return Bin;\r
-}\r
+/*
+ * PROJECT:   registry manipulation library
+ * LICENSE:   GPL - See COPYING in the top level directory
+ * COPYRIGHT: Copyright 2005 Filip Navara <navaraf@reactos.org>
+ *            Copyright 2005 Hartmut Birr
+ *            Copyright 2001 - 2005 Eric Kohl
+ */
+
+#include "cmlib.h"
+
+PHBIN CMAPI
+HvpAddBin(
+   PHHIVE RegistryHive,
+   ULONG Size,
+   HSTORAGE_TYPE Storage)
+{
+   PHMAP_ENTRY BlockList;
+   PHBIN Bin;
+   SIZE_T BinSize;
+   ULONG i;
+   ULONG BitmapSize;
+   ULONG BlockCount;
+   ULONG OldBlockListSize;
+   PHCELL Block;
+
+   BinSize = ROUND_UP(Size + sizeof(HBIN), HV_BLOCK_SIZE);
+   BlockCount = (ULONG)(BinSize / HV_BLOCK_SIZE);
+
+   Bin = RegistryHive->Allocate(BinSize, TRUE, TAG_CM);
+   if (Bin == NULL)
+      return NULL;
+   RtlZeroMemory(Bin, BinSize);
+
+   Bin->Signature = HV_BIN_SIGNATURE;
+   Bin->FileOffset = RegistryHive->Storage[Storage].Length *
+                    HV_BLOCK_SIZE;
+   Bin->Size = (ULONG)BinSize;
+
+   /* Allocate new block list */
+   OldBlockListSize = RegistryHive->Storage[Storage].Length;
+   BlockList = RegistryHive->Allocate(sizeof(HMAP_ENTRY) *
+                                      (OldBlockListSize + BlockCount),
+                                      TRUE,
+                                      TAG_CM);
+   if (BlockList == NULL)
+   {
+      RegistryHive->Free(Bin, 0);
+      return NULL;
+   }
+
+   if (OldBlockListSize > 0)
+   {
+      RtlCopyMemory(BlockList, RegistryHive->Storage[Storage].BlockList,
+                    OldBlockListSize * sizeof(HMAP_ENTRY));
+      RegistryHive->Free(RegistryHive->Storage[Storage].BlockList, 0);
+   }
+
+   RegistryHive->Storage[Storage].BlockList = BlockList;
+   RegistryHive->Storage[Storage].Length += BlockCount;
+
+   for (i = 0; i < BlockCount; i++)
+   {
+      RegistryHive->Storage[Storage].BlockList[OldBlockListSize + i].BlockAddress =
+         ((ULONG_PTR)Bin + (i * HV_BLOCK_SIZE));
+      RegistryHive->Storage[Storage].BlockList[OldBlockListSize + i].BinAddress = (ULONG_PTR)Bin;
+   }
+
+   /* Initialize a free block in this heap. */
+   Block = (PHCELL)(Bin + 1);
+   Block->Size = (LONG)(BinSize - sizeof(HBIN));
+
+   if (Storage == Stable)
+   {
+      /* Calculate bitmap size in bytes (always a multiple of 32 bits). */
+      BitmapSize = ROUND_UP(RegistryHive->Storage[Stable].Length,
+                            sizeof(ULONG) * 8) / 8;
+
+      /* Grow bitmap if necessary. */
+      if (BitmapSize > RegistryHive->DirtyVector.SizeOfBitMap / 8)
+      {
+         PULONG BitmapBuffer;
+
+         BitmapBuffer = RegistryHive->Allocate(BitmapSize, TRUE, TAG_CM);
+         RtlZeroMemory(BitmapBuffer, BitmapSize);
+         if (RegistryHive->DirtyVector.SizeOfBitMap > 0)
+         {
+            ASSERT(RegistryHive->DirtyVector.Buffer);
+            RtlCopyMemory(BitmapBuffer,
+                      RegistryHive->DirtyVector.Buffer,
+                      RegistryHive->DirtyVector.SizeOfBitMap / 8);
+            RegistryHive->Free(RegistryHive->DirtyVector.Buffer, 0);
+         }
+         RtlInitializeBitMap(&RegistryHive->DirtyVector, BitmapBuffer,
+                             BitmapSize * 8);
+      }
+
+      /* Mark new bin dirty. */
+      RtlSetBits(&RegistryHive->DirtyVector,
+                 Bin->FileOffset / HV_BLOCK_SIZE,
+                 BlockCount);
+   }
+
+   return Bin;
+}