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


Набор правил использования DDI (KMDF)

Используйте эти правила, чтобы убедиться, что драйвер правильно использует DDIs KMDF.

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

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

BufAfterReqCompletedIoctl

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

BufAfterReqCompletedIntIoctl

Правило BufAfterReqCompletedIntIoctl указывает, что после завершения запроса доступ к его буферу невозможен (только внутри функции обратного вызова EvtIoInternalDeviceControl ). Буфер извлекается путем вызова WdfRequestRetrieveOutputBuffer или WdfRequestRetrieveUnsafeUserOutputBuffer или WdfRequestRetrieveInputBuffer или WdfRequestRetrieveUnsafeUserInputBuffer.

BufAfterReqCompletedIntIoctlA

Правило BufAfterReqCompletedIntIoctlA проверяет, что после завершения запроса доступ к его буферу невозможен (только внутри обратного вызова EvtIoInternalDeviceControl ). Буфер был получен путем вызова WdfRequestRetrieveInputBuffer или WdfRequestRetrieveOutputBuffer или WdfRequestRetrieveUnsafeUserInputBuffer или WdfRequestRetrieveUnsafeUserOutputBuffer.

BufAfterReqCompletedIoctlA

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

BufAfterReqCompletedRead

Правило BufAfterReqCompletedRead указывает, что в функции обратного вызова EvtIoRead доступ к буферу запросов ввода-вывода, полученному после завершения запроса ввода-вывода, невозможен. Существует 14 DDIs, которые служат в качестве возможных методов доступа к буферу.

BufAfterReqCompletedReadA

Правило BufAfterReqCompletedReadA указывает, что в функции обратного вызова EvtIoRead доступ к буферу запросов ввода-вывода, полученному после завершения запроса ввода-вывода, невозможен. Существует 14 DDIs, которые служат в качестве возможных методов доступа к буферу.

BufAfterReqCompletedWrite

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

BufAfterReqCompletedWriteA

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

ChildDeviceInitApi

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

ControlDeviceDeleted

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

ControlDeviceInitAPI

Правило ControlDeviceInitAPI указывает, что WdfControlDeviceInitAllocate и все другие DDIS инициализации объекта устройства, которые настраивают структуру WDFDEVICE_INIT для управляющего устройства, должны вызываться перед WdfDeviceCreate для управляющего устройства.

CtlDeviceFinishInitDeviceAdd

Правило CtlDeviceFinishInitDeviceAdd указывает, что если драйвер создает объект управляющего устройства в функции обратного вызова EvtDriverDeviceAdd , он должен вызывать WdfControlFinishInitializing после создания устройства и перед выходом из функции обратного вызова EvtDriverDeviceAdd . Это правило не применяется для драйверов, отличных от PnP.

CtlDeviceFinishInitDrEntry

Правило CtlDeviceFinishInitDrEntry указывает, что если драйвер создает объект управляющего устройства в функции обратного вызова DriverEntry , он должен вызвать WdfControlFinishInitializing после создания устройства и перед выходом из функции обратного вызова EvtDriverDeviceAdd . Это правило не применяется для драйверов, отличных от PnP.

DeviceCreateFail

Правило DeviceCreateFail указывает, что EVT_WDF_DRIVER_DEVICE_ADD возвращает состояние ошибки при сбое вызова WdfDeviceCreate .

DeviceInitAllocate

Правило DeviceInitAllocate указывает, что для устройства PDO или объекта управляющего устройства необходимо вызвать методы инициализации объекта устройства платформы WdfPdoInitAllocate или WdfControlDeviceInitAllocate , прежде чем драйвер вызовет WdfDeviceCreate.

DeviceInitAPI

Для устройства FDO методы инициализации объекта платформы устройства и методы инициализации FDO платформы должны вызываться, прежде чем драйвер вызовет метод WdfDeviceCreate для объекта устройства.

DoubleDeviceInitFree

Правило DoubleDeviceInitFree указывает, что драйверы не должны освобождать структуру инициализации устройства дважды.

Создание драйвера

Правило DriverCreate указывает, что драйвер, использующий платформу драйвера в режиме ядра (KMDF), должен вызвать метод WdfDriverCreate , чтобы создать объект драйвера платформы из подпрограммы DriverEntry .

InitFreeDeviceCallback

Правило InitFreeDeviceCallback указывает, что драйвер должен вызывать WdfDeviceInitFree , если драйвер обнаруживает ошибку при инициализации нового объекта устройства платформы, и если драйвер получил WDFDEVICE_INIT структуру из вызова WdfControlDeviceInitAllocate.

InitFreeDeviceCreate

Правило InitFreeDeviceCreate указывает, что драйвер должен вызывать WdfDeviceInitFree вместо WdfDeviceCreate , если возникает ошибка в одном из методов инициализации объекта устройства и если драйвер получил структуру WDFDEVICE_INIT из вызова WdfControlDeviceInitAllocate.

InitFreeDeviceCreateType2

