參考:http://blog.csdn.net/broadview2006/article/details/4171397
里面的內容出自<Windows內核情景分析>
簡而言之,Windows並沒有將運行在Ring 0的代碼全部視為內核,而是區分為Kernel和Executive,Executive可以理解為“管理層”的意思,解釋為“執行體”不合理。
其中,Kernel是狹義的內核,里面的代碼包括用到的數據,都是常駐在物理內存中的,不支持分頁機制。
而除此之外的代碼和數據,是支持分頁機制的,並且可以被交換到pagefile中,即並非總是在物理內存中的。
對於驅動來說,應該屬於后者,因此在驅動中的函數的頭部都會使用PAGED_CODE來判斷一下,
#define PAGED_CODE() PAGED_ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
#define PASSIVE_LEVEL 0 // Passive release level #define LOW_LEVEL 0 // Lowest interrupt level #define APC_LEVEL 1 // APC interrupt level #define DISPATCH_LEVEL 2 // Dispatcher level #define CMCI_LEVEL 5 // CMCI handler level #define PROFILE_LEVEL 27 // timer used for profiling. #define CLOCK1_LEVEL 28 // Interval clock 1 level - Not used on x86 #define CLOCK2_LEVEL 28 // Interval clock 2 level #define IPI_LEVEL 29 // Interprocessor interrupt level #define POWER_LEVEL 30 // Power failure level #define HIGH_LEVEL 31 // Highest interrupt level #define CLOCK_LEVEL (CLOCK2_LEVEL)
如果當前的中斷請求級別(IRQL)太高(DPC以上),那么很可能屬於Kernel部分,因此需要避免這種情況。