偵錯 NDIS/WiFi 逾時錯誤 - DRIVER_VERIFIER_DETECTED_VIOLATION (C4)
當您已選取 NDIS/WIFI 驗證 選項,且驅動程式驗證器偵測到驅動程式違反其中一個 NDIS/WiFi 逾時規則時, 驅動程式驗證程式 會產生 錯誤檢查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION (參數 1 等於特定 NDIS/WiFi 逾時規則的識別碼) 。
當驅動程式驗證器正在測試 NDIS/WIFI 逾時規則時,例如 NdisTimedOidComplete,驅動程式驗證器的輪詢機制預期在數個週期內來自迷你埠驅動程式的回應。 每個計時規則都已定義它自己的允許最大週期。 超過最大值時,驅動程式驗證器會產生錯誤檢查。 本節說明偵錯這些違規的一些範例策略。
偵錯 NDIS/WIFI 逾時錯誤
使用 !analyze 來顯示錯誤檢查的相關資訊
如同發生的任何錯誤檢查,一旦您擁有偵錯工具的控制權,最好的第一個步驟是執行 !analyze -v 命令。
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: 00092003, ID of the 'NdisTimedOidComplete' rule that was violated.
Arg2: 8521dd34, A pointer to the string describing the violated rule condition.
Arg3: 9c17b860, Address of internal rule state (second argument to !ruleinfo).
Arg4: 9c1f3480, Address of supplemental states (third argument to !ruleinfo).
在 !analyze -v 輸出的下一節中,違反規則的原因會顯示在 [DV_VIOLATED_CONDITION] 欄位中。 DV_MSDN_LINK區段也有助於提取此規則檔的連結。
偵錯詳細資料:
*** ERROR: Module load completed but symbols could not be loaded for NdisTimedOidComplete.sys
DV_VIOLATED_CONDITION: Timeout on completing an NDIS OID request.
DV_MSDN_LINK: https://learn.microsoft.com/windows-hardware/drivers/devtest/ndis-ndistimedoidcomplete
DRIVER_OBJECT: 98a87980
IMAGE_NAME: NdisTimedOidComplete.sys
DEBUG_FLR_IMAGE_TIMESTAMP: 5229c857
MODULE_NAME: NdisTimedOidComplete
FAULTING_MODULE: 9fee1000 NdisTimedOidComplete
在此分析輸出下,您可以按一下 [DV_RULE_INFO] 區段底下的連結,以取得其他規則描述。 針對規則的逾時類型,目前的堆疊可能不會包含相關資訊。
DV_RULE_INFO: 0x92003
BUGCHECK_STR: 0xc4_NdisTimedOidComplete_XDV
DEFAULT_BUCKET_ID: WIN8_DRIVER_FAULT
PROCESS_NAME: System
CURRENT_IRQL: 2
ANALYSIS_VERSION: 6.13.0016.1929 (debuggers(dbg).130725-1857) amd64fre
LAST_CONTROL_TRANSFER: from 80f87fd3 to 80f0ed14
STACK_TEXT:
8912380c 80f87fd3 00000003 e6c3476e 00000065 nt!RtlpBreakWithStatusInstruction
89123860 80f87aed 825a6138 89123c5c 89123cac nt!KiBugCheckDebugBreak+0x1f
89123c30 80f0d8d6 000000c4 00092003 8521dd34 nt!KeBugCheck2+0x676
89123c54 80f0d80d 000000c4 00092003 8521dd34 nt!KiBugCheck2+0xc6
89123c74 85211584 000000c4 00092003 8521dd34 nt!KeBugCheckEx+0x19
89123cac 85216d54 9c17b860 9c1f3480 9c17b8dc VerifierExt!SLIC_StatefulAbort+0x1a4
89123cd0 85216ffe 85220000 85215f5b 00000000 VerifierExt!Ndis_OnTimerExpire+0x234
89123cd8 85215f5b 00000000 80ecd56a 843d0c38 VerifierExt!CheckOnTimerExpire+0x26
89123ce0 80ecd56a 843d0c38 00000000 80ecd502 VerifierExt!XdvPassiveTimerRoutine+0x1d
89123d24 80eec133 882befd0 00000000 887debc0 nt!IopProcessWorkItem+0x68
89123d70 80ec1162 00000000 e6c342be 00000000 nt!ExpWorkerThread+0x14f
89123db0 80f23201 80eebfe4 00000000 00000000 nt!PspSystemThreadStartup+0x58
89123dbc 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x15
使用 !ruleinfo 擴充功能命令
DV_RULE_INFO:分析輸出的欄位會顯示命令的連結,可用來尋找此規則違規的詳細資訊。 在此範例中,如果您按一下連結,它會使用 RULE_ID (0x92003) Arg3 和 Arg 4 錯誤檢查值來執行 !ruleinfo 命令。
kd> !ruleinfo 0x92003 0xffffffff9c17b860 0xffffffff9c1f3480
RULE_ID: 0x92003
RULE_NAME: NdisTimedOidComplete
RULE_DESCRIPTION:
This rule verifies if an NDIS miniport driver completes an OID in time.
The OID is tracked (a.k.a., TRACKED_OBJECT). Use !ndiskd.oid .
MSDN_LINK: https://learn.microsoft.com/windows-hardware/drivers/devtest/ndis-ndistimedoidcomplete
CONTEXT: Miniport 0x86BD10E8
CURRENT_TIME (Timed Rules): 168 seconds
TRACKED_OBJECT: 0x86633804
LAST_CALL_STACK: 0x9C1F3480 + 0x10
RULE_STATE: 0x9C1F3480
識別違規的位置
在此範例中,迷你埠驅動程式 NdisTimedOidComplete.sys 已插入 其 MPOidRequest 函式中的睡眠週期。 我們可以按一下 !ruleinfo 輸出中的 [LAST_CALL_STACK] 連結來檢查。 這是驅動程式驗證器看到的最後一個呼叫堆疊,我們在逾時之前看到 NDIS 呼叫 ndisMInvokeOidRequest 。
kd> dps 0x9C1F3480 + 0x10
9c1f3490 850e1e37 ndis!ndisMInvokeOidRequest+0x16641
9c1f3494 850765c8 ndis!ndisMDoOidRequest+0x24a
9c1f3498 8507552a ndis!ndisQueueOidRequest+0x2fa
9c1f349c 8507372b ndis!ndisQuerySetMiniportEx+0xd9
9c1f34a0 85073646 ndis!ndisQuerySetMiniport+0x18
9c1f34a4 850dd9c8 ndis!ndisMDoMiniportOp+0x8c
9c1f34a8 850dd916 ndis!ndisMNotifyMachineName+0xe4
9c1f34ac 85104005 ndis!ndisMInitializeAdapter+0xad7
修正 NDIS WIFI 逾時違規的原因
當損毀傾印已針對計時規則產生時,有可能在損毀傾印時找到根本原因。 若要進一步偵錯,請考慮從 NdisKd 偵錯工具擴充功能命令開始,請參閱 NDIS 延伸模組 (Ndiskd.dll) 和 開始使用 NDISKD。 如果您的驅動程式已實作 ETW,您可能也需要查看 Windows (ETW 的事件追蹤) 記錄。 如果未啟用此規則,則此錯誤將本身顯示為使用者應用程式停止回應,或錯誤 檢查0x9F:最 差DRIVER_POWER_STATE_FAILURE。