Поделиться через


Набор правил RequestProcessing (KMDF)

Используйте эти правила, чтобы убедиться, что драйвер правильно завершает или отменяет пакеты запросов ввода-вывода (IRP).

В этом разделе

Раздел Описание

ChangeQueueState

Правило ChangeQueueState указывает, что драйвер WDF не пытается изменить состояние очереди из параллельных потоков или не вызывает изменения состояния DIS один за другим из одного потока. Функции обратного вызова для изменения состояния очереди: WdfIoQueueStop, WdfIoQueueStopSynchronously, WdfIoQueuePurge, WdfIoQueuePurgeSynchronously, WdfIoQueueDrain, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurge и WdfIoQueueStopAndPurgeSynchronously. Если эти DDIs вызываются, когда изменение состояния очереди уже выполняется, это приведет к сбою компьютера или перестанет отвечать на запросы.

CompleteCanceledReq

Правило CompleteCanceledReq указывает, что если запрос уже отменен, запрос больше недействителен, и драйвер не должен его завершить. Хотя драйвер отменяет пометку запроса, который ранее был помечен как отменяемый, он должен проверка, что запрос еще не был отменен. Если драйвер не делает это проверка, драйвер может выполнить освобожденный запрос.

DoubleCompletion

Правило DoubleCompletion указывает, что драйверы не должны выполнять запрос ввода-вывода дважды. Следующие методы не следует вызывать дважды в строке для одного запроса: WdfRequestComplete, WdfRequestCompleteWithInformation, WdfRequestCompleteWithPriorityBoost.

DoubleCompletionLocal

Правило DoubleCompletionLocal указывает, что драйверы не должны выполнять запрос ввода-вывода дважды.

EvtIoStopCancel

Правило EvtIoStopCancel указывает, что в функции обратного вызова EvtIoStop драйвер вызывает один из следующих методов для запросов ввода-вывода, которые нельзя отменить.

EvtIoStopCompleteOrStopAck

Правило EvtIoStopCompleteOrStopAck указывает, что в функции обратного вызова EvtIoStop драйвер вызывает один из следующих методов для каждого запроса ввода-вывода, представленного платформой. Если этого не сделать, драйвер может заблокировать переход системы в другое более низкое состояние питания.

EvtSurpriseRemoveNoSuspendQueue

Правило EvtSurpriseRemoveNoSuspendQueue указывает, что драйверы WDF не должны стекать, останавливать или очищать очередь из функции обратного вызова EvtDeviceSurpriseRemoval , вместо этого следует использовать функции обратного вызова самоуправляемого ввода-вывода. Функция обратного вызова EvtDeviceSurpriseRemoval не синхронизирована с путем выключения.

FileObjectConfigured

Правило FileObjectConfigured указывает, что вызову метода WdfRequestGetFileObject предшествует вызов WdfDeviceInitSetFileObjectConfig.

InternalIoctlReqs

Правило InternalIoctlReqs указывает, что внутренние запросы IOCTL не передаются в недопустимые интерфейсы драйвера устройств (DIS) отправки запросов KMDF.

InvalidReqAccess

Правило InvalidReqAccess указывает, что запросы не будут доступны после их завершения или отмены. Это правило может перекрываться с другими правилами, такими как правила, которые проверка для двойного завершения, или правила, которые проверка для запросов были помечены как отменяемые два раза.

InvalidReqAccessLocal

Правило InvalidReqAccessLocal указывает, что после их завершения или отмены доступ к локально созданным запросам не предоставляется. Это правило может перекрываться с другими правилами, такими как правила, которые проверка для двойного завершения, или правила, которые проверка для запросов были помечены как отменяемые два раза.

IoctlReqs

Правило IoctlReqs указывает, что запросы IOCTL не должны передаваться в недопустимый запрос KMDF или отправлять интерфейсы драйвера устройства (DIS).

MarkCancOnCancReqLocal

Правило MarkCancOnCancReqLocal указывает, что метод WdfRequestMarkCancelable нельзя вызывать два раза подряд в одном и том же запросе ввода-вывода.

NoIoQueuePurgeSynchronously

Правило NoIoQueuePurgeSynchronously проверяет, что драйверы WDF не вызывают функции WdfIoQueueStopSynchronously, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurgeSynchronously или WdfIoQueuePurgeSynchronously из следующих функций обратного вызова событий объекта очереди EvtIO:

