Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När du har valt alternativet DDI-efterlevnadskontroll och drivrutinsverifieraren upptäcker att drivrutinen bryter mot en av DDI-efterlevnadsreglerna genererar drivrutinsverifierarenfelkontroll 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (med parameter 1 lika med identifieraren för den specifika efterlevnadsregeln).
DDI-efterlevnadsreglerna ser till att en drivrutin interagerar korrekt med Windows-operativsystemets kernel. Till exempel verifierar reglerna att din drivrutin gör funktionsanrop på den nödvändiga IRQL-nivån för funktionen. De säkerställer också att drivrutinen korrekt förvärvar och frigör spinnlås. I det här avsnittet beskrivs några exempelstrategier för felsökning av dessa överträdelser.
Felsöka överträdelser av DDI-efterlevnadskontroll
- Använd !analyze för att visa information om buggkontrollen
- Använd kommandot !ruleinfo
- Använd kommandot !analyze –v för att identifiera platsen för överträdelsen i källkoden
- Åtgärda orsaken till DDI-efterlevnadsöverträdelsen
Använd !analyze för att visa information om buggkontrollen
När det inträffar en buggkontroll och du har kontroll över felsökningsprogrammet, är det bästa första steget att köra kommandot !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
När drivrutinsverifieraren upptäcker en överträdelse av DDI-efterlevnadskontroll anges information om överträdelsen i !analyze-utdata .
I detta exempel har felkod 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION parameter 1 (Arg1) värde 0x20004, vilket indikerar att drivrutinen har brutit mot efterlevnadsregeln IrqlExAllocatePool.
!analyze-utdata innehåller följande information:
DV_VIOLATED_CONDITION: Det här fältet innehåller en beskrivning av vad som orsakade regelöverträdelsen. I det här exemplet överträddes villkoret att en drivrutin försökte allokera minne på en mycket hög IRQL-nivå eller försökte allokera sidigt poolminne vid DISPATCH_LEVEL. Detta kan till exempel ha varit en drivrutin som försökte anropa ExAllocatePoolWithTagPriority i en avbrottstjänstrutin (ISR) eller en drivrutin som försökte allokera siddelat poolminne medan du höll i ett spinnlås.
DV_MSDN_LINK: I WinDBG är detta en livelänk som gör att felsökaren öppnar MSDN-sidan med mer information om IrqlExAllocatePool-regeln .
DV_RULE_INFO: I WinDBG är det här en livelänk som visar information om den här regeln från hjälpen som är tillgänglig i felsökningsprogrammet.
Använd kommandot för tillägget !ruleinfo
Fältet DV_RULE_INFO: i !analyze-utdata visar det kommando som du kan använda för att hitta mer information om regelöverträdelsen. I det här exemplet kan du använda kommandot : !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
Använd kommandot !analyze-v för att identifiera platsen för överträdelsen i källkoden
När den här överträdelsen fångas kommer drivrutinsverifieraren att felsöka systemet omedelbart. !analyze-utdata visar aktuell IRQL, aktuell stack, punkt där anropet för att allokera minne gjordes, och om källkoden är aktiverad visar !analyze -v (för utförliga) utdata även källfilen och radnumret där allokeringsbegäran gjordes:
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
Åtgärda orsaken till DDI-efterlevnadsöverträdelsen
Åtgärda dessa felkontroller som har Arg1-värden i intervallet 0x00020000 till 0x00020022, består vanligtvis av att verifiera att drivrutinen uppfyller api- och DDI-användningsvillkoren som beskrivs i motsvarande dokumentation.
I exemplet som vi har använt här (0x20004) kommer en minnesallokering av något slag i ISR att bryta mot IRQL-reglerna som angetts för rutinen ExAllocatePoolWithTagPriority .
I allmänhet bör du läsa dokumentationen om rutinen för information om IRQL och korrekt användning. Granska de specifika DDI-efterlevnadsregler som testar funktionen. I det här fallet är regeln IrqlExAllocatePool.
Använd Statisk drivrutinsverifierare för att analysera drivrutins källkoden med hjälp av samma regler. Static Driver Verifier är ett verktyg som söker igenom källkoden för Windows-drivrutinen och rapporterar om möjliga problem genom att simulera träning av olika kodsökvägar. Static Driver Verifier är ett fantastiskt verktyg att använda under utvecklingstiden som hjälper dig att identifiera sådana problem.