上一节读了HIVE文件读入内存时的初始化操作。现在来看看实际对内存中的HIVE文件的操作。
首先是从空闲CELL中分配一个指定大小的CELL。HvAllocateCell就是做这件事情的。
这个函数有四个参数:
1. RegistryHive HHIVE结构指针
2. Size 需要分配的CELL大小(不包括HCELL结构的大小)
3. Storage 分配的CELL是Stable还是Volatile。
4. Vicinity 这个参数在Freeldr中没有使用
lib/cmlib/hivecell.c
- HCELL_INDEX CMAPI HvAllocateCell(PHHIVE RegistryHive, SIZE_T Size, HSTORAGE_TYPE Storage, HCELL_INDEX Vicinity)
- {
- PHCELL FreeCell;
- HCELL_INDEX FreeCellOffset;
- PHCELL NewCell;
- PHBIN Bin;
- /* 加上HCELL的大小并且按16位向上对齐 */
- Size = ROUND_UP(Size + sizeof(HCELL), 16);
- /* 从FreeDisplay中找到Size大小的空闲CELL, FreeCellOffset是CELL的索引 */
- FreeCellOffset = HvpFindFree(RegistryHive, Size, Storage);
- /* 如果没有符合的CELL, 需要在末尾增加一个BIN, 从新的BIN中分配需要的CELL, FreeCellOffset是CELL索引 */
- if (FreeCellOffset == HCELL_NIL)
- {
- Bin = HvpAddBin(RegistryHive, Size, Storage);
- if (Bin == NULL)
- return HCELL_NIL;
- FreeCellOffset = Bin->FileOffset + sizeof(HBIN);
- FreeCellOffset |= Storage << HCELL_TYPE_SHIFT;
- }
- /* 根据索引获得HCELL结构 */