OutputBufferAPI

Правило OutputBufferAPI указывает, что правильные DID для получения буфера используются в функции обратного вызова EvtIoWrite . В функции обратного вызова EvtIoWrite для получения буфера нельзя вызвать следующие DID:

ReadReqs

Правило ReadReqs указывает, что запросы на чтение не передаются недопустимым методам KMDF.

ReqCompletionRoutine

Правило ReqCompletionRoutine указывает, что подпрограмма завершения должна быть задана перед отправкой запроса в целевой объект ввода-вывода.

ReqDelete

Правило ReqDelete указывает, что созданные драйвером запросы не передаются в функции WdfRequestCompleteXxx . Вместо этого запрос должен быть удален по завершении.

ReqIsCancOnCancReq

Правило ReqIsCancOnCancReq указывает, что метод WdfRequestIsCanceled можно вызывать только для запроса, который не помечен как отменяемый.

ReqMarkCancelableSend

Правило ReqMarkCancelableSend указывает, что запросы, перенаправленные драйвером, не помечаются как отменяемые путем вызова WdfRequestMarkCancelable.

RequestCompleted

Правило DeferredRequestCompleted указывает, что для нефильтрованного драйвера каждый запрос, представленный в очередь ввода-вывода драйвера по умолчанию, должен быть завершен, если запрос не отложен или не переадресован, или если вызывается WdfRequestStopAcknowledge .

RequestFormattedValid

Правило RequestFormattedValid указывает, что драйвер форматирует все запросы, кроме запроса WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET, перед отправкой их в целевой объект ввода-вывода.

RequestGetStatusValid

Правило RequestGetStatusValid , указывающее, что WdfRequestGetStatus следует вызывать для запроса в одной из следующих ситуаций:

  • Когда WdfRequestSend возвращает ошибку.
  • Когда запрос был отправлен с WDF_REQUEST_SEND_OPTION_SYNCHRONOUS.

RequestSendAndForgetNoFormatting

Правило RequestSendAndForgetNoFormatting проверяет, не форматирует ли драйвер запрос с помощью функций форматирования целевого объекта ввода-вывода, прежде чем отправлять его в целевой объект ввода-вывода с параметром отправки WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

RequestSendAndForgetNoFormatting2

Правило RequestSendAndForgetNoFormatting2 проверяет, не форматирует ли драйвер запрос с помощью функций форматирования целевого объекта ввода-вывода перед его отправкой в целевой объект ввода-вывода с параметром отправки WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

StopAckWithinEvtIoStop

Правило StopAckWithinEvtIoStop указывает, что функция WdfRequestStopAcknowledge вызывается только из функции обратного вызова EvtIoStop .

WdfIoQueueFindRequestFailed

Правило WdfIoQueueFindRequestFailed указывает, что WdfIoQueueRetrieveFoundRequest или WdfObjectDereference следует вызывать только после того, как WdfIoQueueFindRequestFailed возвращает STATUS_SUCCESS.

WdfIoQueueRetrieveFoundRequest

Правило WdfIoQueueRetrieveFoundRequest указывает, что метод WdfIoQueueRetrieveFoundRequest вызывается только после вызова и возврата WdfIoQueueFindRequest STATUS_SUCCESS и wdfObjectDereference не вызывается в том же запросе.

WdfIoQueueRetrieveNextRequest

Правило WdfIoQueueRetrieveNextRequest указывает, что WdfIoQueueRetrieveNextRequest не вызывается после вызова WdfIoQueueFindRequest .

WriteReqs

Правило WriteReqs указывает, что запрос на запись не передается в недопустимые методы KMDF.

Выбор набора правил RequestProcessing

  1. Выберите проект драйвера (VCXProj) в Microsoft Visual Studio. В меню Драйвер выберите Запуск средства проверки статических драйверов....

  2. Перейдите на вкладку Правила . В разделе Наборы правил выберите RequestProcessing.

    Чтобы выбрать набор правил по умолчанию в окне командной строки разработчика Visual Studio, укажите RequestProcessing.sdv с параметром /проверка. Пример:

    msbuild /t:sdv /p:Inputs="/check:RequestProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    Дополнительные сведения см. в разделах Использование статического средства проверки драйверов для поиска дефектов в драйверах и Команд средства проверки статических драйверов (MSBuild).