Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Если выбран параметр проверки соответствия DDI , и средство проверки драйверов обнаруживает, что драйвер нарушает одно из правил соответствия DDI, средство проверки драйверов создает проверку ошибок 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (с параметром 1 равным идентификатору конкретного правила соответствия).
Правила соответствия DDI гарантируют, что драйвер правильно взаимодействует с ядром операционной системы Windows. Например, правила проверяют, что драйвер вызывает функцию на требуемом уровне IRQL для функции или что драйвер правильно захватывает и освобождает спин-блокировки. В этом разделе описаны некоторые примеры стратегий отладки этих нарушений.
Отладка нарушений проверки соответствия DDI
- Используйте !analyze, чтобы отобразить сведения об ошибке
- Используйте команду расширения !ruleinfo
- Используйте команду !analyze –v, чтобы определить расположение нарушения в исходном коде
- Устранение причины нарушения соответствия DDI
Используйте !analyze, чтобы отобразить информацию о сбое
Как и при возникновении любой проверки ошибок, после того как вы управляете отладчиком, лучше всего выполнить команду !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
Всякий раз, когда Проверка драйверов обнаруживает нарушение проверки соответствия DDI, сведения о нарушении будут предоставлены в результатах !analyze.
В этом примере код ошибки 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION имеет параметр 1 (Arg1) со значением 0x20004, указывающим, что драйвер нарушил правило соответствия IrqlExAllocatePool.
Выходные данные !analyze содержат следующие сведения:
DV_VIOLATED_CONDITION: Это поле содержит описание того, что вызвало нарушение правила. В этом примере условие было нарушено, когда драйвер попытался выделить память на очень высоком уровне IRQL или выделить память из пула страниц на уровне DISPATCH_LEVEL. Например, это мог быть драйвер, который пытался вызвать ExAllocatePoolWithTagPriority в подпрограмме обслуживания прерываний (ISR) или драйвер, который попытался выделить память пула страниц, удерживая спин-блокировку.
DV_MSDN_LINK: В WinDBG это прямая ссылка, которая приводит к открытию отладчика страницы MSDN с дополнительными сведениями о правиле IrqlExAllocatePool .
DV_RULE_INFO: В WinDBG это прямая ссылка, которая будет отображать сведения об этом правиле из справки, доступной на отладчике.
Используйте команду расширения !ruleinfo
Поле DV_RULE_INFO: в выводе !analyze показывает команду, которую можно использовать для поиска дополнительных сведений о нарушении этого правила. В этом примере можно использовать команду :!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
Используйте команду !analyze-v, чтобы определить расположение нарушения в исходном коде
При обнаружении этого нарушения средство проверки драйверов немедленно проверяет систему. Выходные данные !analyze покажут текущий IRQL, текущий стек и место, где был выполнен вызов выделения памяти. Если включен исходный код, выходные данные !analyze –v (для «подробно») также покажут исходный файл и номер строки, где был выполнен запрос на выделение памяти.
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
Устранение причины нарушения соответствия DDI
Исправление этих ошибок с значениями Arg1 в диапазоне 0x00020000 для 0x00020022, как правило, состоит из проверки соответствия драйвера требованиям API и DDI использования, описанным в соответствующей документации.
В примере, который мы использовали здесь (0x20004), выделение памяти любого типа в ISR будет нарушать правила IRQL, заданные для подпрограммы ExAllocatePoolWithTagPriority .
В общем, следует просмотреть документацию о рутине для получения сведений об IRQL и правильном использовании. Ознакомьтесь с определенными правилами соответствия DDI , которые проверяют функцию. В этом случае правило — IrqlExAllocatePool.
Используйте средство проверки статических драйверов для анализа исходного кода драйвера, используя те же правила. Средство проверки статических драйверов — это средство, которое сканирует исходный код драйвера Windows и сообщает о возможных проблемах, имитируя выполнение различных путей кода. Средство проверки статических драйверов — это отличная утилита разработки, которая помогает выявлять такие проблемы.