Sdílet prostřednictvím


Ladění chyb dodržování předpisů DDI – DRIVER_VERIFIER_DETECTED_VIOLATION (C4): 0x20002 – 0x20022

Pokud máte vybranou možnost kontroly dodržování předpisů DDI a ovladač Verifier zjistí, že ovladač porušuje jedno z pravidel dodržování předpisů DDI, nástroj Driver Verifier vygeneruje kontrolu chyb 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (s parametrem 1 se rovná identifikátoru konkrétního pravidla dodržování předpisů).

Pravidla dodržování předpisů DDI zajišťují, že ovladač správně pracuje s jádrem operačního systému Windows. Pravidla například ověřují, že ovladač volá funkce na požadované úrovni IRQL pro funkci, nebo že ovladač správně získá a uvolní spinlocky. Tato část popisuje některé ukázkové strategie ladění těchto porušení.

Ladění porušení kontroly dodržování předpisů DDI

Použití !analyze k zobrazení informací o kontrole chyb

Jakmile máte kontrolu nad debuggerem, stejně jako u všech kontrol chyb, je nejlepším prvním krokem spustit příkaz !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

Kdykoli nástroj Driver Verifier zachytí porušení kontroly dodržování předpisů DDI , informace o porušení se zobrazí ve výstupu !analyze .

V tomto příkladu má kontrola chyb 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION hodnotu parametru 1 (Arg1) 0x20004, která značí, že ovladač porušil pravidlo dodržování IrqlExAllocatePool.

Výstup !analyze obsahuje následující informace:

DV_VIOLATED_CONDITION: Toto pole obsahuje popis toho, co způsobilo porušení pravidla. V tomto příkladu došlo k porušení podmínky, že se ovladač pokusil přidělit paměť na velmi vysoké úrovni IRQL, nebo že se pokusil přidělit stránkovanou paměť na úrovni DISPATCH_LEVEL. Může to být například ovladač, který se pokoušel volat ExAllocatePoolWithTagPriority v rutině služby přerušení (ISR) nebo ovladač, který se pokusil přidělit stránkovaný fond paměti při podržení zámku spinu.

DV_MSDN_LINK: Ve WinDBG se jedná o živý odkaz, který způsobí, že ladicí program otevře stránku MSDN zobrazující další informace o pravidle IrqlExAllocatePool .

DV_RULE_INFO: Ve WinDBG se jedná o živý odkaz, který zobrazí informace o tomto pravidlu z nápovědy dostupné v ladicím programu.

Použití příkazu rozšíření !ruleinfo

Pole DV_RULE_INFO: Pole !analyze výstupu ukazuje příkaz, který můžete použít k vyhledání dalších informací o porušení tohoto pravidla. V tomto příkladu můžete použít příkaz :!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

Pomocí příkazu !analyze-v identifikujte umístění porušení ve zdrojovém kódu.

Když dojde k zachycení tohoto porušení, ovladač Verifier okamžitě zkontroluje systém. Výstup !analyze zobrazí aktuální úroveň IRQL, aktuální stav zásobníku, bod, kde bylo provedeno volání k přidělení paměti, a pokud je povolen zdrojový kód, výstup !analyze –v (pro podrobné informace) zobrazí také zdrojový soubor a číslo řádku, kde byl proveden požadavek na přidělení paměti.

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

Oprava příčiny porušení předpisů DDI

Oprava těchto kontrol chyb, které obsahují hodnoty Arg1 v rozsahu 0x00020000 pro 0x00020022, se obvykle skládá z ověření, že ovladač splňuje podmínky použití rozhraní API a DDI popsané v příslušné dokumentaci.

V příkladu, který jsme zde použili (0x20004), přidělení paměti jakéhokoli druhu v ISR porušuje pravidla IRQL stanovená pro rutinu ExAllocatePoolWithTagPriority.

Obecně byste si měli projít dokumentaci o rutině, kde najdete informace o IRQL a správném použití. Zkontrolujte konkrétní pravidla dodržování předpisů DDI, která funkci testují. V tomto případě je pravidlo IrqlExAllocatePool.

Pomocí nástroje Static Driver Verifier můžete analyzovat zdrojový kód ovladače pomocí stejných pravidel. Static Driver Verifier je nástroj, který kontroluje zdrojový kód ovladače systému Windows a hlásí možné problémy simulací průchodu různými cestami kódu. Static Driver Verifier je vynikající nástroj pro vývojový čas, který pomáhá identifikovat tyto druhy problémů.

Kontrola dodržování předpisů DDI

Pravidla dodržování předpisů DDI

Static Driver Verifier

Kontrola chyby 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION