Набор правил RequestProcessing (KMDF)
Используйте эти правила, чтобы убедиться, что драйвер правильно завершает или отменяет пакеты запросов ввода-вывода (IRP).
В этом разделе
Раздел | Описание |
---|---|
Правило ChangeQueueState указывает, что драйвер WDF не пытается изменить состояние очереди из параллельных потоков или не вызывает изменения состояния DIS один за другим из одного потока. Функции обратного вызова для изменения состояния очереди: WdfIoQueueStop, WdfIoQueueStopSynchronously, WdfIoQueuePurge, WdfIoQueuePurgeSynchronously, WdfIoQueueDrain, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurge и WdfIoQueueStopAndPurgeSynchronously. Если эти DDIs вызываются, когда изменение состояния очереди уже выполняется, это приведет к сбою компьютера или перестанет отвечать на запросы. |
|
Правило CompleteCanceledReq указывает, что если запрос уже отменен, запрос больше недействителен, и драйвер не должен его завершить. Хотя драйвер отменяет пометку запроса, который ранее был помечен как отменяемый, он должен проверка, что запрос еще не был отменен. Если драйвер не делает это проверка, драйвер может выполнить освобожденный запрос. |
|
Правило DoubleCompletion указывает, что драйверы не должны выполнять запрос ввода-вывода дважды. Следующие методы не следует вызывать дважды в строке для одного запроса: WdfRequestComplete, WdfRequestCompleteWithInformation, WdfRequestCompleteWithPriorityBoost. |
|
Правило DoubleCompletionLocal указывает, что драйверы не должны выполнять запрос ввода-вывода дважды. |
|
Правило EvtIoStopCancel указывает, что в функции обратного вызова EvtIoStop драйвер вызывает один из следующих методов для запросов ввода-вывода, которые нельзя отменить. |
|
Правило EvtIoStopCompleteOrStopAck указывает, что в функции обратного вызова EvtIoStop драйвер вызывает один из следующих методов для каждого запроса ввода-вывода, представленного платформой. Если этого не сделать, драйвер может заблокировать переход системы в другое более низкое состояние питания. |
|
Правило EvtSurpriseRemoveNoSuspendQueue указывает, что драйверы WDF не должны стекать, останавливать или очищать очередь из функции обратного вызова EvtDeviceSurpriseRemoval , вместо этого следует использовать функции обратного вызова самоуправляемого ввода-вывода. Функция обратного вызова EvtDeviceSurpriseRemoval не синхронизирована с путем выключения. |
|
Правило FileObjectConfigured указывает, что вызову метода WdfRequestGetFileObject предшествует вызов WdfDeviceInitSetFileObjectConfig. |
|
Правило InternalIoctlReqs указывает, что внутренние запросы IOCTL не передаются в недопустимые интерфейсы драйвера устройств (DIS) отправки запросов KMDF. |
|
Правило InvalidReqAccess указывает, что запросы не будут доступны после их завершения или отмены. Это правило может перекрываться с другими правилами, такими как правила, которые проверка для двойного завершения, или правила, которые проверка для запросов были помечены как отменяемые два раза. |
|
Правило InvalidReqAccessLocal указывает, что после их завершения или отмены доступ к локально созданным запросам не предоставляется. Это правило может перекрываться с другими правилами, такими как правила, которые проверка для двойного завершения, или правила, которые проверка для запросов были помечены как отменяемые два раза. |
|
Правило IoctlReqs указывает, что запросы IOCTL не должны передаваться в недопустимый запрос KMDF или отправлять интерфейсы драйвера устройства (DIS). |
|
Правило MarkCancOnCancReqLocal указывает, что метод WdfRequestMarkCancelable нельзя вызывать два раза подряд в одном и том же запросе ввода-вывода. |
|
Правило NoIoQueuePurgeSynchronously проверяет, что драйверы WDF не вызывают функции WdfIoQueueStopSynchronously, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurgeSynchronously или WdfIoQueuePurgeSynchronously из следующих функций обратного вызова событий объекта очереди EvtIO: |
|
Правило OutputBufferAPI указывает, что правильные DID для получения буфера используются в функции обратного вызова EvtIoWrite . В функции обратного вызова EvtIoWrite для получения буфера нельзя вызвать следующие DID: |
|
Правило ReadReqs указывает, что запросы на чтение не передаются недопустимым методам KMDF. |
|
Правило ReqCompletionRoutine указывает, что подпрограмма завершения должна быть задана перед отправкой запроса в целевой объект ввода-вывода. |
|
Правило ReqDelete указывает, что созданные драйвером запросы не передаются в функции WdfRequestCompleteXxx . Вместо этого запрос должен быть удален по завершении. |
|
Правило ReqIsCancOnCancReq указывает, что метод WdfRequestIsCanceled можно вызывать только для запроса, который не помечен как отменяемый. |
|
Правило ReqMarkCancelableSend указывает, что запросы, перенаправленные драйвером, не помечаются как отменяемые путем вызова WdfRequestMarkCancelable. |
|
Правило DeferredRequestCompleted указывает, что для нефильтрованного драйвера каждый запрос, представленный в очередь ввода-вывода драйвера по умолчанию, должен быть завершен, если запрос не отложен или не переадресован, или если вызывается WdfRequestStopAcknowledge . |
|
Правило RequestFormattedValid указывает, что драйвер форматирует все запросы, кроме запроса WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET, перед отправкой их в целевой объект ввода-вывода. |
|
Правило RequestGetStatusValid , указывающее, что WdfRequestGetStatus следует вызывать для запроса в одной из следующих ситуаций:
|
|
Правило RequestSendAndForgetNoFormatting проверяет, не форматирует ли драйвер запрос с помощью функций форматирования целевого объекта ввода-вывода, прежде чем отправлять его в целевой объект ввода-вывода с параметром отправки WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET. |
|
Правило RequestSendAndForgetNoFormatting2 проверяет, не форматирует ли драйвер запрос с помощью функций форматирования целевого объекта ввода-вывода перед его отправкой в целевой объект ввода-вывода с параметром отправки WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET. |
|
Правило StopAckWithinEvtIoStop указывает, что функция WdfRequestStopAcknowledge вызывается только из функции обратного вызова EvtIoStop . |
|
Правило WdfIoQueueFindRequestFailed указывает, что WdfIoQueueRetrieveFoundRequest или WdfObjectDereference следует вызывать только после того, как WdfIoQueueFindRequestFailed возвращает STATUS_SUCCESS. |
|
Правило WdfIoQueueRetrieveFoundRequest указывает, что метод WdfIoQueueRetrieveFoundRequest вызывается только после вызова и возврата WdfIoQueueFindRequest STATUS_SUCCESS и wdfObjectDereference не вызывается в том же запросе. |
|
Правило WdfIoQueueRetrieveNextRequest указывает, что WdfIoQueueRetrieveNextRequest не вызывается после вызова WdfIoQueueFindRequest . |
|
Правило WriteReqs указывает, что запрос на запись не передается в недопустимые методы KMDF. |
Выбор набора правил RequestProcessing
Выберите проект драйвера (VCXProj) в Microsoft Visual Studio. В меню Драйвер выберите Запуск средства проверки статических драйверов....
Перейдите на вкладку Правила . В разделе Наборы правил выберите RequestProcessing.
Чтобы выбрать набор правил по умолчанию в окне командной строки разработчика Visual Studio, укажите RequestProcessing.sdv с параметром /проверка. Пример:
msbuild /t:sdv /p:Inputs="/check:RequestProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
Дополнительные сведения см. в разделах Использование статического средства проверки драйверов для поиска дефектов в драйверах и Команд средства проверки статических драйверов (MSBuild).