|
|
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
hive.h
Abstract:
This module contains the private (internal) header file for the direct memory loaded hive manager.
Author:
Bryan M. Willman (bryanwi) 28-May-91
Environment:
Revision History:
26-Mar-92 bryanwi - changed to type 1.0 hive format
13-Jan-99 Dragos C. Sambotin (dragoss) - factoring the data structure declarations in \nt\private\ntos\inc\hivedata.h :: to be available from outside.
--*/
#ifndef _HIVE_
#define _HIVE_
// Hive data structure declarations
// file location: \nt\private\ntos\inc
#include "hivedata.h"
#if DBG
extern ULONG HvHiveChecking;
#define DHvCheckHive(a) if(HvHiveChecking) ASSERT(HvCheckHive(a,NULL) == 0)
#define DHvCheckBin(h,a) if(HvHiveChecking) ASSERT(HvCheckBin(h,a,NULL) == 0)
#else
#define DHvCheckHive(a)
#define DHvCheckBin(h,a)
#endif
#define ROUND_UP(a, b) \
( ((ULONG)(a) + (ULONG)(b) - 1) & ~((ULONG)(b) - 1) )
//
// tombstone for an HBIN that is not resident in memory. This list is searched
// before any new HBIN is added.
//
#define ASSERT_LISTENTRY(ListEntry) \
ASSERT((ListEntry)->Flink->Blink==ListEntry); \ ASSERT((ListEntry)->Blink->Flink==ListEntry);
//
// ===== Hive Private Procedure Prototypes =====
//
PHBIN HvpAddBin( PHHIVE Hive, ULONG NewSize, HSTORAGE_TYPE Type );
PHMAP_ENTRY HvpGetCellMap( PHHIVE Hive, HCELL_INDEX Cell );
VOID HvpFreeMap( PHHIVE Hive, PHMAP_DIRECTORY Dir, ULONG Start, ULONG End );
BOOLEAN HvpAllocateMap( PHHIVE Hive, PHMAP_DIRECTORY Dir, ULONG Start, ULONG End );
BOOLEAN HvpGrowLog1( PHHIVE Hive, ULONG Count );
BOOLEAN HvpGrowLog2( PHHIVE Hive, ULONG Size );
ULONG HvpHeaderCheckSum( PHBASE_BLOCK BaseBlock );
NTSTATUS HvpBuildMap( PHHIVE Hive, PVOID Image );
NTSTATUS HvpBuildMapAndCopy( PHHIVE Hive, PVOID Image );
NTSTATUS HvpInitMap( PHHIVE Hive );
VOID HvpCleanMap( PHHIVE Hive );
NTSTATUS HvpEnlistBinInMap( PHHIVE Hive, ULONG Length, PHBIN Bin, ULONG Offset, PVOID CmView OPTIONAL );
VOID HvpFreeAllocatedBins( PHHIVE Hive );
BOOLEAN HvpDoWriteHive( PHHIVE Hive, ULONG FileType );
struct _CELL_DATA * HvpGetCellFlat( PHHIVE Hive, HCELL_INDEX Cell );
struct _CELL_DATA * HvpGetCellPaged( PHHIVE Hive, HCELL_INDEX Cell );
struct _CELL_DATA * HvpGetCellMapped( PHHIVE Hive, HCELL_INDEX Cell );
VOID HvpReleaseCellMapped( PHHIVE Hive, HCELL_INDEX Cell );
VOID HvpEnlistFreeCell( PHHIVE Hive, HCELL_INDEX Cell, ULONG Size, HSTORAGE_TYPE Type, BOOLEAN CoalesceForward );
BOOLEAN HvpEnlistFreeCells( PHHIVE Hive, PHBIN Bin, ULONG BinOffset );
VOID HvpDelistFreeCell( PHHIVE Hive, HCELL_INDEX Cell, HSTORAGE_TYPE Type );
//
// ===== Hive Public Procedure Prototypes =====
//
#define HINIT_CREATE 0
#define HINIT_MEMORY 1
#define HINIT_FILE 2
#define HINIT_MEMORY_INPLACE 3
#define HINIT_FLAT 4
#define HINIT_MAPFILE 5
#define HIVE_VOLATILE 1
#define HIVE_NOLAZYFLUSH 2
#define HIVE_HAS_BEEN_REPLACED 4
NTSTATUS HvInitializeHive( PHHIVE Hive, ULONG OperationType, ULONG HiveFlags, ULONG FileTypes, PVOID HiveData OPTIONAL, PALLOCATE_ROUTINE AllocateRoutine, PFREE_ROUTINE FreeRoutine, PFILE_SET_SIZE_ROUTINE FileSetSizeRoutine, PFILE_WRITE_ROUTINE FileWriteRoutine, PFILE_READ_ROUTINE FileReadRoutine, PFILE_FLUSH_ROUTINE FileFlushRoutine, ULONG Cluster, PUNICODE_STRING FileName );
BOOLEAN HvSyncHive( PHHIVE Hive );
NTSTATUS HvWriteHive( PHHIVE Hive, BOOLEAN DontGrow, BOOLEAN WriteThroughCache, BOOLEAN CrashSafe );
NTSTATUS HvLoadHive( PHHIVE Hive );
NTSTATUS HvMapHive( PHHIVE Hive );
VOID HvRefreshHive( PHHIVE Hive );
NTSTATUS HvReadInMemoryHive( PHHIVE Hive, PVOID *HiveImage );
ULONG HvCheckHive( PHHIVE Hive, PULONG Storage OPTIONAL );
ULONG HvCheckBin( PHHIVE Hive, PHBIN Bin, PULONG Storage );
ULONG HvpGetBinMemAlloc( IN PHHIVE Hive, PHBIN Bin, IN HSTORAGE_TYPE Type );
BOOLEAN HvMarkCellDirty( PHHIVE Hive, HCELL_INDEX Cell );
#if DBG
BOOLEAN HvIsCellDirty( IN PHHIVE Hive, IN HCELL_INDEX Cell );
#ifndef _CM_LDR_
#define ASSERT_CELL_DIRTY(_Hive_,_Cell_) ASSERT(HvIsCellDirty(_Hive_,_Cell_) == TRUE)
#else
#define ASSERT_CELL_DIRTY(_Hive_,_Cell_) // nothing
#endif //_CM_LDR_
#else
#define ASSERT_CELL_DIRTY(_Hive_,_Cell_) // nothing
#endif //DBG
BOOLEAN HvMarkDirty( PHHIVE Hive, HCELL_INDEX Start, ULONG Length, BOOLEAN DirtyAndPin );
/*
!!!not used anymore!!! BOOLEAN HvMarkClean( PHHIVE Hive, HCELL_INDEX Start, ULONG Length ); */ //
// IMPORTANT:
// Every call to HvGetCell should be matched with a call to HvReleaseCell;
// HvReleaseCell is only valid for mapped hives.
//
#define HvGetCell(Hive, Cell) (((Hive)->GetCellRoutine)(Hive, Cell))
#define HvReleaseCell(Hive, Cell) if((Hive)->ReleaseCellRoutine) ((Hive)->ReleaseCellRoutine)(Hive, Cell)
PHCELL HvpGetHCell(PHHIVE Hive, HCELL_INDEX Cell );
LONG HvGetCellSize( PHHIVE Hive, PVOID Address );
HCELL_INDEX HvAllocateCell( PHHIVE Hive, ULONG NewSize, HSTORAGE_TYPE Type, HCELL_INDEX Vicinity );
VOID HvFreeCell( PHHIVE Hive, HCELL_INDEX Cell );
HCELL_INDEX HvReallocateCell( PHHIVE Hive, HCELL_INDEX Cell, ULONG NewSize );
BOOLEAN HvIsCellAllocated( PHHIVE Hive, HCELL_INDEX Cell );
VOID HvFreeHive( PHHIVE Hive );
VOID HvFreeHivePartial( PHHIVE Hive, HCELL_INDEX Start, HSTORAGE_TYPE Type );
// Dragos : From here start the changes.
#define CmpFindFirstSetRight KiFindFirstSetRight
extern const CCHAR KiFindFirstSetRight[256]; #define CmpFindFirstSetLeft KiFindFirstSetLeft
extern const CCHAR KiFindFirstSetLeft[256];
#define HvpComputeIndex(Index, Size) \
{ \ Index = (Size >> HHIVE_FREE_DISPLAY_SHIFT) - 1; \ if (Index >= HHIVE_LINEAR_INDEX ) { \ \ /* \
** Too big for the linear lists, compute the exponential \ ** list. Shitft the index to make sure we cover the whole \ ** range. \ */ \ Index >>= 4; \ \ if (Index > 255) { \ /* \
** Too big for all the lists, use the last index. \ */ \ Index = HHIVE_FREE_DISPLAY_SIZE-1; \ } else { \ Index = CmpFindFirstSetLeft[Index] + \ HHIVE_LINEAR_INDEX; \ } \ } \ }
VOID HvpFreeHiveFreeDisplay( IN PHHIVE Hive );
NTSTATUS HvpAdjustHiveFreeDisplay( IN PHHIVE Hive, IN ULONG HiveLength, IN HSTORAGE_TYPE Type );
VOID HvpAddFreeCellHint( PHHIVE Hive, HCELL_INDEX Cell, ULONG Index, HSTORAGE_TYPE Type );
VOID HvpRemoveFreeCellHint( PHHIVE Hive, HCELL_INDEX Cell, ULONG Index, HSTORAGE_TYPE Type );
HCELL_INDEX HvpFindFreeCell( PHHIVE Hive, ULONG Index, ULONG NewSize, HSTORAGE_TYPE Type, HCELL_INDEX Vicinity );
BOOLEAN HvpCheckViewBoundary( IN ULONG Start, IN ULONG End );
VOID HvpDropPagedBins( PHHIVE Hive #if DBG
, IN BOOLEAN Check #endif
);
VOID HvpDropAllPagedBins( IN PHHIVE Hive );
BOOLEAN HvpWriteLog( PHHIVE Hive );
BOOLEAN HvHiveWillShrink( IN PHHIVE Hive );
BOOLEAN HvAutoCompressCheck(PHHIVE Hive);
NTSTATUS HvCloneHive(PHHIVE SourceHive, PHHIVE DestHive, PULONG NewLength );
NTSTATUS HvShrinkHive(PHHIVE Hive, ULONG NewLength );
HCELL_INDEX HvShiftCell(PHHIVE Hive,HCELL_INDEX Cell);
#ifdef NT_RENAME_KEY
HCELL_INDEX HvDuplicateCell( PHHIVE Hive, HCELL_INDEX Cell, HSTORAGE_TYPE Type, BOOLEAN CopyData );
#endif
#ifdef CM_ENABLE_WRITE_ONLY_BINS
VOID HvpMarkAllBinsWriteOnly(IN PHHIVE Hive); #endif //CM_ENABLE_WRITE_ONLY_BINS
#endif // _HIVE_
|