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
* Private functions.
*/
+PCELL_DATA CMAPI
+HvpGetCellData(
+ _In_ PHHIVE Hive,
+ _In_ HCELL_INDEX CellIndex);
+
PHBIN CMAPI
HvpAddBin(
PHHIVE RegistryHive,
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);
}
}
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
#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: