ReactOS-Freeldr注册表HIVE文件格式2

上一节读了HIVE文件读入内存时的初始化操作。现在来看看实际对内存中的HIVE文件的操作。
首先是从空闲CELL中分配一个指定大小的CELL。HvAllocateCell就是做这件事情的。
这个函数有四个参数:
1. RegistryHive HHIVE结构指针
2. Size 需要分配的CELL大小(不包括HCELL结构的大小)
3. Storage 分配的CELL是Stable还是Volatile。
4. Vicinity 这个参数在Freeldr中没有使用

lib/cmlib/hivecell.c
  1. HCELL_INDEX CMAPI HvAllocateCell(PHHIVE RegistryHive, SIZE_T Size, HSTORAGE_TYPE Storage, HCELL_INDEX Vicinity)
  2. {
  3.    PHCELL FreeCell;
  4.    HCELL_INDEX FreeCellOffset;
  5.    PHCELL NewCell;
  6.    PHBIN Bin;
  7.    /* 加上HCELL的大小并且按16位向上对齐 */
  8.    Size = ROUND_UP(Size + sizeof(HCELL), 16);
  9.    /* 从FreeDisplay中找到Size大小的空闲CELL, FreeCellOffset是CELL的索引 */
  10.    FreeCellOffset = HvpFindFree(RegistryHive, Size, Storage);
  11.    /* 如果没有符合的CELL, 需要在末尾增加一个BIN, 从新的BIN中分配需要的CELL, FreeCellOffset是CELL索引 */
  12.    if (FreeCellOffset == HCELL_NIL)
  13.    {
  14.       Bin = HvpAddBin(RegistryHive, Size, Storage);
  15.       if (Bin == NULL)
  16.          return HCELL_NIL;
  17.       FreeCellOffset = Bin->FileOffset + sizeof(HBIN);
  18.       FreeCellOffset |= Storage << HCELL_TYPE_SHIFT;
  19.    }
  20.    /* 根据索引获得HCELL结构 */
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值