在做Windows内核驱动程序调试的时候,经常遇到需要以Boot模式启动的驱动程序,虽然将内核调试器SoftICE的启动模式设置为Boot(早期Boot)时能够拦截到驱动程序的DriverEntry执行入口(不过据我的经验,好像并不能成功的拦截到DriverEntry,而需要将INT 3中断硬编码到驱动程序中,不过不管怎样,总有办法让程序停在DriverEntry的入口处),但是此时看到的调试界面全部都是汇编模式,对于象我这样对汇编语言不熟悉的人来说,调试这样的程序成为一种痛苦。
不过,SoftICE调试工具提供了一种称为符号驱动程序(Siwsym)的东东,也就是将我们希望源码调试的驱动程序的符号文件*.NMS加载到这个驱动程序当中,即可以实现在系统Boot阶段对驱动程序的源码级调试。
1.安装Siwsym
为了那些boot模式驱动程序的开发人员调试DriverEntry,开发了一个SoftICE符号驱动程序(SIWSYM,SoftICE Symbol Driver )。这个驱动程序在操作系统boot过程中早于SoftICE加载,这个驱动程序包含了一个可以丢弃的INIT段,这个段包含了一些SoftICE需要使用的文件的内存映像。
当SoftICE启动时,它定位SIWSYM驱动程序并且申请文件映象表的地址。只要SoftICE需要打开文件,它将首先检查包含在SIWSYM文件映像区所包含的文件。如果文件存在,SoftICE将使用这个文件在内存中的拷贝,如果文件不在SIWSYM文件映像区,SoftICE将会利用标准的方式请求文件访问。
如果需要安装SIWSYM,则首先需要将siwsym.sys从ntice的安装目录拷贝到你的系统目录:%SystemRoot%/System32/Drivers。然后将下面的文本保存成.reg注册表格式文件:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Siwsym]
"Type"=dword:00000001
"Group"="NTICE"
"ErrorControl"=dword:00000001
"Start"=dword:00000000
"Tag"=dword:00000001
对于W2K系统,Group项的值应该为"System"而不是"NTICE"
并将该注册表项导入注册表。然后需要修改服务组顺序(service group order),插入NTICE组到下面注册表键值的“List”项的最前面:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/ServiceGroupOrder
2.运行icepack.exe and reboot.
SoftICE通过命令行程序所需要的文件是通过ICEPACK.EXE加入SIWSYM驱动程序中的。这个工具在SoftICE的安装目录下面,该工具将自动的载入SoftICE需要的文件,例如WINICE.DAT和所有被这个文件引用的文件(在LOAD=和EXP=行)。注意,一定要保留足够的符号文件缓冲区空间,另外,如果你修改了驱动程序的符号文件或者源文件,一定要重新运行这个程序以保证SIWSYM.SYS的同步更新!
3.实例
例如,你想在SoftICE初始化的时候加载MySys.sys驱动程序的符号文件MySys.nms,则需要在SoftICE的符号加载器Loader32.exe的配置界面中做如下配置:
Edit -> SoftICE Initialization Settings... -> Symbols中将你的MySys.nms添加进去,并且增加符号缓冲区的大小,因为带源码的符号文件NMS一般都比较大,然后运行icepack.exe,重启系统,这样你就可以在系统Boot阶段对驱动程序做源码级的调试了。如果你修改了源码并且重新生成了MySys.nms文件,不要忘了再次运行icepack.exe进行同步更新。