雖然核心模式驅動程式被禁止在高 IRQL 或持有自旋鎖時存取可分頁記憶體,但如果頁面實際上尚未從工作集刪除並分頁到磁碟,則可能不會被察覺到。
啟用強制 IRQL 檢查時,驅動程式驗證器會針對系統記憶體的使用提供極大的壓力。 每當正在驗證的驅動程式要求旋轉鎖、呼叫KeSynchronizeExecution或將 IRQL 提升至 DISPATCH_LEVEL 或更高時,所有系統的可分頁集區、程式碼和數據(包括驅動程式的可分頁程式碼和數據)都會從工作集中移除。 如果驅動程式嘗試存取任何此記憶體,驅動程式驗證器會發出錯誤檢查。
從 Windows Vista 開始,此選項也會讓驅動程式驗證器偵測特定同步處理物件是否包含在可分頁記憶體中。 無法分頁處理這些同步處理對象,因為作業系統核心正在以提高的IRQL存取它們。 驅動程式驗證器可以偵測可分頁 的 KTIMER、PRKMUTEX、PKSPIN_LOCK、PRKEVENT、PKSPIN_LOCK、PRKSEMAPHORE、PERESOURCE 和 FAST_MUTEX 結構。
記憶體使用量的壓力不會直接影響未選取進行驗證的驅動程式。 當未選取用於驗證的驅動程式引發 IRQL 時,它不會觸發修剪動作。 不過,當正在驗證的驅動程式引發 IRQL 時,驅動程式驗證器會修剪未驗證的驅動程式可以使用的頁面。 因此,當此選項處於啟用狀態時,可能會偶爾發現未經驗證的駕駛者所犯的錯誤。
監控 IRQL 提升和自旋鎖
可以監視所驗證驅動程式對 KeSynchronizeExecution 引發、微調鎖定和呼叫的 IRQL 數目。 您也可以監視驅動程式驗證器已從工作集修剪可分頁記憶體的次數。 驅動程式驗證器管理員、Verifier.exe 命令行或記錄檔可以顯示這些統計數據。 如需詳細資訊 ,請參閱監視全域計數器 。
核心調試程式擴充 功能 !verifier 也可用來監視這些統計數據。 它會顯示與驅動程式驗證器管理員類似的資訊。 在 Windows XP 和更新版本中, !verifier 0x8 擴充功能會顯示驅動程式正在驗證的最新 IRQL 變更記錄。 如需調試程式擴充功能的相關信息,請參閱 Windows 偵錯。
在 DISPATCH_LEVEL 或以上呼叫 KeEnterCriticalRegion 或 KeLeaveCriticalRegion
KeEnterCriticalRegion 和 KeLeaveCriticalRegion 是 API,可用來同步處理驅動程式程式代碼的重要序列執行,以及傳遞一般核心異步過程調用 (APC)。 在 IRQL = DISPATCH_LEVEL 或更高時,無法呼叫 KeEnterCriticalRegion 和 KeLeaveCriticalRegion API。 在 DISPATCH_LEVEL 或以上層級呼叫 KeEnterCriticalRegion 或 KeLeaveCriticalRegion 可能會導致系統掛起或記憶體損毀。
從 Windows 7 開始,如果啟用了強制 IRQL 檢查選項,驅動程式驗證器會在 DISPATCH_LEVEL 或更高層級偵測對這些 API 的呼叫。
啟用此選項
您可以使用驅動程式驗證器管理員或 Verifier.exe 命令行,為一或多個驅動程式啟用強制 IRQL 檢查功能。 如需詳細資訊,請參閱 選取驅動程式驗證器選項。
在命令行
在命令行中,強制 IRQL 檢查選項是由 位 1 (0x2) 表示。 若要啟用強制 IRQL 檢查,請使用旗標值0x2或將0x2新增至旗標值。 例如:
verifier /flags 0x2 /driver MyDriver.sys
下一次開機之後,此功能將會處於作用中狀態。
您也可以將 /volatile 參數新增至 命令,以啟動和停用強制 IRQL 檢查,而不重新啟動計算機。 例如:
verifier /volatile /flags 0x2 /adddriver MyDriver.sys
此設定會立即生效,但會在您關閉或重新啟動電腦時遺失。 如需詳細資訊,請參閱 使用動態設定。
強制 IRQL 檢查功能也包含在標準設定中。 例如:
verifier /standard /driver MyDriver.sys
使用驅動程式驗證器管理員
- 啟動驅動程式驗證器管理員。 在命令提示字元視窗中輸入 驗證程式。
- 選取 [建立自定義設定] (適用於程式代碼開發人員), 然後按 [ 下一步]。
- 選擇 從完整清單中選取個別設定。
- 選取 [檢查] 強制 IRQL 檢查。
強制 IRQL 檢查功能也包含在標準設定中。 若要使用此功能,請在 [驅動程序驗證器管理員] 中,按兩下 [建立標準設定]。