Partager via


Débogage des bogues de conformité DDI - DRIVER_VERIFIER_DETECTED_VIOLATION (C4) : 0x20002 - 0x20022

Lorsque l’option de vérification de la conformité DDI est sélectionnée et que le vérificateur de pilotes détecte que le pilote enfreint l’une des règles de conformité DDI, driver Verifier génère des 0xC4 de vérification de bogues : DRIVER_VERIFIER_DETECTED_VIOLATION (avec le paramètre 1 égal à l’identificateur de la règle de conformité spécifique).

Les règles de conformité DDI garantissent qu’un pilote interagit correctement avec le noyau du système d’exploitation Windows. Par exemple, les règles vérifient que votre pilote effectue des appels de fonction à l’IRQL requis pour la fonction, ou que le pilote acquiert et libère correctement les verrous de rotation. Cette section décrit quelques exemples de stratégies pour le débogage de ces violations.

Débogage des violations de vérification de la conformité DDI

Utilisez !analyze pour afficher des informations sur le bogue case activée

Comme pour tout bogue case activée qui se produit, une fois que vous avez le contrôle du débogueur, la première étape consiste à exécuter la commande !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

Chaque fois que Driver Verifier intercepte une violation de vérification de conformité DDI , des informations sur la violation sont fournies dans la sortie !analyze .

Dans cet exemple, la vérification des bogues 0xC4 : DRIVER_VERIFIER_DETECTED_VIOLATION a une valeur de paramètre 1 (Arg1) de 0x20004, ce qui indique que le pilote a violé la règle de conformité IrqlExAllocatePool .

La sortie !analyze comprend les informations suivantes :

DV_VIOLATED_CONDITION : Ce champ fournit une description de ce qui a provoqué la violation de règle. Dans cet exemple, la condition violée était qu’un pilote a tenté d’allouer de la mémoire à un niveau IRQL très élevé ou a tenté d’allouer de la mémoire du pool paginée à DISPATCH_LEVEL. Par exemple, il peut s’agit d’un pilote qui tentait d’appeler ExAllocatePoolWithTagPriority dans une routine isr (Interruption Service Routine), ou d’un pilote qui a tenté d’allouer de la mémoire du pool paginé tout en tenant un verrou de rotation.

DV_MSDN_LINK : Dans WinDBG, il s’agit d’un lien dynamique qui amène le débogueur à ouvrir la page MSDN affichant plus d’informations sur la règle IrqlExAllocatePool .

DV_RULE_INFO : Dans WinDBG, il s’agit d’un lien en direct qui affiche des informations sur cette règle à partir de l’aide disponible sur le débogueur.

Utiliser la commande d’extension !ruleinfo

Le champ DV_RULE_INFO : de la sortie !analyze affiche la commande que vous pouvez utiliser pour obtenir plus d’informations sur cette violation de règle. Pour cet exemple, vous pouvez utiliser la commande : !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

Utilisez la commande !analyze-v pour identifier l’emplacement de la violation dans le code source

Lorsque cette violation est interceptée, Driver Verifier présente un bogue case activée le système immédiatement. La sortie !analyze affiche l’IRQL actuel, la pile actuelle, le point où l’appel à allouer la mémoire a été effectué, et si le code source est activé La sortie !analyze -v (pour le détail) affiche également le fichier source et le numéro de ligne où la demande d’allocation a été effectuée :

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

Correction de la cause de la violation de conformité DDI

La correction de ces vérifications de bogues qui ont des valeurs Arg1 dans la plage 0x00020000 à 0x00020022 consiste généralement à vérifier que le pilote répond aux conditions d’utilisation de l’API et de DDI décrites dans la documentation correspondante.

Dans l’exemple que nous avons utilisé ici (0x20004), une allocation de mémoire de quelque sorte dans l’ISR va violer les règles IRQL définies pour la routine ExAllocatePoolWithTagPriority .

En général, vous devez consulter la documentation sur la routine pour plus d’informations sur IRQL et une utilisation appropriée. Passez en revue les règles de conformité DDI spécifiques qui testent la fonction. Dans ce cas, la règle est IrqlExAllocatePool.

Utilisez Static Driver Verifier pour analyser le code source de votre pilote à l’aide des mêmes règles. Static Driver Verifier est un outil qui analyse le code source du pilote Windows et signale les problèmes possibles en simulant l’exercice de différents chemins de code. Static Driver Verifier est un excellent utilitaire au moment du développement qui permet d’identifier ces types de problèmes.

Vérification de la conformité DDI

Règles de conformité DDI

Vérificateur de pilote statique

0xC4 de vérification des bogues : DRIVER_VERIFIER_DETECTED_VIOLATION