203 lines
6 KiB
C
203 lines
6 KiB
C
//
|
|
// 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_
|