NTLDR编译详解

转载自:https://www.cnblogs.com/binsys/archive/2008/10/02/1303014.html

通过上一篇文章的介绍,我们已经有了一个NT4源码编译环境了,而且也已经编译出了一些工具软件,也许你稍许有点兴奋了,但我要说的是,好戏还在后头呢。让我们一起进入激动人心的NTLDR的编译吧,源码面前,了无秘密,尤其是基于源码还可以编译出可执行文件,这意味着你可以边看源码变通过执行文件的运行情况来了解其工作原理。

 

简单介绍一下NTLDR,这是一个从NT4到WIN2K3都存在的关键文件,机器启动时,最终由启动扇区代码把控制权交给NTLDR,在这个时间点,CPU还处于实模式状态,所以NTLDR的入口点代码是16位实模式代码。大家知道,编写实模式代码是一件费力不讨好的事情,需要对CPU的运行机理和BIOS的功能使用有相当程度的了解,而且这种代码的扩展性和可维护性都不甚理想,所以导致NTLDR其实是一个16位和32位代码的一个结合体,从可执行文件角度来说,它的前半部分是16位代码(startup.com),后半部分是32位PE格式的代码(osloader.exe),两个文件拼在一起就是NTLDR文件。16位代码一个主要的功能就是初始化CPU,进入保护模式,然后让32位代码部分来做接下来的大部分加载OS的准备工作。从这我们可以看出,要编译NTLDR,需要分别编译其中的16位和32位代码。所以我们除了通常习惯的32位编译工具外,还需要16位编译工具,在NT4源码中,我没能找到这些工具,也没有可以编译这些工具的源代码,幸运的是,在WIN2K3的IFS包(Windows的文件系统开发包)里面有我们需要的工具。

 

下面是NTLDR的编译步骤:

1.       安装WIN2K3 IFS包,并把其中3790\bin\bin16目录下的bind16.exe,c1.err,c13216.exe, cl16.exe,cl.def,cl.err,lib16.exe,link16.exe,q23.exe,rc16.exe文件拷贝到D:\nt\public\tools目录下,另外把link16.exe改名为link_60.exe。

2.       点击d:\ddk\buildchk.bat,然后在命令行中运行D:\nt\ntos.bat,再切换到D:\nt\private目录,在命令行中输入“build”,然后放松心情,带上篮球出去锻炼一下,或者去看场电影,反正该干嘛干嘛去,这将是一个漫长的等待。在这一步,会自动生成很多必要的头文件,还会尝试编译所有的源代码。

3.       直入主题,把命令行中当前目录切换到D:\nt\private\ntos\boot\lib,试着输入“build”,嗯,好像还有编译错误,那就一个一个来改吧。

把D:\nt\private\ntos\boot\lib\i386\disp_gr.c的564行更改为:

        UCHAR   temp = 0;

把D:\nt\private\ntos\boot\lib\i386\disp_tm.c的433行更改为:

        CHAR TmGraphicsChars[GraphicsCharMax] = { '?','?','?','?','?','?' };

把D:\nt\private\ntos\boot\lib\i386\disp_tm.c的442行后面的内容全部删除。

在D:\nt\private\ntos\boot\obj\i386目录下创建checked目录,重新编译,在D:\nt\private\ntos\boot\obj\i386\checked目录下应该有boot.lib文件。

4.       精简Path环境变量,用“set path=***”可以实现,否则cl16很可能出错,我的设置为:

Path=d:\nt\public\tools;C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT;C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files\Microsoft Visual Studio\Common\Tools;C:\Program Files\Microsoft Visual Studio\VC98\bin;D:\DDK\bin

5.       拷贝long.lib到D:\nt\private\ntos\boot\startup目录下,我也不记得这个文件是从哪找到的,如果你需要,请留下你的邮件地址,我发给你,只有4K。

6.       切换当前目录到D:\nt\private\ntos\boot\startup,输入“build“,编译成功后在D:\nt\private\ntos\boot\startup\obj\i386目录下应该有一个startup.com文件。

7.       创建目录D:\nt\inc并把D:\nt\public\sdk\inc目录下的ntverp.h拷过来。

8.       把D:\nt\private\ntos\boot\obj\i386\checked下的boot.lib文件拷贝到D:\nt\private\ntos\boot\obj\i386下。在当前目录为D:\nt\private\ntos\boot\bldr的命令行中输入“build“,这时应该还有一些错误。

9.       创建D:\nt\private\ntos\boot\bldr\obj\i386\checked目录,重新编译,并把生成的D:\nt\private\ntos\boot\bldr\obj\i386\checked\bldr.lib拷贝到D:\nt\private\ntos\boot\bldr\obj\i386目录下。

10.   创建D:\nt\private\ntos\config\obj\i386\checked目录,切换当前目录到D:\nt\private\ntos\config\boot,输入“build“,然后把D:\nt\private\ntos\config\obj\i386\checked\bconfig.lib文件拷贝到D:\nt\private\ntos\config\obj\i386目录下。

11.   创建D:\nt\private\ntos\obj\i386\checked目录,切换当前目录到D:\nt\private\ntos\ke,输入“build“,然后把D:\nt\private\ntos\obj\i386\checked\ke.lib文件拷贝到D:\nt\private\ntos\obj\i386目录下。

