Debuggen von DDI-Compliancefehlern – DRIVER_VERIFIER_DETECTED_VIOLATION (C4): 0x20002 – 0x20022
Wenn Sie die Option DDI-Konformitätsüberprüfung ausgewählt haben und die Treiberüberprüfung erkennt, dass der Treiber gegen eine der DDI-Complianceregeln verstößt, generiert Driver VerifierFehlerüberprüfung 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (wobei Parameter 1 dem Bezeichner der spezifischen Konformitätsregel entspricht).
Die DDI-Complianceregeln stellen sicher, dass ein Treiber ordnungsgemäß mit dem Windows-Betriebssystemkernkern interagiert. Mit den Regeln wird beispielsweise überprüft, ob Ihr Treiber Funktionsaufrufe am erforderlichen IRQL für die Funktion durchführt oder dass der Treiber Drehsperren ordnungsgemäß abruft und freigibt. In diesem Abschnitt werden einige Beispielstrategien zum Debuggen dieser Verstöße beschrieben.
Debuggen von DDI-Complianceüberprüfungsverletzungen
- Verwenden sie !analyze, um Informationen zur Fehlerüberprüfung anzuzeigen.
- Verwenden sie den Erweiterungsbefehl !ruleinfo.
- Verwenden Sie den Befehl !analyze –v, um den Speicherort der Verletzung im Quellcode zu identifizieren.
- Beheben der Ursache der DDI-Complianceverletzung
Verwenden sie !analyze, um Informationen zur Fehlerüberprüfung anzuzeigen.
Wie bei jeder Fehlerprüfung, die auftritt, besteht der beste erste Schritt darin, den Befehl !analyze -v auszuführen, sobald Sie die Kontrolle über den Debugger haben.
*******************************************************************************
* *
* 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
Wenn driver verifier einen Verstoß gegen die DDI-Konformitätsüberprüfung abfängt , werden Informationen über die Verletzung in der !analyze-Ausgabe bereitgestellt.
In diesem Beispiel 0xC4 die Fehlerüberprüfung: DRIVER_VERIFIER_DETECTED_VIOLATION den Parameter 1 (Arg1)-Wert 0x20004 aufweist, der angibt, dass der Treiber gegen die IrqlExAllocatePool-Konformitätsregel verstoßen hat.
Die !analyze-Ausgabe enthält die folgenden Informationen:
DV_VIOLATED_CONDITION: Dieses Feld enthält eine Beschreibung dessen, was die Regelverletzung verursacht hat. In diesem Beispiel wurde gegen die Bedingung verstoßen, dass ein Treiber versucht hat, Arbeitsspeicher auf einer sehr hohen IRQL-Ebene zuzuweisen, oder versucht hat, ausgelagerten Poolspeicher bei DISPATCH_LEVEL zuzuweisen. Dies kann z. B. ein Treiber sein, der versucht hat, ExAllocatePoolWithTagPriority in einer Interrupt Service Routine (ISR) aufzurufen, oder ein Treiber, der versucht hat, ausgelagerten Poolspeicher zuzuweisen, während eine Drehsperre gedrückt wurde.
DV_MSDN_LINK: In WinDBG ist dies ein Livelink, der dazu führt, dass der Debugger die MSDN-Seite mit weiteren Informationen zur IrqlExAllocatePool-Regel öffnet.
DV_RULE_INFO: In WinDBG ist dies ein Livelink, der Informationen zu dieser Regel aus der Hilfe zeigt, die im Debugger verfügbar ist.
Verwenden sie den Erweiterungsbefehl !ruleinfo.
Das Feld DV_RULE_INFO: der !analyze-Ausgabe zeigt den Befehl an, mit dem Sie weitere Informationen zu dieser Regelverletzung finden können. In diesem Beispiel können Sie den Befehl !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
Verwenden Sie den Befehl !analyze-v, um den Speicherort der Verletzung im Quellcode zu identifizieren.
Wenn dieser Verstoß abgefangen wird, überprüft Driver Verifier das System sofort. Die !analyze-Ausgabe zeigt den aktuellen IRQL, den aktuellen Stapel, den Punkt an, an dem der Aufruf zum Zuweisen von Arbeitsspeicher erfolgt ist, und wenn Quellcode aktiviert ist, zeigt die Ausgabe !analyze –v (für ausführlich) auch die Quelldatei und die Zeilennummer an, an der die Zuordnungsanforderung gestellt wurde:
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
Beheben der Ursache der DDI-Complianceverletzung
Das Beheben dieser Fehlerüberprüfungen mit Arg1-Werten im Bereich 0x00020000 bis 0x00020022 besteht in der Regel darin, zu überprüfen, ob der Treiber die in der entsprechenden Dokumentation beschriebenen API- und DDI-Nutzungsbedingungen erfüllt.
Im hier verwendeten Beispiel (0x20004) verstößt eine Speicherzuordnung jeglicher Art in der ISR gegen die IRQL-Regeln, die für die ExAllocatePoolWithTagPriority-Routine festgelegt wurden.
Im Allgemeinen sollten Sie die Dokumentation zur Routine lesen, um Informationen zu IRQL und der ordnungsgemäßen Verwendung zu finden. Überprüfen Sie die spezifischen DDI-Konformitätsregeln , die die Funktion testen. In diesem Fall lautet die Regel IrqlExAllocatePool.
Verwenden Sie static Driver Verifier , um den Quellcode Ihres Treibers mit den gleichen Regeln zu analysieren. Static Driver Verifier ist ein Tool, das den Quellcode des Windows-Treibers scannt und mögliche Probleme meldet, indem es die Übung verschiedener Codepfade simuliert. Static Driver Verifier ist ein hervorragendes Hilfsprogramm zur Entwicklungszeit, um diese Art von Problemen zu identifizieren.