Набор правил IrpProcessing (WDM)
Используйте эти правила, чтобы убедиться, что драйвер правильно обрабатывает пакеты запросов ввода-вывода (IRP).
В этом разделе
Раздел | Описание |
---|---|
Правило CompleteRequest проверяет, не вызывается ли подпрограмма IoCompleteRequest после выполнения подпрограммы завершения и не возвращает STATUS_MORE_PROCESSING_REQUIRED. |
|
Правило CompleteRequestStatusCheck проверяет, совпадает ли значение состояния ввода-вывода в IRP со значением состояния, возвращенным драйвером нижнего уровня. |
|
Правило CompletionRoutineRegistered указывает, что если подпрограмма диспетчеризации регистрирует подпрограмму IoCompletion с помощью IoSetCompletionRoutineEx, подпрограмма отправки должна вызывать IoCallDriver или PoCallDriver. |
|
Правило DoubleCompletion (WDM) указывает, что драйвер не должен дважды вызывать подпрограмму IoCompleteRequest для одного ИП. |
|
Правило IoReuseIrp указывает, что драйвер должен использовать IoReuseIrp только в irP, которые он ранее выделил с IoAllocateIrp. |
|
Правило IoReuseIrp2 указывает, что драйвер должен использовать IoReuseIrp только в irP, которые он ранее выделил в драйвере. |
|
Правило IoSetCompletionExCompleteIrp указывает, что подпрограмма IoSetCompletionRoutineEx возвращает значение NTSTATUS. Драйвер должен проверка это значение, чтобы определить, была ли подпрограмма IoCompletion успешно зарегистрирована перед вызовом IoCallDriver или PoCallDriver, и если IoSetCompletionRoutineEx завершается, IRP должна быть завершена и подпрограмма диспетчеризации должна вернуться. |
|
Правило IoSetCompletionRoutineExCheck указывает, что подпрограмма IoSetCompletionRoutineEx возвращает значение NTSTATUS. Драйвер должен проверка это значение, чтобы определить, была ли подпрограмма IoCompletion успешно зарегистрирована перед вызовом IoCallDriver или PoCallDriver. |
|
Правило IoSetCompletionRoutineExCheckDeviceObject указывает, что если текущий объект устройства не передается в IoSetCompletionRoutineEx , а нижний объект устройства — , это может привести к состоянию гонки, при котором текущий объект устройства может быть выгружен, даже если подпрограмма завершения не запущена. |
|
Правило IoSetCompletionRoutineNonPnpDriver указывает, что драйверы, которые не являются драйверами PnP, должны использовать IoSetCompletionRoutineEx , а не IoSetCompletionRoutine. |
|
Правило IrpCancelField указывает, что драйвер проверка значение члена Irp-Cancel> при задании подпрограммы отмены для IRP, который он занес. |
|
Правило IrpProcessingComplete указывает, что если подпрограмма диспетчеризации возвращает STATUS_SUCCESS, IRP должен быть выполнен либо самим драйвером, либо драйвером более низкого уровня. |
|
Правило LowerDriverReturn указывает, что после использования PoCallDriver или IoCallDriver для вызова более низкого драйвера драйвер сохраняет состояние возврата из вызова и передает полученное состояние возврата в подпрограмму диспетчеризации. |
|
Правило SignalEventInCompletion указывает, что при обработке асинхронного IRP драйвер должен вызвать KeSetEvent в подпрограмме завершения при установке флага Irp-PendingReturned>. |
|
Правило SignalEventInCompletion2 указывает, что при обработке асинхронного IRP драйвер должен вызывать KeSetEvent в подпрограмме завершения при установке флага Irp-PendingReturned>. |
|
Правило SignalEventInCompletion3 указывает, что при обработке асинхронного IRP драйвер должен вызвать KeSetEvent в подпрограмме завершения при установке флага Irp-PendingReturned>. |
|
Правило StartIoCancel указывает, что драйвер не должен вызывать IoSetStartIoAttributes с параметром NonCancelable, имеющим значение FALSE, перед вызовом IoSetCancelRoutine с подпрограммой отмены, отличной от NULL. |
|
Правило StartIoRecursion указывает, что если подпрограмма StartIo драйвера включает вызов IoStartNextPacket, драйвер должен сначала вызвать IoSetStartIoAttributes с атрибутом DeferredStartIo, равным TRUE. В противном случае может возникнуть бесконечная рекурсия. |
|
Правило PnpRemove указывает, что драйвер не может выполнять IRP_MN_SURPRISE_REMOVAL, IRP_MN_CANCEL_REMOVE_DEVICE, IRP_MN_CANCEL_STOP_DEVICE или IRP_MN_REMOVE_DEVICE запросы со сбоем. |
|
Правило PnpSurpriseRemove указывает, что драйвер не вызывает IoDeleteDevice или IoDetachDevice при обработке запроса IRP_MN_SURPRISE_REMOVAL . |
|
Правило PowerDownAllocate указывает, что драйвер FDO и FIDO не должны выделять память при обработке IRP_MN_SET_POWER запроса для перехода SystemPowerState с s0 на [S1... S5]. |
|
Правило PowerDownFail указывает, что драйвер FDO или FIDO не должен завершать запрос IRP_MN_SET_POWER при выключении устройства. Это правило применяется только к драйверам FDO и FIDO. |
|
Правило PowerIrpDIs указывает, что, когда драйвер обрабатывает систему или устройство IRP_MJ_POWER с IRP_MN_SET_POWER, он не должен вызывать DDIs, которые могут вызываться только в PASSIVE_LEVEL. |
|
Правило PowerUpFail указывает, что драйвер FDO или FIDO не должен завершать запрос IRP_MN_SET_POWER при выключении устройства. |
|
Правило PnpIrpCompletion проверяет, передает ли драйвер FDO PnP IRP нижнему драйверу. |
|
Правило WmiComplete указывает, что при обработке вспомогательного IRP WMI драйвер вызывает IoCompleteRequest перед возвратом из подпрограммы DispatchSystemControl . |
|
Правило WmiForward указывает, что драйвер должен пересылать незначительные irp WMI , если требуется пересылка. |
Выбор набора правил IrpProcessing
Выберите проект драйвера (.vcxProj) в Microsoft Visual Studio. В меню Драйвер щелкните Запустить средство проверки статических драйверов....
Перейдите на вкладку Правила . В разделе Наборы правил выберите IrpProcessing.
Чтобы выбрать набор правил по умолчанию в окне командной строки разработчика Visual Studio, укажите IrpProcessing.sdv с параметром /проверка. Пример:
msbuild /t:sdv /p:Inputs="/check:IrpProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
Дополнительные сведения см. в разделах Использование статического средства проверки драйверов для поиска дефектов в драйверах и Команд статического средства проверки драйверов (MSBuild).