共用方式為


錯誤檢查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) 太高。 可能的原因如下:

  • 在或更新版本執行時,取值錯誤的指標(例如 NULL 或釋放指標),DISPATCH_LEVEL。

  • 在或更新版本存取可分頁數據DISPATCH_LEVEL。

  • 在或更新版本執行可分頁程式代碼DISPATCH_LEVEL。

如果可以識別負責錯誤的驅動程式,則會在藍色螢幕上列印其名稱,並儲存在位於KiBugCheckDriver位置 PUNICODE_STRING的記憶體中。 您可以使用 dx (顯示除錯程式物件模型表示式)、除錯程式命令來顯示此專案:dx KiBugCheckDriver

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

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

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

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

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

如需 Windows IRQL 的詳細資訊,請參閱 Windows Internals 7th Edition 第 1 部分,by Pavel Yosifovich、Mark E. Russinovich、David A. 所羅門和 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 命令將內容設定為提供的位址。

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

在調試程式中,執行 !irql 命令,在調試程式中斷之前,在目標計算機上顯示處理器 IRQL 的相關信息。 例如:

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

在這類錯誤檢查的大多數案例中,問題不是 IRQL 層級,而是要存取的記憶體。

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

使用 ln (list nearest symbols) 搭配參數 4 來查看所呼叫之函式的名稱。 此外, 請檢查 !analyze 輸出,以查看是否已識別出錯誤碼。

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

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

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

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

驅動程式驗證器

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

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

備註

如果您尚未準備好使用 Windows 調試程式來處理此問題,您可以使用一些基本的疑難解答技術。

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

  • 如果在錯誤檢查訊息中識別驅動程式,請停用驅動程式,或向製造商檢查驅動程式更新。

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

如需其他一般疑難解答資訊,請參閱 分析錯誤檢查藍屏幕數據