Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//
// REGFINFO.H
//
// Copyright (C) Microsoft Corporation, 1995
//
#ifndef _REGFINFO_
#define _REGFINFO_
#define PAGESHIFT 12
#define PAGESIZE (1 << PAGESHIFT)
#define PAGEMASK (PAGESIZE - 1)
#define KEYNODE_BLOCK_SHIFT 10
#define KEYNODES_PER_BLOCK (1 << KEYNODE_BLOCK_SHIFT)
#define KEYNODE_BLOCK_MASK (KEYNODES_PER_BLOCK-1)
#define KEYNODES_PER_PAGE (PAGESIZE / sizeof(KEYNODE))
#define KN_INDEX_IN_BLOCK(i) ((i) & KEYNODE_BLOCK_MASK)
#define KN_BLOCK_NUMBER(i) ((UINT) ((i) >> KEYNODE_BLOCK_SHIFT))
typedef struct _KEYNODE_BLOCK { KEYNODE aKN[KEYNODES_PER_BLOCK]; } KEYNODE_BLOCK, FAR* LPKEYNODE_BLOCK;
#define KEYNODES_PER_PAGE (PAGESIZE / sizeof(KEYNODE))
typedef struct _W95KEYNODE_BLOCK { W95KEYNODE aW95KN[KEYNODES_PER_BLOCK]; } W95KEYNODE_BLOCK, FAR* LPW95KEYNODE_BLOCK;
typedef struct _KEYNODE_BLOCK_INFO { LPKEYNODE_BLOCK lpKeynodeBlock; BYTE Flags; // KBDF_* bits
BYTE LockCount; } KEYNODE_BLOCK_INFO, FAR* LPKEYNODE_BLOCK_INFO;
#define KBIF_ACCESSED 0x01 // Recently accessed
#define KBIF_DIRTY 0x02 // Must rewrite to disk
// Number of extra KEYNODE_BLOCK_INFO structures to alloc on top of the block
// count already in the file. Reduces heap fragmentation in real-mode.
#define KEYNODE_BLOCK_INFO_SLACK_ALLOC 4
#ifdef WIN32
typedef UINT KEY_RECORD_TABLE_ENTRY; #else
typedef WORD KEY_RECORD_TABLE_ENTRY; #endif
typedef KEY_RECORD_TABLE_ENTRY FAR* LPKEY_RECORD_TABLE_ENTRY;
#define NULL_KEY_RECORD_TABLE_ENTRY ((KEY_RECORD_TABLE_ENTRY) 0)
#define IsNullKeyRecordTableEntry(kri) ((kri) == NULL_KEY_RECORD_TABLE_ENTRY)
typedef struct _DATABLOCK_INFO { LPDATABLOCK_HEADER lpDatablockHeader; LPKEY_RECORD_TABLE_ENTRY lpKeyRecordTable; UINT BlockSize; // cached from datablock header
UINT FreeBytes; // cached from datablock header
UINT FirstFreeIndex; // cached from datablock header
LONG FileOffset; BYTE Flags; // DIF_* bits
BYTE LockCount; } DATABLOCK_INFO, FAR* LPDATABLOCK_INFO;
#define DIF_PRESENT 0x01 // In memory
#define DIF_ACCESSED 0x02 // Recently accessed
#define DIF_DIRTY 0x04 // Must rewrite to disk
#define DIF_EXTENDED 0x08 // Has grown in size
// Number of extra DATABLOCK_INFO structures to alloc on top of the block count
// already in the file. Reduces heap fragmentation in real-mode.
#define DATABLOCK_INFO_SLACK_ALLOC 4
// When we create or extend a datablock, try to keep it on page boundaries.
#define DATABLOCK_GRANULARITY 4096
#define RgAlignBlockSize(size) \
(((size) + (DATABLOCK_GRANULARITY - 1)) & ~(DATABLOCK_GRANULARITY - 1))
typedef struct _FILE_INFO { struct _FILE_INFO FAR* lpNextFileInfo; #ifdef WANT_HIVE_SUPPORT
struct _HIVE_INFO FAR* lpHiveInfoList; #endif
#ifdef WANT_NOTIFY_CHANGE_SUPPORT
#ifdef WANT_HIVE_SUPPORT
struct _FILE_INFO FAR* lpParentFileInfo; #endif
struct _NOTIFY_CHANGE FAR* lpNotifyChangeList; #endif
LPKEYNODE_BLOCK_INFO lpKeynodeBlockInfo; UINT KeynodeBlockCount; UINT KeynodeBlockInfoAllocCount; DWORD CurTotalKnSize; // Normally = to FileKnSize unless grown
LPDATABLOCK_INFO lpDatablockInfo; UINT DatablockInfoAllocCount; FILE_HEADER FileHeader; KEYNODE_HEADER KeynodeHeader; WORD Flags; // FI_* bits
char FileName[ANYSIZE_ARRAY]; } FILE_INFO, FAR* LPFILE_INFO;
#define FI_DIRTY 0x0001 // Must rewrite to disk
#define FI_KEYNODEDIRTY 0x0002 //
#define FI_EXTENDED 0x0004 //
#define FI_VERSION20 0x0008 //
#define FI_FLUSHING 0x0010 // Currently flushing file
#define FI_SWEEPING 0x0020 // Currently sweeping file
#define FI_VOLATILE 0x0040 // File has no backing store
#define FI_READONLY 0x0080 // File cannot be modified
#define FI_REPLACEMENTEXISTS 0x0100 // RegReplaceKey called on file
typedef struct _HIVE_INFO { struct _HIVE_INFO FAR* lpNextHiveInfo; LPFILE_INFO lpFileInfo; UINT NameLength; BYTE Hash; char Name[ANYSIZE_ARRAY]; } HIVE_INFO, FAR* LPHIVE_INFO;
#define CFIN_PRIMARY 0x0000 // FHT_PRIMARY header type
#define CFIN_SECONDARY 0x0001 // FHT_SECONDARY header type
#define CFIN_VOLATILE 0x0002 // File has no backing store
#define CFIN_VERSION20 0x0004 // Use compact keynode form
int INTERNAL RgCreateFileInfoNew( LPFILE_INFO FAR* lplpFileInfo, LPCSTR lpFileName, UINT Flags );
int INTERNAL RgCreateFileInfoExisting( LPFILE_INFO FAR* lplpFileInfo, LPCSTR lpFileName );
int INTERNAL RgInitRootKeyFromFileInfo( HKEY hKey );
int INTERNAL RgDestroyFileInfo( LPFILE_INFO lpFileInfo );
int INTERNAL RgFlushFileInfo( LPFILE_INFO lpFileInfo );
int INTERNAL RgSweepFileInfo( LPFILE_INFO lpFileInfo );
typedef int (INTERNAL* LPENUMFILEINFOPROC)(LPFILE_INFO);
VOID INTERNAL RgEnumFileInfos( LPENUMFILEINFOPROC lpEnumFileInfoProc );
#define RgIndexKeynodeBlockInfoPtr(lpfi, index) \
((LPKEYNODE_BLOCK_INFO) (&(lpfi)-> lpKeynodeBlockInfo[index]))
#define RgIndexDatablockInfoPtr(lpfi, index) \
((LPDATABLOCK_INFO) (&(lpfi)-> lpDatablockInfo[index]))
#define RgIndexKeyRecordPtr(lpdi, index) \
((LPKEY_RECORD) ((LPBYTE)(lpdi)-> lpDatablockHeader + (lpdi)-> lpKeyRecordTable[(index)]))
BOOL INTERNAL RgIsValidFileHeader( LPFILE_HEADER lpFileHeader );
BOOL INTERNAL RgIsValidKeynodeHeader( LPKEYNODE_HEADER lpKeynodeHeader );
BOOL INTERNAL RgIsValidDatablockHeader( LPDATABLOCK_HEADER lpDatablockHeader );
extern LPFILE_INFO g_RgFileInfoList;
#endif // _REGFINFO_
|