IRQL == Interrupt ReQuest Level 中断请求级别
中断上下文,系统代替硬件做一些事情,不可睡眠
进程上下文,系统代替进程做一些事情
内部中断:CPU内部引起的叫陷阱,异常
外部中断:
![Windows内核的IRQL 中断请求级别](http://p2.ttnews.xyz/loading.gif)
无中断:
PASSIVE_LEVEL(0) 常规线程执行
{
DriverEntry
DriverUnload
Dispatch
PsCreateThread
可以使用任何函数和内存
}
软中断:
APC_LEVEL(1) 异步过程调用执行
{
APC线程
}
DISPATCH_LEVEL(2) 线程调度,延时过程调用执行
{
完成例程
NDIS回调函数
只能访问运行在DISPATCH级别的API和非分页内存
自旋锁Request后会升级费DIspatch_LEVEL
}
硬中断:
DIRQL 设备中断请求级处理程序执行
PROFILE_LEVEL 配置文件定时器
CLOCK2_LEVEL 时钟
SYNCH_LEVEL 同步级
IPI_LEVEL 处理器之间中断级
POWER_LEVEL 电源故障级
中断函数执行要快速执行,否则会出问题
NONPAGEPOOL内存可以在任何级别使用
PAGEDPOOL只能在PASSIVE_LEVEL和APC_LEVEL使用
PASSIVE和PAC级别判断:
#define PAGED_CODE() \\
{ if (KeGetCurrentIrql() > APC_LEVEL) {
kdPrint(("EX:Pageable code called at IRQL %d\\n",
KegetCurrentIrql())) ;\\
ASSERT(FALSE); \\
} \\
}
閱讀更多 攻防基地 的文章