ReactOS-Freeldr镜像加载

 

Freeldr中镜像加载相关的操作在Freeldr/Freeldr/windows/Peloader.c文件中。
首先来看看如何加载一个PE镜像。这个操作在WinLdrLoadImage函数中。
这个函数的三个参数分别为镜像的Arc路径FileName, 镜像所处内存的内存属性MemoryType, 加载后镜像的基地址由ImageBasePA返回。
  1. BOOLEAN
  2. WinLdrLoadImage(IN PCHAR FileName,
  3.                 TYPE_OF_MEMORY MemoryType,
  4.                 OUT PVOID *ImageBasePA)
  5. {
  6.     ......
  7.     /* 在屏幕中央显示 Loading xxx... */
  8.     sprintf(ProgressString, "Loading %s...", strchr(FileName, '//') + 1);
  9.     UiDrawBackdrop();
  10.     UiDrawProgressBarCenter(1, 100, ProgressString);
  11.     /*打卡Arc路径的文件,并读取前两个sector。用来读取PE头*/
  12.     Status = ArcOpen(FileName, OpenReadOnly, &FileId);
  13.     if (Status != ESUCCESS)
  14.     {
  15.         //UiMessageBox("Can not open the file");
  16.         return FALSE;
  17.     }
  18.     Status = ArcRead(FileId, HeadersBuffer, SECTOR_SIZE * 2, &BytesRead);
  19.     if (Status != ESUCCESS)
  20.     {
  21.         UiMessageBox("Error reading from file");
  22.         ArcClose(FileId);
  23.         return FALSE;
  24.     }
  25.     /* 获得NT头指针 */
  26.     NtHeaders = RtlImageNtHeader(HeadersBuffer);
  27.     if (!NtHeaders)
  28.     {
  29.         UiMessageBox("Error - no NT header found");
  30.         ArcClose(FileId);
  31.         return FALSE;
  32.     }
  33.     /* 检测是否是可执行镜像 */
  34.     if (((NtHeaders->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE) == 0))
  35.     {
  36.         UiMessageBox("Not an executable image");
  37.         ArcClose(FileId);
  38.         return FALSE;
  39.     }
  40.     /* 从PE头中获得section数量, 并且获得节表的首地址 */
  41.     NumberOfSections = NtHeaders->FileHeader.NumberOfSections;
  42.     SectionHeader = IMAGE_FIRST_SECTION(NtHeaders);
  43.     /* 首先以PE头中的ImageBase为基地址申请存放镜像的内存, 如果失败就从任意地址申请内存 */
  44.     PhysicalBase = MmAllocateMemoryAtAddress(NtHeaders->OptionalHeader.SizeOfImage,
  45.                        (PVOID)((ULONG)NtHeaders->OptionalHeader.ImageBase & (KSEG0_BASE - 1)),
  46.                        MemoryType);
  47.     if (PhysicalBase == NULL)
  48.     {
  49.         /* It's ok, we don't panic - let's allocate again at any other "low" place */
  50.         PhysicalBase = MmAllocateMemoryWithType(NtHeaders->OptionalHeader.SizeOfImage, MemoryType);
  51.         if (PhysicalBase =
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值