共用方式為


偵錯 DDI 合規性錯誤 - DRIVER_VERIFIER_DETECTED_VIOLATION (C4) :0x20002 - 0x20022

當您選取 [DDI 合規性檢查 ] 選項,且驅動程式驗證器偵測到驅動程式違反其中一個 DDI 合規性規則時, 驅動程式驗證程式 會產生 錯誤檢查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION 參數 1 等於特定合規性規則識別碼 () 。

DDI 合規性規則可確保驅動程式正確地與 Windows 作業系統核心互動。 例如,規則會確認您的驅動程式在函式的必要 IRQL 上呼叫函式,或驅動程式正確地取得並釋放微調鎖定。 本節說明偵錯這些違規的一些範例策略。

偵錯 DDI 合規性檢查違規

使用 !analyze 來顯示錯誤檢查的相關資訊

如同發生的任何錯誤檢查,一旦您擁有偵錯工具的控制權,最好的第一個步驟是執行 !analyze -v 命令。

*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
A device driver attempting to corrupt the system has been caught.  This is
because the driver was specified in the registry as being suspect (by the
administrator) and the kernel has enabled substantial checking of this driver.
If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will
be among the most commonly seen crashes.
Arguments:
Arg1: 00020004, ID of the 'IrqlExAllocatePool' rule that was violated.
Arg2: 8481c118, A pointer to the string describing the violated rule condition.
Arg3: 00000000, Reserved (unused).
Arg4: 00000000, Reserved (unused).

## Debugging Details:


DV_VIOLATED_CONDITION:  ExAllocatePoolWithTagPriority should only be called at IRQL <= DISPATCH_LEVEL.

DV_MSDN_LINK: https://go.microsoft.com/fwlink/p/?linkid=216021

DV_RULE_INFO: 0x20004

每當 驅動程式驗證器 攔截 DDI 合規性檢查 違規時,將會在 !analyze 輸出中提供違規的相關資訊。

在此範例中, 錯誤檢查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION 具有參數 1 (Arg1) 0x20004 值,這表示驅動程式違反 IrqlExAllocatePool 合規性規則。

!analyze輸出包含下列資訊:

DV_VIOLATED_CONDITION: 此欄位提供造成規則違規之原因的描述。 在此範例中,違反的條件是驅動程式嘗試在極高 IRQL 層級配置記憶體,或嘗試在DISPATCH_LEVEL配置分頁集區記憶體。 例如,這可能是嘗試在插斷服務常式中呼叫 ExAllocatePoolWithTagPriority 的驅動程式, (ISR) ,或嘗試在按住微調鎖定時配置分頁集區記憶體的驅動程式。

DV_MSDN_LINK: 在 WinDBG 中,這是一個即時連結,可讓偵錯工具開啟 MSDN 頁面,其中顯示 IrqlExAllocatePool 規則的詳細資訊。

DV_RULE_INFO: 在 WinDBG 中,這是即時連結,會從偵錯工具上可用的說明顯示此規則的相關資訊。

使用 !ruleinfo 擴充功能命令

DV_RULE_INFO:!analyze輸出的欄位會顯示可用來尋找此規則違規詳細資訊的命令。 在此範例中,您可以使用 命令: !ruleinfo 0x20004

kd> !ruleinfo 0x20004

RULE_ID: 0x20004

RULE_NAME: IrqlExAllocatePool

RULE_DESCRIPTION:
The IrqlExAllocatePool rule specifies that the driver calls:
ExAllocatePool,
ExAllocatePoolWithTag,
ExAllocatePoolWithQuota,
ExAllocatePoolWithQuotaTag and
ExAllocatePoolWithTagPriority
only when it is executing at IRQL <= DISPATCH_LEVEL. A caller
executing at DISPATCH_LEVEL must specify a NonPagedXxx value
for PoolType. A caller executing at IRQL <= APC_LEVEL can
specify any POOL_TYPE value.

MSDN_LINK: https://go.microsoft.com/fwlink/p/?linkid=216021

