NTLDR编译详解

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

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

下面是NTLDR的编译步骤:

1.       安装WIN2K3 IFS包,并把其中3790\bin\bin16目录下的bind16.exec1.errc13216.exe cl16.execl.defcl.errlib16.exelink16.exeq23.exerc16.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.c564行更改为:

        UCHAR   temp = 0;

D:\nt\private\ntos\boot\lib\i386\disp_tm.c433行更改为:

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

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

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.libD:\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.LIBINT64.LIB文件拷贝到D:\nt\public\sdk\lib\i386目录下。

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

posted @ 2008-10-02 00:48  BinSys  阅读(1430)  评论(0编辑  收藏  举报