ReactOS-Freeldr镜像加载2

 先来介绍几个重要的结构。Freeldr虽然是个引导程序,严格来讲不属于操作系统的一部分,但它也有一些类似Windows系统中的数据结构。

LOADER_PARAMETER_BLOCK这个可以看作Freeldr的PEB,结构也和PEB非常相似。
/include/reactos/arc/arc.h
  1. typedef struct _LOADER_PARAMETER_BLOCK
  2. {
  3.     LIST_ENTRY LoadOrderListHead;
  4.     LIST_ENTRY MemoryDescriptorListHead;
  5.     LIST_ENTRY BootDriverListHead;
  6.     ......
  7. } LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;

这里我们只看前三个域。和PEB中一样,前三个元素是三个表头,Freeldr每加载一个模块就会生成一个LDR_DATA_TABLE_ENTRY结构,并将这个结构连入这三个链表。
LoadOrder是按照夹在顺序排序的,Memory按照内存位置排序,BootDriver按照分区号排序。在Freeldr中只使用了LoadOrderListHead。

LDR_DATA_TABLE_ENTRY的结构定义在include/ndk/Ldrtypes.h中
  1. typedef struct _LDR_DATA_TABLE_ENTRY
  2. {
  3.     LIST_ENTRY InLoadOrderLinks;                      // 用来连入LoadOrderListHead等的表头
  4.     LIST_ENTRY InMemoryOrderModuleList;
  5.     LIST_ENTRY InInitializationOrderModuleList;
  6.     PVOID DllBase;                                    // 模块基地址
  7.     PVOID EntryPoint;                                 // 入口点
  8.     ULONG SizeOfImage;                                // 内存镜像大小
  9.     UNICODE_STRING FullDllName;                       // 文件全路径
  10.     UNICODE_STRING BaseDllName;                       // 模块名, 不一定和全路径的文件名相同
  11.     ULONG Flags;                                      // 一些标志
  12.     USHORT LoadCount;                                 // 引用计数
  13.     USHORT TlsIndex;
  14.     union
  15.     {
  16.         LIST_ENTRY HashLinks;
  17.         struct
  18.         {
  19.             PVOID SectionPointer;
  20.             ULONG CheckSum;                           // 校验和
  21.         };
  22.     };
  23.     union
  24.     {
  25.         ULONG TimeDateStamp;
  26.         PVOID LoadedImports;
  27.     };
  28.     PVOID EntryPointActivationContext;
  29.     PVOID PatchInformation;
  30. } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
我做过注释的是Freeldr实际用到的域。注意这里BaseDllName中记录的模块名不一定和模块的实际文件名相同。许多BaseDllName是硬编码的只具有参考意义。

上一节读的WinLdrLoadImage函数,只是把文件从硬盘中读出来按照PE格式对其,并没有涉及上面所说的结构。所以Freeldr中WinLdrLoadImage往往都是和WinLdrAllocateDataTableEntry函数配合使用的。WinLdrLoadImage负责加载镜像,WinLdrAllocateDataTableEntry负责生成、初始化对应的LDR_DATA_TABLE_ENTRY结构。

  1. BOOLEAN
  2. WinLdrAllocateDataTableEntry(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
  3.                              IN PCCH BaseDllName,
  4.                              IN PCCH FullDllName,
  5.                              IN PVOID BasePA,
  6.                              OUT PLDR_DATA_TABLE_ENTRY *NewEntry)
  7. {
  8.     PVOID BaseVA = PaToVa(BasePA);
  9.     ......
  10.     /* 申请LDR_DATA_TABLE_ENTRY结构 */
  11.     DataTableEntry = (PLDR_DATA_TABLE_ENTRY)MmHeapAlloc(sizeof(LDR_DATA_TABLE_ENTRY));
  12.     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值