-
-
[求助]Win2003下枚举DPC定时器蓝屏!!
-
发表于:
2014-2-20 19:42
3811
-
枚举DPC定时器的关键是定位 KiTimerTableListHead (DPC定时器数组)
WinXP下这个数组元素有256个
Win2003下这个数组元素有512个
定位到KiTimerTableListHead后,遍历它即可
//这里获取到的KiTimerTableListHead的地址打印出来是对的,到这里没问题不蓝屏
//遍历KiTimerTableListHead数组得到所有DPC定时器
//下面代码蓝屏,和WinXP下比只改动了一处
irql = KeRaiseIrqlToDpcLevel();
for(j = 0; j < 0x200; j++) //只改动这里,j为数组元素个数,WinXP下把0x200换成0x100就能正确枚举出来
{
pnode = (LIST_ENTRY *)(addr + j * 8); //addr为KiTimerTableListHead地址
pnext = pnode->Blink;
while(pnext != pnode)
{
PKTIMER ptimer = CONTAINING_RECORD(pnext, KTIMER, TimerListEntry);
if(MmIsAddressValid(ptimer) && MmIsAddressValid(ptimer->Dpc) && MmIsAddressValid(ptimer->Dpc->DeferredRoutine)) //过滤
{
routine = (ULONG)ptimer->Dpc->DeferredRoutine;
DbgPrint("DPC Timer对象: 0x%X 入口地址: 0x%X", (ULONG)ptimer, routine);
}
pnext = pnext->Blink; //调试发现蓝屏在这行,WinXP下没问题
}
}
KeLowerIrql(irql);
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课