不过好像PreviousIrql就没有和谁比较过,似乎当前IRQL大于等于DPC的事实隐含在
if ( #if (_MI_PAGING_LEVELS >= 4) (PointerPxe->u.Hard.Valid == 0) || #endif #if (_MI_PAGING_LEVELS >= 3) (PointerPpe->u.Hard.Valid == 0) || #endif (PointerPde->u.Hard.Valid == 0) || ((!MI_PDE_MAPS_LARGE_PAGE (PointerPde)) && (PointerPte->u.Hard.Valid == 0)))
。。。
中,可以这样理解吗?
晕
但是 IRQL >= DPC 且页面无效,这就违背了 IRQL 的基本准则。
是啊,我也是这样认为的,但是系统是在什么地方判断出IRQL >= DPC 的呢?还是引用我前面问过的话:
“。。。好像PreviousIrql就没有和谁比较过。。。”,例如,是不是应该有类似这样的比较:
if ( PreviousIrql >= DISPATCH_LEVEL )
BugCheck...
谢谢
呵呵,终于看到关键的东西了,不贴也可以啊,你只要确认有类似的语句就行了。
回过头来看看汇编,似乎下面这一段是和所贴代码对应的
...
call dword ptr [nt!_imp__KeGetCurrentIrql (804d9108)] ;PreviousIrql
cmp al,1 ;和APC_LEVEL比较
mov byte ptr [ebp-2],al
jbe nt!MmAccessFault+0x185
//>APC_LEVEL,进一步判断第二个条件,如果也满足就BSOD了
mov ecx,ebx
call nt!MiCheckPdeForPagedPool