12.   创建D:\nt\private\ntos\rtl\obj\i386\checked目录,切换当前目录到D:\nt\private\ntos\rtl\boot,输入“build“,然后把D:\nt\private\ntos\rtl\obj\i386\checked目录下的bldrrtl.lib文件拷贝到D:\nt\private\ntos\rtl\obj\i386目录下。

13.   把D:\ddk\lib\i386\checked目录下的LIBCNTPR.LIB和INT64.LIB文件拷贝到D:\nt\public\sdk\lib\i386目录下。

14.   切换当前目录到D:\nt\private\ntos\boot\bldr,输入“build“,这时你在D:\nt\private\ntos\boot\bldr\obj\i386目录下就能看到237K的NTLDR文件了。你可以装一台NT4的机器然后用这个来替换它的NTLDR,Enjoy it!

 

注:有关NTLDR的分析可参看:http://www.doc88.com/p-282792459333.html

 

好文要顶 关注我 收藏该文  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NTLDR文件是win nt/win200/WinXP的引导文件,当此文件丢失时启动系统会提示"NTLDR is missing..."并要求按任意键重新启动,不能正确进入系统 。所以应该在系统正常的时候给予备份。 NTLDR文件是做什么的?我们如何来修复NTLDR文件类型的故障呢? NTLDR文件的是一个隐藏的,只读的系统文件,位置在系统盘的根目录,用来装载操作系统。 一般情况系统的引导过程是这样的: 代码 1、电源自检程序开始运行 2、主引导记录被装入内存,并且程序开始执行 3、活动分区的引导扇区被装入内存 4、NTLDR从引导扇区被装入并初始化 5、将处理器的实模式改为32位平滑内存模式 6、NTLDR开始运行适当的小文件系统驱动程序。 小文件系统驱动程序是建立在NTLDR内部的,它能读FAT或NTFS。 7、NTLDR读boot.ini文件 8、NTLDR装载所选操作系统 *如果NT/XP被选择,, NTLDR运行Ntdetect.com 对于其他的操作系统, NTLDR装载并运行Bootsect.dos然后向它传递控制。 windows NT过程结束。 9.Ntdetect.com 搜索计算机硬件并将列表传送给NTLDR,以便将这些信息写进HKE Y_LOCAL_MACHINEHARDWARE中。 10.然后NTLDR装载Ntoskrnl.exe,Hal.dll和系统信息集合。 11.Ntldr搜索系统信息集合,并装载设备驱动配置以便设备在启动时开始工作 12.Ntldr把控制权交给Ntoskrnl.exe,这时,启动程序结束,装载阶段开始 当此文件丢失时,我们可以从安装光盘上进行提取,方法是: 1、进入系统故障恢复控制台。 2、转到C盘。 3、输入"copy X:\I386\NTLDR c:\"(说明:X为光驱盘符)并回车, 如果系统提示要否覆盖则按下"Y",之后输入exit命令退出控制台重新启动即可。 症状 当试图在一台运行 Microsoft Windows 95、Microsoft Windows 98 或 Microsoft Windows Millennium Edition (Me) 的计算机上安装 Windows XP 或者升级到 Windows XP 时,可能在安装过程中的第一次重新启动后接收到下面的错误信息: NTLDR is missing Press any key to restart 此行为只有当 Windows 95、Windows 98 或者 Windows Me 安装于使用 FAT32 文件系统的大容量驱动器之上时才会出现。 原因 如果克隆现有的 Windows 95、Windows 98 或 Windows Me 的安装,然后应用于与克隆副本的源驱动器有不同布局的驱动器上,则可能发生此行为。 一种可能的情况如下所示:正在一个 4 GB 的驱动器上运行 Windows 98。在升级后,例如升级到一块 30 GB 的硬盘后,使用第三方磁盘映像实用程序对 Windows 98 安装进行镜像操作并应用镜像到新驱动器上。在晚些时候,接着在 Windows 98 的克隆映像上安装 Windows XP 以升级到 Windows XP。 要发生此行为,则下面的条件必须存在: ? 系统/启动分区用 FAT32 文件系统格式化。 ? 计算机通过使用 INT-13 扩展(大于 7.8 GB 且分区表内有 0C 的 System-ID 类型的分区)启动。 ? 由于克隆过程,造成了 FAT32 BIOS Parameter Block (BPB) 中的头(边)值与物理驱动器的布局不匹配。 Windows 95、Windows 98 或者 Windows Me 启动代码忽略 BPB 中的头值,并且即使在值无效时仍启动程序。但是,Windows 2000 和 Windows XP 中的启动代码需要这个值,如果此值无效则启动过程不会成功。 解决方案 若要解决此问题,请改正 FAT32 BPB 中的无效头(边)值以使得 Windows XP 启动过程得以继续。更新此字段最简单的方法是通过使用下面的过程重写 Windows 95、Windows 98 或者 Windows Me 的启动代码: 代码 一. 使用包含 Sys.com 文件(默认情况下包含此文件)的 Windows 95、Windows 98 或者 Windows Me 启动盘重新启动计算机。 二. 在系统驱动器的根目录中制作 msdos.sys 文件的备份副本。为此,请从命令提示处键入下面的命令: attrib -h -r -s c:\msdos.sys rename msdos.sys *.sys 三. 在命令提示符

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值