mirror of
https://github.com/reactos/reactos.git
synced 2025-01-15 08:03:53 +08:00
Make HvIsCellAllocated working.
svn path=/trunk/; revision=32175
This commit is contained in:
parent
dbfe16d4c3
commit
9c1dc73ab3
@ -46,26 +46,24 @@ BOOLEAN CMAPI
|
||||
HvIsCellAllocated(IN PHHIVE RegistryHive,
|
||||
IN HCELL_INDEX CellIndex)
|
||||
{
|
||||
ULONG Type, Block;
|
||||
ULONG Type, Block;
|
||||
|
||||
/* If it's a flat hive, the cell is always allocated */
|
||||
if (RegistryHive->Flat) return TRUE;
|
||||
/* If it's a flat hive, the cell is always allocated */
|
||||
if (RegistryHive->Flat)
|
||||
return TRUE;
|
||||
|
||||
/* Otherwise, get the type and make sure it's valid */
|
||||
Type = HvGetCellType(CellIndex);
|
||||
if (((CellIndex % ~HCELL_TYPE_MASK) > RegistryHive->Storage[Type].Length) ||
|
||||
(CellIndex % (RegistryHive->Version >= 2 ? 8 : 16)))
|
||||
{
|
||||
/* Invalid cell index */
|
||||
return FALSE;
|
||||
}
|
||||
/* Otherwise, get the type and make sure it's valid */
|
||||
Type = HvGetCellType(CellIndex);
|
||||
Block = HvGetCellBlock(CellIndex);
|
||||
if (Block >= RegistryHive->Storage[Type].Length)
|
||||
return FALSE;
|
||||
|
||||
/* Try to get the cell block */
|
||||
Block = (CellIndex & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT;
|
||||
if (RegistryHive->Storage[Type].BlockList[Block].BlockAddress) return TRUE;
|
||||
/* Try to get the cell block */
|
||||
if (RegistryHive->Storage[Type].BlockList[Block].BlockAddress)
|
||||
return TRUE;
|
||||
|
||||
/* No valid block, fail */
|
||||
return FALSE;
|
||||
/* No valid block, fail */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
PVOID CMAPI
|
||||
@ -88,13 +86,13 @@ LONG CMAPI
|
||||
HvGetCellSize(IN PHHIVE Hive,
|
||||
IN PVOID Address)
|
||||
{
|
||||
PHCELL CellHeader;
|
||||
LONG Size;
|
||||
PHCELL CellHeader;
|
||||
LONG Size;
|
||||
|
||||
CellHeader = (PHCELL)Address - 1;
|
||||
Size = CellHeader->Size * -1;
|
||||
Size -= sizeof(HCELL);
|
||||
return Size;
|
||||
CellHeader = (PHCELL)Address - 1;
|
||||
Size = CellHeader->Size * -1;
|
||||
Size -= sizeof(HCELL);
|
||||
return Size;
|
||||
}
|
||||
|
||||
BOOLEAN CMAPI
|
||||
@ -126,14 +124,15 @@ BOOLEAN CMAPI
|
||||
HvIsCellDirty(IN PHHIVE Hive,
|
||||
IN HCELL_INDEX Cell)
|
||||
{
|
||||
/* Sanity checks */
|
||||
ASSERT(Hive->ReadOnly == FALSE);
|
||||
/* Sanity checks */
|
||||
ASSERT(Hive->ReadOnly == FALSE);
|
||||
|
||||
/* Volatile cells are always "dirty" */
|
||||
if (HvGetCellType(Cell) == Volatile) return TRUE;
|
||||
/* Volatile cells are always "dirty" */
|
||||
if (HvGetCellType(Cell) == Volatile)
|
||||
return TRUE;
|
||||
|
||||
/* Check if the dirty bit is set */
|
||||
return RtlCheckBit(&Hive->DirtyVector, Cell / HV_BLOCK_SIZE);
|
||||
/* Check if the dirty bit is set */
|
||||
return RtlCheckBit(&Hive->DirtyVector, Cell / HV_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
static ULONG __inline CMAPI
|
||||
|
@ -92,6 +92,8 @@ typedef ULONG HCELL_INDEX, *PHCELL_INDEX;
|
||||
|
||||
#define HvGetCellType(Cell) \
|
||||
((ULONG)((Cell & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT))
|
||||
#define HvGetCellBlock(Cell) \
|
||||
((ULONG)((Cell & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT))
|
||||
|
||||
typedef enum
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user