錯誤檢查0xD1:DRIVER_IRQL_NOT_LESS_OR_EQUAL

DRIVER_IRQL_NOT_LESS_OR_EQUAL錯誤檢查的值為 0x000000D1。 這表示核心模式驅動程式嘗試在進程 IRQL 太高時存取可分頁記憶體。

重要

本文適用于程式設計人員。 如果您是在使用電腦時收到藍色螢幕錯誤碼的客戶,請參閱 針對藍色畫面錯誤進行疑難排解

DRIVER_IRQL_NOT_LESS_OR_EQUAL參數

參數 描述

1

參考的記憶體。

2

參考時 IRQL。

3

  • 0 - 讀取
  • 1 - 寫入
  • 2 - 執行
  • 8 - 執行

4

參考記憶體的位址。 使用ln (列出此位址上最接近的符號) ,以查看函式的名稱。

原因

若要判斷原因,需要 Windows 偵錯工具、程式設計體驗,以及錯誤模組原始程式碼的存取權。

一般而言,當發生此錯誤時,驅動程式嘗試存取可分頁 (的位址,或在中斷要求層級 (IRQL) 太高時,) 完全無效。 可能的原因如下:

  • 在等於或高於 DISPATCH_LEVEL 的情況下執行時,對錯誤指標 (例如 NULL 或已釋放的指標) 取值。

  • 在等於或高於 DISPATCH_LEVEL 的情況下存取可分頁資料。

  • 在等於或高於 DISPATCH_LEVEL 的情況下執行可分頁程式碼。

如果可以識別負責錯誤的驅動程式,則會在藍色畫面上列印其名稱,並儲存在 kiBugCheckDriver位置 (PUNICODE_STRING) 記憶體中。 您可以使用dx (顯示偵錯工具物件模型運算式) ,這是偵錯工具命令,以顯示下列專案:dx KiBugCheckDriver

此錯誤檢查通常是由使用不正確記憶體位址的驅動程式所造成。

分頁錯誤的可能原因包括下列事件:

  • 函式已標示為可分頁,並在提升許可權的 IRQL (執行,包括取得鎖定) 。

  • 函式呼叫是在另一個驅動程式中對函式進行,而且該驅動程式已卸載。

  • 函式是使用無效指標的函式指標來呼叫。

如需 Windows IRQL 的詳細資訊,請參閱 Windows Internals 7th Edition 第 1 部分,作者:Foundationl Yosifovich、Mark E. Russinovich、David A. Guy 和 Alex Ionescu。

解決方案

如果問題是由您正在開發的驅動程式所造成,請確定在錯誤檢查時執行的函式為:

  • 未標示為可分頁
  • 不會呼叫任何其他可分頁的內嵌函式。

!analyze偵錯工具延伸模組會顯示錯誤檢查的相關資訊,有助於判斷根本原因。 下列範例是 !analyze的輸出。

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: fffff808add27150, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff808adc386a6, address which referenced memory

如果可以識別負責錯誤的驅動程式,則會在藍色畫面上列印其名稱,並儲存在 kiBugCheckDriver位置 (PUNICODE_STRING) 記憶體中。 您可以使用dx (顯示偵錯工具物件模型運算式) ,這是偵錯工具命令,以顯示下列專案: dx KiBugCheckDriver

0: kd> dx KiBugCheckDriver
KiBugCheckDriver                 : 0xffffc6092de892c8 : "Wdf01000.sys" [Type: _UNICODE_STRING *]

如果傾印檔案中有陷阱框架可用,請使用 .trap 命令將內容設定為提供的位址。

若要開始偵錯這種類型的錯誤檢查,請使用kkbkckdkpkPkv (顯示堆疊回溯) 命令來檢查堆疊追蹤。

在偵錯工具中,執行 !irql 命令,在偵錯工具中斷之前,在目的電腦上顯示處理器 IRQL 的相關資訊。 例如:

0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

在這類錯誤檢查的大部分情況下,問題不是 IRQL 層級,而是要存取的記憶體。

由於這個錯誤檢查通常是由使用不正確記憶體位址的驅動程式所造成,因此請使用參數 1、3 和 4 進一步調查。

搭配參數 4 使用ln (清單最接近的符號) ,以查看所呼叫函式的名稱。 另請檢查 !analyze 輸出,以查看是否已識別錯誤碼。

使用參數 1 位址上的 !pool 來查看它是否為分頁集區。 使用 !address 和進階 的 !pte 命令,深入瞭解此記憶體區域。

使用 顯示記憶體 命令來檢查參數 1 中命令中參考的記憶體。

使用uubuu (unassemble) 命令來查看參考參數 4 中記憶體的位址中的程式碼。

使用 命令 lm t n 來列出記憶體中載入的模組。 使用 !memusage 並檢查系統記憶體的一般狀態。

驅動程式驗證器

驅動程式驗證器是即時執行以檢查驅動程式行為的工具。 例如,驅動程式驗證器會檢查記憶體資源的使用方式,例如記憶體集區。 如果它識別驅動程式程式碼執行中的錯誤,它會主動建立例外狀況,以允許進一步檢查該部分的驅動程式程式碼。 驅動程式驗證器管理員內建于 Windows 中,且適用于所有 Windows 電腦。

若要啟動驅動程式驗證器管理員,請在命令提示字元中輸入 驗證程式 。 您可以設定要驗證的驅動程式。 驗證驅動程式的程式碼會在執行時增加額外負荷,因此請嘗試驗證可能最少的驅動程式數目。 如需詳細資訊,請參閱 驅動程式驗證器

備註

如果您尚未配備使用 Windows 偵錯工具來處理此問題,您可以使用一些基本的疑難排解技術。

  • 檢查系統登入事件檢視器是否有其他錯誤訊息,以協助識別造成此錯誤檢查的裝置或驅動程式。

  • 如果在錯誤檢查訊息中找出某個驅動程式,請停用驅動程式或洽詢製造商是否有驅動程式更新。

  • 確認已安裝的任何新硬體都與已安裝的 Windows 版本相容。 例如,您可以在Windows 10 規格取得必要硬體的相關資訊。

如需其他一般疑難排解資訊,請參閱 藍色畫面資料