Make HvIsCellAllocated working.

svn path=/trunk/; revision=32175
This commit is contained in:
Filip Navara 2008-02-07 03:32:47 +00:00
parent dbfe16d4c3
commit 9c1dc73ab3
2 changed files with 29 additions and 28 deletions

View file

@ -49,20 +49,18 @@ HvIsCellAllocated(IN PHHIVE RegistryHive,
ULONG Type, Block;
/* If it's a flat hive, the cell is always allocated */
if (RegistryHive->Flat) return TRUE;
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 */
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;
if (RegistryHive->Storage[Type].BlockList[Block].BlockAddress)
return TRUE;
/* No valid block, fail */
return FALSE;
@ -130,7 +128,8 @@ HvIsCellDirty(IN PHHIVE Hive,
ASSERT(Hive->ReadOnly == FALSE);
/* Volatile cells are always "dirty" */
if (HvGetCellType(Cell) == Volatile) return TRUE;
if (HvGetCellType(Cell) == Volatile)
return TRUE;
/* Check if the dirty bit is set */
return RtlCheckBit(&Hive->DirtyVector, Cell / HV_BLOCK_SIZE);

View file

@ -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
{