最近项目中接连碰到几个和驱动加载相关的问题,所以我决定对这些问题做一个调研。
项目使用的驱动是一个Legency的NT式的协议驱动,驱动上边是标准的Legency的NT驱动接口,下边是NDIS接口,运行在Windows 2003 Server SP2上。出现的问题可以描述如下:
1. 某些服务器上安装好项目使用的驱动之后不能启动驱动。
2. 某些服务器上当驱动卸载之后必须重启才能启动重新安装的驱动。
当使用net start <driver name>加载驱动的时候,都出现下列错误:
System error 1058 has occurred.
The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.
刚看到问题的时候,我直觉是DriverEntry中的某些设置和系统中某些选项冲突,所以我首先编译了一个chk版的驱动,用dbgview和regmon捕获内核调试输出和注册表行为,但是连一句调试信息都没有。这就令人费解了,因为这说明加载过程连DriverEntry都没进。换句话说,要解决这个问题就要对系统代码进行跟踪,但是微软的系统不开源,只能另找出路了。于是我想到了ReactOS项目,一个模仿WinXP/Win2003的开源项目,其目标是和WinXP/Win2003二进制兼容。于是我到了ReactOS的官网上下载了最新的代码,通过查看其对net start命令的实现