IRQL是Interrupt ReQuest Level,中斷請(qǐng)求級(jí)別。一個(gè)由windows虛擬出來的概念,劃分在windows下中斷的優(yōu)先級(jí),這里中斷包括了硬中斷和軟中斷,硬中斷是由硬件產(chǎn)生,而軟中斷則是完全虛擬出來的。
處理器在一個(gè)IRQL上執(zhí)行線程代碼。IRQL是幫助決定線程如何被中斷的。在同一處理器上,線程只能被更高級(jí)別IRQL的線程能中斷。每個(gè)處理器都有自己的中斷IRQL。
我們?cè)谡{(diào)用NDIS API時(shí),在DDK幫助文檔中都有該API函數(shù)的所在級(jí)別。
PASSIVE_LEVEL IRQL最低級(jí)別,沒有被屏蔽的中斷,在這個(gè)級(jí)別上,線程執(zhí)行用戶模式,可以訪問分頁內(nèi)存。
APC_LEVEL 在這個(gè)級(jí)別上,只有APC級(jí)別的中斷被屏蔽,可以訪問分頁內(nèi)存。當(dāng)有APC發(fā)生時(shí),處理器提升到APC級(jí)別,這樣,就屏蔽掉其它APC,為了和APC執(zhí)行一些同步,驅(qū)動(dòng)程序可以手動(dòng)提升到這個(gè)級(jí)別。比如,如果提升到這個(gè)級(jí)別,APC就不能調(diào)用。在這個(gè)級(jí)別,APC被禁止了,導(dǎo)致禁止一些I/O完成APC,所以有一些API不能調(diào)用。
DISPATCH_LEVEL 這個(gè)級(jí)別,DPC 和更低的中斷被屏蔽,不能訪問分頁內(nèi)存,所有的被訪問的內(nèi)存不能分頁。因?yàn)橹荒芴幚矸欠猪搩?nèi)存,所以在這個(gè)級(jí)別,能夠訪問的Api大大減少。
DIRQL (Device IRQL)
一般的,更高級(jí)的驅(qū)動(dòng)在這個(gè)級(jí)別上不處理IRQL,但是幾乎所有的中斷被屏蔽,這實(shí)際上是IRQL的一個(gè)范圍,這是一個(gè)決定某個(gè)驅(qū)動(dòng)有更高的優(yōu)先級(jí)的方法。