使用 !analyze-v 命令來識別原始程式碼中違規的位置

攔截到此違規時,驅動程式驗證程式會立即檢查系統。 !analyze輸出會顯示目前的 IRQL、目前堆疊、呼叫配置記憶體的位置,以及如果啟用原始程式碼啟用!analyze -v (以取得詳細資訊) 輸出也會顯示發出配置要求的來源檔案和行號:

CURRENT_IRQL:  10

ANALYSIS_VERSION: 6.13.0016.1929 (debuggers(dbg).130725-1857) amd64fre

LAST_CONTROL_TRANSFER:  from 80ff159d to 80f751f4

STACK_TEXT:  
82f9eaa4 81dda59d 00000003 86fab4b0 00000065 nt!RtlpBreakWithStatusInstruction
82f9eaf8 81dda0b7 82fa0138 82f9eef8 82f9ef40 nt!KiBugCheckDebugBreak+0x1f
82f9eecc 81d5cdc6 000000c4 00020004 85435118 nt!KeBugCheck2+0x676
82f9eef0 81d5ccfd 000000c4 00020004 85435118 nt!KiBugCheck2+0xc6
82f9ef10 8542cb4e 000000c4 00020004 85435118 nt!KeBugCheckEx+0x19
82f9ef30 85425ded ffffffff 85425e0d 82f9ef60 VerifierExt!SLIC_abort+0x40
82f9ef38 85425e0d 82f9ef60 8210c19e 00000080 VerifierExt!SLIC_ExAllocatePoolWithTagPriority_internal_entry_IrqlExAllocatePool+0x6f
82f9ef40 8210c19e 00000080 00000000 00000000 VerifierExt!ExAllocatePoolWithTagPriority_internal_wrapper+0x19
82f9ef60 826c9e16 00000000 00000000 00000000 nt!VerifierExAllocatePoolWithTag+0x24
82f9efa8 81d0726c 833cba80 8a4b9480 00000000 MyDriver!HandleISR+0x146
82f9efbc 81d071c1 833cba80 8a4b9480 000000b8 nt!KiInterruptMessageDispatch+0x12
82f9efe4 81d71f29 00000001 525b61ea 00000224 nt!KiCallInterruptServiceRoutine+0x6d
82f9efe8 00000000 525b61ea 00000224 00000000 nt!KiInterruptDispatch+0x49

STACK_COMMAND:  kb

FOLLOWUP_IP: 
MyDriver!HandleISR+0x140
826c9e10 ff154440699b    call    dword ptr [IrqlExAllocatePool_ExAllocatePoolWithTag!_imp__ExAllocatePoolWithTag (9b694044)]

FAULTING_SOURCE_LINE:  d:\drvsrc\mydriver\isrhandler.c

FAULTING_SOURCE_FILE:  d:\drvsrc\mydriver\isrhandler.c

FAULTING_SOURCE_LINE_NUMBER:  206

修正 DDI 合規性違規的原因

修正這些錯誤檢查,其中具有 Arg1 值的範圍0x00020000以0x00020022,通常由確認驅動程式符合對應檔中所述的 API 和 DDI 使用狀況所組成。

在此範例中,我們已使用 (0x20004) ,ISR 中任何排序的記憶體配置將會違反 ExAllocatePoolWithTagPriority 常式所設定的 IRQL 規則。

一般而言,您應該檢閱常式的相關檔,以取得 IRQL 和適當使用方式的相關資訊。 檢閱測試函式的特定 DDI 合規性規則 。 在此情況下,規則為 IrqlExAllocatePool

使用 靜態驅動程式驗證器 來分析驅動程式原始程式碼, (相同的規則) 。 靜態驅動程式驗證器是一種工具,可藉由模擬各種程式碼路徑的執行,掃描 Windows 驅動程式原始程式碼並報告可能的問題。 靜態驅動程式驗證器是絕佳的開發時間公用程式,可協助識別這類問題。

DDI 合規性檢查

DDI 合規性規則

靜態驅動程式驗證器

錯誤檢查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION