



模拟调试详见第3章,这里仅做简单介绍。默认情况下,kd和osloader项目编译的是内核调试文件,要实现模拟调试,需要对工程项目做一些更改:
在kd和osloader属性页中,在配置属性→C/C++→预处理器下的预处理器定义中,添加SIMULATE_DEBUG。在osloader属性页中,在配置属性→链接器→系统下的子系统中,选择“控制台(/SUBSYSTEM:CONSOLE)”。
重新编译链接后,按F10键启动osloader.exe程序,或者先下断点然后按F5键直接运行,如图1.9所示。
    图1.9
中断下来后,按F11键进入KdpInitSystem函数观察调试系统的初始化过程,或直接按F5键让osloader.exe继续运行,直到和WinDbg连接而中断下来为止,如图1.10所示。
    图1.10
现在WinDbg就连接上了osloader.exe控制台程序。注意,这虽然是个Win32应用程序,不是操作系统内核,但是它所显示的和连接操作系统内核是一模一样的。在这种情况下,我们进入了双重调试模式,osloader.exe被Visual Studio和WinDbg所调试。所以,任何运行的流程都能监控,可以双向下断点,可以观察COM通信包内容。下断点后,可以在Visual Studio中挂起osloader.exe查看内存情况。示例如下。
查看执行流程:
   查看寄存器:
   查看内存:
   反汇编:
   查看模块:
   在WinDbg中按F5键交出控制权后,Visual Studio 2008中的中断如图1.11所示。
    图1.11
执行流程从调试引擎核心返回后被Visual Studio 2008中断在int 3这行代码,这时调试控制权从WinDbg转交给了Visual Studio 2008,这就是双重调试模式。如果不想用Visual Studio 2008启动osloader.exe,也可以单独运行osloader.exe,最终也可以与WinDbg连接,这通过注册异常回调实现。注意,这里调试的不是内核,而是应用程序osloader.exe,所以osloader后面的流程是不能正常运行的,像分页机制之类不属于应用程序的范畴,Win32应用程序不能运行特权指令。但既然可以模拟调试引擎,那么内核下的模块就没有什么不能模拟的了,比如Bochs就是模拟了整个操作系统的运行硬件环境。
早先在设计本书时,笔者曾经设计模拟过内存管理和对象管理部分,但经过考虑后,把这部分去掉了,因为系统与WinDbg连接上以后,就没必要模拟了,WinDbg能观察到整个系统内核的初始化,当然也包括在osloader初始化阶段的物理内存的收集和分页机制的开启。这部分内容参见第4章。