注册表是一组称为储巢的单独文件组成的.配置管理器从逻辑上将一个储巢分成一些称为块的分配单元.类似于文件系统中一个磁盘分成簇一样.定义是将注册表快的大小为4096字节.
储巢总是按照块的粒度来增加新的数据的.就算不够4096个字节也是一个增加块.
这个是储巢的结构定义:
typedef struct _HBASE_BLOCK
{
ULONG Signature; /* 签名ASCII-"regf" = 0x66676572 (小端序)*/
ULONG Sequence1;
ULONG Sequence2;
LARGE_INTEGER TimeStamp; /* 最后一次写操作的时间戳 */
ULONG Major; /* 主版本号 */
ULONG Minor; /* 次版本号 */
ULONG Type;
ULONG Format;
ULONG RootCell; /* 第一个键记录的偏移 */
ULONG Length; /* 数据块长度 */
ULONG Cluster;
UCHAR name[64]; /* 储巢文件名 */
ULONG Reserved1[99];
ULONG CheckSum; /* 校验和 */
ULONG Reserved2[894];
ULONG BootType;
ULONG BootRecover;
} HBASE_BLOCK, *PHBASE_BLOCK;
Windows将一个储巢所存储的注册表数据组织在一种称为巢室的容器中.一个巢室可以容纳一个键,一个值,一个安全描述符,一列子键,在巢室数据开始处的一个域描述了该巢室数据的类型.当一个巢室加入到一储巢中,而且该储巢必须进行扩展才能包含该巢室的时候,系统创建一个称为巢箱的分配单元.一个巢箱式新巢室正好扩展到下一个块的边界的大小.系统将巢室尾部和巢箱的尾部之间的任何空间都看出是空闲的空间。可以在分配给其他的巢室,
下面是巢箱的数据结构。
typedef struct _HBIN
{
ULONG Signature; /* 签名 ASCII-"hbin" = 0x6E696268 (小端序) */
ULONG FileOffset; /* 本巢箱相对第一个巢箱起始的偏移 */
ULONG Size; /* 本巢箱的大小 */
ULONG Reserved1[2];
LARGE_INTEGER TimeStamp;
ULONG Spare;
} HBIN, *PHBIN;
巢室的数据类型:
键巢室:typedef struct _CM_KEY_NODE
{
USHORT Signature; /*