Debug di bug di conformità DDI - DRIVER_VERIFIER_DETECTED_VIOLATION (C4): 0x20002 - 0x20022
Quando si dispone dell'opzione di controllo della conformità DDI selezionata e Driver Verifier rileva che il driver viola una delle regole di conformità DDI, Driver Verifier genera controllo bug 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (con Parametro 1 uguale all'identificatore della regola di conformità specifica).
Le regole di conformità DDI garantiscono che un driver interagisca correttamente con il kernel del sistema operativo Windows. Ad esempio, le regole verificano che il driver effettua chiamate di funzione alla funzione richiesta IRQL per la funzione o che il driver acquisisce e rilascia correttamente i blocchi di rotazione. Questa sezione descrive alcune strategie di esempio per il debug di queste violazioni.
Debug delle violazioni del controllo della conformità DDI
- Usare !analizza per visualizzare informazioni sul controllo dei bug
- Usare il comando di estensione !ruleinfo
- Usare il comando !analyze -v per identificare la posizione della violazione nel codice sorgente
- Correzione della causa della violazione della conformità DDI
Usare !analizza per visualizzare informazioni sul controllo dei bug
Come per qualsiasi verifica di bug che si verifica, una volta ottenuto il controllo del debugger, il primo passaggio migliore consiste nell'eseguire il comando !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
Ogni volta che il verificatore driver rileva una violazione del controllo della conformità DDI , le informazioni sulla violazione verranno fornite nell'output !analysis .
In questo esempio, Controllo bug 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION ha un valore di parametro 1 (Arg1) di 0x20004, che indica che il driver ha violato la regola di conformità IrqlExAllocatePool .
L'output !analyze include le informazioni seguenti:
DV_VIOLATED_CONDITION: Questo campo fornisce una descrizione di ciò che ha causato la violazione della regola. In questo esempio, la condizione violata è che un driver ha tentato di allocare memoria a un livello IRQL molto elevato o ha tentato di allocare memoria del pool in pagina in DISPATCH_LEVEL. Ad esempio, potrebbe essere stato un driver che tentava di chiamare ExAllocatePoolWithTagPriority in una routine del servizio di interruzione (ISR) o un driver che tentava di allocare memoria del pool impaginato mantenendo un blocco spin.
DV_MSDN_LINK: In WinDBG si tratta di un collegamento live che causa l'apertura della pagina MSDN del debugger che mostra altre informazioni sulla regola IrqlExAllocatePool .
DV_RULE_INFO: In WinDBG si tratta di un collegamento live che mostrerà informazioni su questa regola dalla Guida disponibile nel debugger.
Usare il comando di estensione !ruleinfo
Il DV_RULE_INFO: campo dell'output !analysis mostra il comando che è possibile usare per trovare altre informazioni su questa violazione della regola. Per questo esempio, è possibile usare il comando : !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
Usare il comando !analysis-v per identificare la posizione della violazione nel codice sorgente
Quando questa violazione viene rilevata, il verificatore driver verificherà immediatamente il sistema. L'output !analysis mostrerà l'output irQL corrente, lo stack corrente, il punto in cui è stata eseguita la chiamata alla memoria allocata e se è stato eseguito il codice sorgente L'output ! analysis -v (per verbose) mostrerà anche il file di origine e il numero di riga in cui è stata effettuata la richiesta di allocazione:
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
Correzione della causa della violazione della conformità DDI
Correzione di questi controlli di bug con valori Arg1 nell'intervallo 0x00020000 da 0x00020022, in genere consiste nel verificare che il driver soddisfi le condizioni di utilizzo api e DDI descritte nella documentazione corrispondente.
Nell'esempio usato qui (0x20004), un'allocazione di memoria di qualsiasi ordinamento nell'ISR viola le regole IRQL impostate per la routine ExAllocatePoolWithTagPriority .
In generale, è necessario esaminare la documentazione relativa alla routine per informazioni su IRQL e sull'utilizzo appropriato. Esaminare le regole di conformità DDI specifiche che testano la funzione. In questo caso, la regola è IrqlExAllocatePool.
Usare Il verificatore driver statico per analizzare il codice sorgente del driver usando le stesse regole. Static Driver Verifier è uno strumento che analizza il codice sorgente del driver Windows e segnala i possibili problemi simulando l'esercizio di vari percorsi di codice. Il verifica driver statico è un'eccellente utilità in fase di sviluppo per identificare questi tipi di problemi.