IRQL是Interrupt ReQuest Level,中斷請求級別。一個由windows虛擬出來的概念,劃分在windows下中斷的優先權,這裡中斷包括了硬中斷和軟中斷,硬中斷是由硬體產生,而軟中斷則是完全虛擬出來的。
處理器在一個IRQL上執行執行緒代碼。IRQL是幫助決定執行緒如何被中斷的。在同一處理器上,執行緒只能被更高級別IRQL的執行緒能中斷。每個處理器都有自己的中斷IRQL。
我們在調用NDIS API時,在DDK幫助文檔中都有該API函式的所在級別。
PASSIVE_LEVEL
IRQL最低級別,沒有被禁止的中斷,在這個級別上,執行緒執行用戶模式,可以訪問分頁記憶體。
APC_LEVEL
在這個級別上,只有APC級別的中斷被禁止,可以訪問分頁記憶體。當有APC發生時,處理器提升到APC級別,這樣,就禁止掉其它APC,為了和APC執行一些同步,驅動程式可以手動提升到這個級別。比如,如果提升到這個級別,APC就不能調用。在這個級別,APC被禁止了,導致禁止一些I/O完成APC,所以有一些API不能調用。
DISPATCH_LEVEL
這個級別,DPC 和更低的中斷被禁止,不能訪問分頁記憶體,所有的被訪問的記憶體不能分頁。因為只能處理非分頁記憶體,所以在這個級別,能夠訪問的Api大大減少。
DIRQL (Device IRQL)
一般的,更高級的驅動在這個級別上不處理IRQL,但是幾乎所有的中斷被禁止,這實際上是IRQL的一個範圍,這是一個決定某個驅動有更高的優先權的方法。