问题1: 驱动加载后,无法卸载
答: 检查DriverObject->DriverUnload = DriverUnload; --是否实现
问题2: 驱动加载、卸载后,第二次无法加载了。
答: IoRegisterFsRegistrationChange(DriverObject, SpyFsNotification); ---因为驱动是全局的,需要去注册
IoUnregisterFsRegistrationChange(g_FileSpyDriverObject, SpyFsNotification);
问题3: VS2015编译win10平台的,不能加载到win7,直接蓝屏
问题4: IoAttachDevice()过的,才可以IoDetachDevice(), 否则如果给没有Attach过的直接进行IoDetachDevice,那么也会蓝屏
问题5: 在DriverEntry(),所有的系统卷设备全部挂载,但是没有Read/Write注册派遣例程,也直接蓝(这个直接蓝在NT!NtRead 和 NT!NtWrite的函数上,而且就是0xc0000005的空指针类型的访问,这个为什么是必须的?) 实际情况测试中,不能采用偷懒的办法:, 例如:
for ( i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction[i] = PassThrough;
}
而一定要:
DriverObject->MajorFunction[IRP_MJ_CREATE] = SpyCreateTest;
DriverObject->MajorFunction[IRP_MJ_READ] = PassThrough;
DriverObject->MajorFunction[IRP_MJ_WRITE] = PassThrough;
并且一定要设置Fast-IO的派遣例程
注意:
WDK7600, 拷贝驱动目录,并bcz,执行,驱动无法卸载。
问题6: 驱动加载后,windbg打开,debugview打开显示文件信息比较多以后,直接卸载驱动,会有概率出现系统自己的蓝屏
说是有驱动打印时,有什么资源没有释放,所以尽量避免卸载驱动。
问题7: ntoskrnl.lib这个DDL在VS2015下的WDK有个函数,win7上没有,但是编译上VS2015又支持win7,所以一旦编译好win7会出现,驱动无法加载成功的情况
原因是: Win7上的环境,缺少了有个函数,找不到符号表,导致加载失败,所以win7上的编译还是用WDK7600来编译,或者将WDK7600的库,拷贝出来,在VS2015工程编译win7_32的时候,通过手工来设置加载该WDK7600的库文件。