515 lines
9.8 KiB
C
515 lines
9.8 KiB
C
|
/*++
|
||
|
|
||
|
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_
|