Правило InitFreeDeviceCreateType2 указывает, что драйвер не должен вызывать WdfDeviceCreate после вызова WdfDeviceInitFree.

InitFreeDeviceCreateType4

Правило InitFreeDeviceCreateType4 указывает, что драйвер должен вызывать WdfDeviceInitFree , если драйвер обнаруживает ошибку при вызове WdfDeviceCreate и если драйвер получил структуру WDFDEVICE_INIT из вызова WdfControlDeviceInitAllocate.

InitFreeNull

Правило InitFreeNull указывает, что DDIs, получающие PWDFDEVICE_INIT в качестве параметра, не могут вызываться с помощью указателя NULL на структуру WDFDEVICE_INIT .

MdlAfterReqCompletedIntIoctl

Правило MdlAfterReqCompletedIntIoctl указывает, что в функции обратного вызова EvtIoInternalDeviceControl невозможно получить доступ к списку дескрипторов памяти (MDL) после завершения запроса ввода-вывода.

MdlAfterReqCompletedIntIoctlA

Правило MdlAfterReqCompletedIntIoctlA указывает, что в функции обратного вызова EvtIoInternalDeviceControl невозможно получить доступ к списку дескрипторов памяти (MDL) после завершения запроса ввода-вывода.

MdlAfterReqCompletedIoctl

Правило MdlAfterReqCompletedIoctl указывает, что в функции обратного вызова EvtIoDeviceControl невозможно получить доступ к списку дескрипторов памяти (MDL) после завершения запроса ввода-вывода.

MdlAfterReqCompletedIoctlA

Правило MdlAfterReqCompletedIoctlA указывает, что в функции обратного вызова EvtIoDeviceControl после завершения запроса ввода-вывода невозможно получить доступ к списку дескрипторов памяти (MDL).

MdlAfterReqCompletedRead

Правило MdlAfterReqCompletedRead указывает, что в функции обратного вызова EvtIoRead полученный объект списка дескрипторов памяти (MDL) недоступен после завершения запроса ввода-вывода.

MdlAfterReqCompletedReadA

Правило MdlAfterReqCompletedReadA указывает, что в функции обратного вызова EvtIoRead полученный объект списка дескрипторов памяти (MDL) недоступен после завершения запроса ввода-вывода.

MdlAfterReqCompletedWrite

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

MdlAfterReqCompletedWriteA

Правило MdlAfterReqCompletedWriteA указывает, что в функции обратного вызова EvtIoWrite полученный объект списка дескрипторов памяти (MDL) недоступен после завершения запроса ввода-вывода.

MemAfterReqCompletedIntIoctl

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

MemAfterReqCompletedIntIoctlA

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

MemAfterReqCompletedIoctl

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

MemAfterReqCompletedIoctlA

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

MemAfterReqCompletedRead

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

MemAfterReqCompletedReadA

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

MemAfterReqCompletedWrite

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

MemAfterReqCompletedWriteA

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

NullCheck

Правило NullCheck проверяет, что значение NULL в коде драйвера не разыменовывается позже в драйвере. Это правило сообщает о дефекте, если выполняется одно из следующих условий:

  • Существует назначение NULL, которое разыменовывается позже.
  • Существует глобальный параметр или параметр процедуры в драйвере, который может иметь значение NULL, который позже разыменовывается, и в драйвере есть явное проверка, предполагающее, что начальное значение указателя может иметь значение NULL.

При нарушениях правил NullCheck наиболее релевантные операторы кода выделяются в области дерева трассировки. Дополнительные сведения о работе с выходными данными отчета см. в разделах Отчет о средстве проверки статических драйверов и Основные сведения о средстве просмотра трассировки.

PdoDeviceInitAPI

Правило PdoDeviceInitAPI указывает, что WdfPdoInitAllocate и все другие DDIS инициализации объекта устройства, которые настраивают структуру WDFDEVICE_INIT для физического объекта устройства (PDO), должны вызываться до вызова драйвером WdfDeviceCreate для PDO.

PdoInitFreeDeviceCallback

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

PdoInitFreeDeviceCreate

Правило PdoInitFreeDeviceCreate указывает, что драйвер должен вызывать WdfDeviceInitFree вместо WdfDeviceCreate , если в одной из функций инициализации объекта устройства возникает ошибка и если драйвер получил структуру WDFDEVICE_INIT из вызова WdfPdoInitAllocate.

PdoInitFreeDeviceCreateType2

Правило PdoInitFreeDeviceCreateType2 указывает, что драйвер не должен вызывать WdfDeviceCreate после вызова WdfDeviceInitFree.

PdoInitFreeDeviceCreateType4

Правило PdoInitFreeDeviceCreateType4 указывает, что драйвер должен вызывать WdfDeviceInitFree , если возникает ошибка, когда драйвер вызывает WdfDeviceCreate.

ControlDeviceInitAllocate

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

InputBufferAPI

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

Выбор набора правил использования DDI

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

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

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

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

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