Набор правил использования 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 для дочернего объекта устройства.

Контрольное устройство удалено

Правило 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

Правило 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 с параметром /check . Рассмотрим пример.

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

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