首先,WRK的代码是有协议保护的,建议只在协议许可的方式和范围内使用。
KiDispatchException是系统中分发异常的枢纽,是非常繁忙而且重要的一个函数。使用WinDBG调试时,甚至不可以对这个函数设置断点,一旦设置,便会导致目标立刻重启......
从贴出的信息来看,是访问当前CPU的处理器控制块(KPRCB)时导致异常了。
对于单处理系统,CPU的KPCR结构的位置是固定的FFDFF000,因此KeGetCurrentPrcb()通常被编译为:
mov eax,dword ptr ds:[FFDFF020h]
因为KPCR结构偏移0x20处是Prcb字段。
对于多处理器系统,会使用FS段来索引KPCR,因此KeGetCurrentPrcb()通常被编译为:
mov eax,dword ptr fs:[00000020h]
从异常信息来看,访问的地址是ffff0020:
Arg1: ffff0020, memory referenced
从这个地址来看,很可能是把KPCR的位置当做是ffff0000,然后读偏移0x20处的Prcb字段。
但是ffff0020这个地址不可读,CPU报告异常。对于正常情况KPCR一定是常驻内存的。所以现在出问题应该是没有找到KPCR的正确位置,或者出现了严重的内存问题。
建议执行如下命令看一下:
!pcrb
dg fs
另外想知道,是运行一段时间出问题时,还是一运行(驱动加载)就出问题?