ReactOS-Freeldr注册表HIVE文件格式

ReactOS的注册表信息存储在ReactOS/System32/CONFIG/SYSTEM文件中。注册表文件使用的一种特殊的格式——HIVE。
HIVE文件主要由BASE_BLOCK/BIN/CELL三部分组成的。BASE_BLOCK是文件头,大小为4KB,里面存储了整个文件的一些全局信息。BIN是以4KB对其的一段空间,里面管理了若干个CELL。CELL是一段用户自定义大小的空间,注册表的键值信息就是存储在一个个CELL里面。
整个HIVE文件就是一个BASE_BLOCK头和若干BIN,每个BIN中有若干CELL。当用户需要分配一个CELL,而HIVE文件中没有足够大的CELL时,需要在文件末尾增长一个BIN,再从这个BIN里面分别需要的CELL。

我们来看看整个HIVE文件在内存中的结构
  1. typedef struct _HHIVE
  2. {
  3.     ULONG Signature;                            // HV_SIGNATURE(0x66676572) 标志位
  4.     PGET_CELL_ROUTINE GetCellRoutine;           // 根据index获得cell的函数指针
  5.     PRELEASE_CELL_ROUTINE ReleaseCellRoutine;   // 释放cell指针
  6.     PALLOCATE_ROUTINE Allocate;                 // 申请内存的指针
  7.     PFREE_ROUTINE Free;                         // 释放内存的指针
  8.     PFILE_READ_ROUTINE FileRead;                // 读HIVE文件指针
  9.     PFILE_WRITE_ROUTINE FileWrite;              // 写HIVE文件
  10.     PFILE_SET_SIZE_ROUTINE FileSetSize;         // 获得HIVE文件大小
  11.     PFILE_FLUSH_ROUTINE FileFlush;              // 刷新HIVE
  12.     PHBASE_BLOCK BaseBlock;                     // BASE_BLOCK的内存指针
  13.     RTL_BITMAP DirtyVector;                     // 标志哪个块(4kb)被修改过的位图
  14.     ULONG DirtyCount;                           // 被修改块的数量?
  15.     ULONG DirtyAlloc;                           // ?
  16.     ULONG BaseBlockAlloc;                       // ?
  17.     ULONG Cluster;                              // BaseBlock占用的Cluster数量, 总为1
  18.     BOOLEAN Flat;                               // 初始化HIVE时是否使用了HINIT_FLAT标志
  19.     BOOLEAN ReadOnly;                           // 是否只读
  20.     BOOLEAN Log;                                // ?
  21.     BOOLEAN DirtyFlag;                          // ?
  22.     ULONG HvBinHeadersUse;
  23.     ULONG HvFreeCellsUse;
  24.     ULONG HvUsedcellsUse;
  25.     ULONG CmUsedCellsUse;
  26.     ULONG HiveFlags;                            // Hive标志
  27.     ULONG LogSize;
  28.     ULONG RefreshCount;
  29.     ULONG StorageTypeCount;                     // Storage数组的大小(2)
  30.     ULONG Version;
  31.     DUAL Storage[HTYPE_COUNT];                  // 管理Block的数组, Stable和Volatile各一个元素
  32. } HHIVE, *PHHIVE;
在freeldr中整个HIVE文件使用HHIVE数据结构来表示。这里面有一组函数指针,当HIVE需要分配内存、写文件等操作时会调用相应的指针。这些指针在HIVE的初始化函数中被赋值。GetCellRoutine可以根据CELL索引获取CELL指针,ReleaseCellRoutine会释放CELL指针。这两个指针在freeldr中没有使用。
初始化后BaseBlock指针将指向HIVE的文件头BASE_BLOCK结构。
DirtyVector是一个位图,标志着HIVE文件中的哪个块(4KB)被修改过了。
Cluster是BaseBlock占用的簇的数量,在reactos系统中这个值永远为1.
Flat代表初始化时是否使用了HINIT_FLAT标志,使用这个标志说明HHIVE所指向的内存都是初始化时分配好的,所以不需要它释放内存。ReadOnly代表注册表只读。
最后一个比较重要的域是StorageTypeCount和Storage数组。

HIVE中的数据分为两大类,易失的(Volatile)和非易失去的(Stable),StorageTypeCount为2。Stable数据最后会被刷新到硬盘文件中,而Volatile数据关机之后就丢失了。HHIVE中Storage数组有两个元素,分别管理这两种数据的全部数据块,这里面存储了数据块位置,是否空闲等信息。之后我们会看到用户通过CELL索引获取CELL地址,这个转换就使用到了这个数组里面的信息。

下面我们看一个HIVE的初始化函数HvpInitializeMemoryHive
函数有两个参数:
Hive是HHIVE结构的指针
ChunkBase是从硬盘中读取的HIVE文件内容。

lib/cmlib/hiveinit.c
  1. NTSTATUS CMAPI HvpInitializeMemoryHive(PHHIVE Hive, PVOID ChunkBase)
  2. {
  3.    SIZE_T BlockIndex;
  4.    PHBIN Bin, NewBin;
  5.    ULONG i;
  6.    ULONG BitmapSize;
  7.    PULONG BitmapBuffer;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值