存档

文章标签 ‘IRQL’

IRQL科普

2011年12月19日 没有评论

IRQL是Interrupt ReQuest Level,中断请求级别。处理器在一个IRQL上执行线程代码。IRQL是帮助决定线程如何被中断的。在同一处理器上,线程只能被更高级别IRQL的线程能中断。每个处理器都有自己的中断IRQL。常见的IRQL级别有四个:Passive、APC、 Dispatch、DIRQL。
PASSIVE_LEVEL
IRQL最低级别,没有被屏蔽的中断,线程执行用户模式,可以访问分页内存。
APC_LEVEL
只有APC级别的中断被屏蔽,可以访问分页内存。当有APC发生[......]

继续阅读

分类: Windows驱动开发 标签: ,

PAGE_FAULT_IN_NONPAGED_AREA蓝屏问题

2011年2月26日 15 条评论

今天奇迹般的遇到了这个问题,蓝屏了无数次,代号为PAGE_FAULT_IN_NONPAGED_AREA。从名字来看像是在非分页内存中发生了缺页错误。
不是很明白,于是用WinDbg调试,在驱动卸载函数中调用IoDeleteSymbolicLink出了问题。IoDeleteSymbolicLink只有一个参数,于是原因可以锁定到这个符号链接上面。于是将鼠标移到UNICODE_STRING变量上,提示Buffer为“……memory read error at address 0x…&#[......]

继续阅读

PAGED_CODE()

2011年2月25日 2 条评论

PAGED_CODE这个宏可以确保调用线程运行在一个允许分页的足够低IRQL级别。
参数:无
返回值:无
注释:如果IRQL > APC_LEVEL,则PAGED_CODE()会对系统产生一个断言。
对这个宏的调用必须放在一个包含有可以使用分页内存的代码或者访问分页内存的代码的驱动例程的开始位置。
PAGED_CODE这个宏仅仅检测这个宏所在位置的IRQL级别。如果在这个宏之后提升IRQL级别,PAGED_CODE将无法检测出之后的IRQL级别。当IRQL被不适当的提升的时候驱动程序员必须[......]

继续阅读

分类: Windows驱动开发 标签: , ,