ddk中的一些函数说明要在IRQL=PASSIVE_LEVEL下才能调用,请问这个IRQL=PASSIVE_LEVEL是什么意思?能说的具体点吗?

解决方案 »

  1.   

    IRQL是处理器中断请求级,级别低的代码可以被级别高的代码中断,在驱动程序里面一般容易混淆的是PASSIVE_LEVEL和DISPATCH_LEVEL,DISPATCH_LEVEL级要比PASSIVE_LEVEL级高,一般的用户模式程序执行在PASSIVE_LEVEL上,驱动程序有一些例程需要在PASSIVE_LEVEL上(比如DriverEntry、AddDevice等),有一些例程则是需要在DISPATCH_LEVEL上执行的,包括StartIo例程,DPC(推迟过程调用)例程等。为什么要采用这种中断请求级机制?我觉得主要是由于windows的内存管理,最典型的是在DISPATCH_LEVEL上访问分页内存将引起缺页故障(就是你再熟悉不过的蓝屏啦),这点要注意注意呀!如果一个函数说要在PASSIVE_LEVEL下才能调用,很可能是该函数中要用到分页内存,你要是楞让它在DISPATCH_LEVEL上调用,就会蓝屏的,小心啊我知道的大概也就这么多了,不知道对你有没有用
      

  2.   

    谢谢上面的朋友!那么具体说驱动里什么是在PASSIVE_LEVEL上呢?它是指某个驱动运行在PASSIVE_LEVEL上呢?还是指驱动里的某些部分运行在PASSIVE_LEVEL上呢?比如驱动里的中断接收是属于PASSIVE_LEVEL吗?
      

  3.   

    是指该函数在执行的时候具有PASSIVE_LEVEL的优先级,必须要比PASSIVE_LEVEL更高优先级的函数才能中断它的执行。DDK文档中对每个函数的优先级都有说明。