图片2
在这里几乎就可以确定是哪个驱动导致蓝屏了。但是确定了有毛用,还是不知道是哪里的代码出错了。
先回到前面,看看Bugcheck Analysis:
DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high. This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: 0000000000000008, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff88001665257, address which referenced memory
这个错误码的意思是irql过高时,访问了分页内存。注:irql>= DISPATCH_LEVEL时,就不允许切换线程,而内存倒换需要切换线程,所以irql>= DISPATCH_LEVEL时,就不能访问分页内存,只能访问nonpaged内存。
而我保存在map里的数据都是nonpaged内存,不应该出现这种错误码。后来又想了下,如果把之前分配的nonpaged内存给delete后,驱动再去访问这个地址,就会出现这种错误码。
于是把IRP_MJ_CLEANUP里清除FileObject的代码屏蔽掉后,果然没有蓝屏出现了,看来问题就出在这里。但是nonpaged内存是有限的,不可能只new,不delete。原因还是没找到,问题还是没解决。
为了解决问题,lz想了很多方法:
1、检查代码,结果:看不出任何问题。
2、找人check代码。结果:整个公司只有我一个人写驱动,没人可以求助。
3、上网找。结果:网上没有。
4、分析对手产品的驱动。结果:他们也是用的同样的思路和方法。
5、打算逆tcpip.sys,看看它的实现原理。
就在准备逆tcpip.sys时,早上突然灵光一闪,既然“在TDI_ASSOCIATE_ADDRESS里需要把发送FileObject和接收FileObject关联起来”,在IRP_MJ_CLEANUP里清除FileObject时,是不是要发送和接收FileObject都关闭了,才都把它们delete掉?
仔细想想,觉得很有道理,马上按此思路把代码修改了,果然测试通过。