[SDK:CMLIB] HvGetCell is a macro calling the hive's GetCellRoutine callback.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 27 Mar 2022 15:30:52 +0000 (17:30 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 27 Mar 2022 16:37:16 +0000 (18:37 +0200)
In principle there should be different get-cell routines, depending
on the type of the hive (given by the OperationType parameter of
HvInitialize): for flat hives, memory-mapped hives, etc.
For now in ReactOS we only support a restricted subset of these,
therefore we are still happy with a single get-cell callback...
This may change in the future.

sdk/lib/cmlib/cmlib.h
sdk/lib/cmlib/hivecell.c
sdk/lib/cmlib/hiveinit.c

index 1946ec5..6b65b73 100644 (file)
@@ -384,15 +384,13 @@ VOID CMAPI
 HvFree(
    PHHIVE RegistryHive);
 
-PVOID CMAPI
-HvGetCell(
-   PHHIVE RegistryHive,
-   HCELL_INDEX CellOffset);
+#define HvGetCell(Hive, Cell)   \
+    (Hive)->GetCellRoutine(Hive, Cell)
 
-#define HvReleaseCell(h, c)             \
-do {                                    \
-    if ((h)->ReleaseCellRoutine)        \
-        (h)->ReleaseCellRoutine(h, c);  \
+#define HvReleaseCell(Hive, Cell)               \
+do {                                            \
+    if ((Hive)->ReleaseCellRoutine)             \
+        (Hive)->ReleaseCellRoutine(Hive, Cell); \
 } while(0)
 
 LONG CMAPI
@@ -468,6 +466,11 @@ HvReleaseFreeCellRefArray(
  * Private functions.
  */
 
+PCELL_DATA CMAPI
+HvpGetCellData(
+    _In_ PHHIVE Hive,
+    _In_ HCELL_INDEX CellIndex);
+
 PHBIN CMAPI
 HvpAddBin(
    PHHIVE RegistryHive,
index a267130..9820ab8 100644 (file)
@@ -29,13 +29,13 @@ HvpGetCellHeader(
         ASSERT(CellBlock < RegistryHive->Storage[CellType].Length);
         Block = (PVOID)RegistryHive->Storage[CellType].BlockList[CellBlock].BlockAddress;
         ASSERT(Block != NULL);
-        return (PVOID)((ULONG_PTR)Block + CellOffset);
+        return (PHCELL)((ULONG_PTR)Block + CellOffset);
     }
     else
     {
         ASSERT(HvGetCellType(CellIndex) == Stable);
-        return (PVOID)((ULONG_PTR)RegistryHive->BaseBlock + HBLOCK_SIZE +
-                       CellIndex);
+        return (PHCELL)((ULONG_PTR)RegistryHive->BaseBlock + HBLOCK_SIZE +
+                        CellIndex);
     }
 }
 
@@ -63,13 +63,12 @@ HvIsCellAllocated(IN PHHIVE RegistryHive,
     return FALSE;
 }
 
-PVOID CMAPI
-HvGetCell(
-    PHHIVE RegistryHive,
-    HCELL_INDEX CellIndex)
+PCELL_DATA CMAPI
+HvpGetCellData(
+    _In_ PHHIVE Hive,
+    _In_ HCELL_INDEX CellIndex)
 {
-    ASSERT(CellIndex != HCELL_NIL);
-    return (PVOID)(HvpGetCellHeader(RegistryHive, CellIndex) + 1);
+    return (PCELL_DATA)(HvpGetCellHeader(Hive, CellIndex) + 1);
 }
 
 static __inline LONG CMAPI
index fcbbe08..2b070fb 100644 (file)
@@ -562,6 +562,11 @@ HvInitialize(
 #endif
     Hive->HiveFlags = HiveFlags & ~HIVE_NOLAZYFLUSH;
 
+    // TODO: The CellRoutines point to different callbacks
+    // depending on the OperationType.
+    Hive->GetCellRoutine = HvpGetCellData;
+    Hive->ReleaseCellRoutine = NULL;
+
     switch (OperationType)
     {
         case HINIT_CREATE: