Depurando bugs de conformidade de DDI – DRIVER_VERIFIER_DETECTED_VIOLATION (C4): 0x20002 – 0x20022
Quando você tem a opção de verificação de conformidade DDI selecionada e o Verificador de Driver detecta que o driver viola uma das regras de conformidade da DDI, o Verificador de Driver gera 0xC4 de Verificação de Bugs: DRIVER_VERIFIER_DETECTED_VIOLATION (com o Parâmetro 1 igual ao identificador da regra de conformidade específica).
As regras de conformidade de DDI garantem que um driver interaja corretamente com o kernel do sistema operacional Windows. Por exemplo, as regras verificam se o driver faz chamadas de função no IRQL necessário para a função ou se o driver adquire corretamente e libera bloqueios de rotação. Esta seção descreve algumas estratégias de exemplo para depurar essas violações.
Depurando violações de verificação de conformidade de DDI
- Use !analyze para exibir informações sobre o bug marcar
- Usar o comando !ruleinfo extension
- Use o comando !analyze –v para identificar o local da violação no código-fonte
- Corrigindo a causa da violação de conformidade da DDI
Use !analyze para exibir informações sobre o bug marcar
Assim como acontece com qualquer marcar de bug que ocorra, depois que você tiver o controle do depurador, a melhor primeira etapa é executar o 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
Sempre que o Verificador de Driver capturar uma violação de verificação de conformidade da DDI , as informações sobre a violação serão fornecidas na saída !analyze .
Neste exemplo, a Verificação de Bugs 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION tem um valor de parâmetro 1 (Arg1) de 0x20004, o que indica que o driver violou a regra de conformidade IrqlExAllocatePool .
A saída !analyze inclui as seguintes informações:
DV_VIOLATED_CONDITION: Esse campo fornece uma descrição do que causou a violação da regra. Neste exemplo, a condição violada foi que um driver tentou alocar memória em um nível IRQL muito alto ou tentou alocar memória de pool de páginas em DISPATCH_LEVEL. Por exemplo, esse pode ter sido um driver que estava tentando chamar ExAllocatePoolWithTagPriority em uma ISR (Rotina de Serviço de Interrupção) ou um driver que tentou alocar memória de pool de páginas enquanto segurava um bloqueio de rotação.
DV_MSDN_LINK: No WinDBG, esse é um link dinâmico que faz com que o depurador abra a página MSDN mostrando mais informações sobre a regra IrqlExAllocatePool .
DV_RULE_INFO: No WinDBG, este é um link ao vivo que mostrará informações sobre essa regra da ajuda disponível no depurador.
Usar o comando !ruleinfo extension
O campo DV_RULE_INFO: da saída !analyze mostra o comando que você pode usar para encontrar mais informações sobre essa violação de regra. Neste exemplo, você pode usar o 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
Use o comando !analyze-v para identificar o local da violação no código-fonte
Quando essa violação for capturada, o Verificador de Driver bugará marcar sistema imediatamente. A saída !analyze mostrará o IRQL atual, a pilha atual, o ponto em que a chamada para alocar memória foi feita e, se o código-fonte habilitado, a saída !analyze –v (para verbose) também mostrará o arquivo de origem e o número de linha em que a solicitação de alocação foi feita:
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
Corrigindo a causa da violação de conformidade da DDI
Corrigir essas verificações de bug que têm valores Arg1 no intervalo 0x00020000 para 0x00020022, geralmente consiste em verificar se o driver atende às condições de uso da API e da DDI descritas na documentação correspondente.
No exemplo que usamos aqui (0x20004), uma alocação de memória de qualquer tipo no ISR viola as regras IRQL definidas para a rotina ExAllocatePoolWithTagPriority .
Em geral, você deve examinar a documentação sobre a rotina para obter informações sobre IRQL e uso adequado. Examine as Regras de Conformidade de DDI específicas que testam a função. Nesse caso, a regra é IrqlExAllocatePool.
Use o Verificador de Driver Estático para analisar o código-fonte do driver, usando as mesmas regras. O Verificador de Driver Estático é uma ferramenta que verifica o código-fonte do driver do Windows e relata possíveis problemas simulando o exercício de vários caminhos de código. O Verificador de Driver Estático é um excelente utilitário de tempo de desenvolvimento para ajudar a identificar esses tipos de problemas.
Tópicos relacionados
Verificação de conformidade de DDI
Verificador de Driver Estático
0xC4 de Verificação de Bugs: DRIVER_VERIFIER_DETECTED_VIOLATION