Набор правил использования DDI (KMDF)
Используйте эти правила, чтобы убедиться, что драйвер правильно использует DDIs KMDF.
В этом разделе
Раздел | Описание |
---|---|
Правило BufAfterReqCompletedIoctl указывает, что в функции обратного вызова EvtIoDeviceControl доступ к буферу запросов ввода-вывода, полученный после завершения запроса ввода-вывода, невозможен. |
|
Правило BufAfterReqCompletedIntIoctl указывает, что после завершения запроса доступ к его буферу невозможен (только внутри функции обратного вызова EvtIoInternalDeviceControl ). Буфер извлекается путем вызова WdfRequestRetrieveOutputBuffer или WdfRequestRetrieveUnsafeUserOutputBuffer или WdfRequestRetrieveInputBuffer или WdfRequestRetrieveUnsafeUserInputBuffer. |
|
Правило BufAfterReqCompletedIntIoctlA проверяет, что после завершения запроса доступ к его буферу невозможен (только внутри обратного вызова EvtIoInternalDeviceControl ). Буфер был получен путем вызова WdfRequestRetrieveInputBuffer или WdfRequestRetrieveOutputBuffer или WdfRequestRetrieveUnsafeUserInputBuffer или WdfRequestRetrieveUnsafeUserOutputBuffer. |
|
Правило BufAfterReqCompletedIoctlA указывает, что в функции обратного вызова EvtIoDeviceControl после завершения запроса ввода-вывода невозможно получить доступ к буферу запросов ввода-вывода. |
|
Правило BufAfterReqCompletedRead указывает, что в функции обратного вызова EvtIoRead доступ к буферу запросов ввода-вывода, полученному после завершения запроса ввода-вывода, невозможен. Существует 14 DDIs, которые служат в качестве возможных методов доступа к буферу. |
|
Правило BufAfterReqCompletedReadA указывает, что в функции обратного вызова EvtIoRead доступ к буферу запросов ввода-вывода, полученному после завершения запроса ввода-вывода, невозможен. Существует 14 DDIs, которые служат в качестве возможных методов доступа к буферу. |
|
Правило BufAfterReqCompletedWrite указывает, что в функции обратного вызова EvtIoWrite после завершения запроса ввода-вывода невозможно получить доступ к буферу запроса ввода-вывода. |
|
Правило BufAfterReqCompletedWriteA указывает, что в функции обратного вызова EvtIoWrite доступ к буферу запросов ввода-вывода, полученный после завершения запроса ввода-вывода, невозможен. |
|
Правило ChildDeviceInitApi указывает, что для дочернего устройства методы инициализации объекта платформы должны вызываться, прежде чем драйвер вызовет метод WdfDeviceCreate для дочернего объекта устройства. |
|
Правило ControDeviceDeleted указывает, что если драйвер PnP создает объект управляющего устройства, драйвер должен удалить объект управляющего устройства в одной из функций обратного вызова очистки перед выгрузкой драйвера. |
|
Правило ControlDeviceInitAPI указывает, что WdfControlDeviceInitAllocate и все другие DDIS инициализации объекта устройства, которые настраивают структуру WDFDEVICE_INIT для управляющего устройства, должны вызываться перед WdfDeviceCreate для управляющего устройства. |
|
Правило CtlDeviceFinishInitDeviceAdd указывает, что если драйвер создает объект управляющего устройства в функции обратного вызова EvtDriverDeviceAdd , он должен вызывать WdfControlFinishInitializing после создания устройства и перед выходом из функции обратного вызова EvtDriverDeviceAdd . Это правило не применяется для драйверов, отличных от PnP. |
|
Правило CtlDeviceFinishInitDrEntry указывает, что если драйвер создает объект управляющего устройства в функции обратного вызова DriverEntry , он должен вызвать WdfControlFinishInitializing после создания устройства и перед выходом из функции обратного вызова EvtDriverDeviceAdd . Это правило не применяется для драйверов, отличных от PnP. |
|
Правило DeviceCreateFail указывает, что EVT_WDF_DRIVER_DEVICE_ADD возвращает состояние ошибки при сбое вызова WdfDeviceCreate . |
|
Правило DeviceInitAllocate указывает, что для устройства PDO или объекта управляющего устройства необходимо вызвать методы инициализации объекта устройства платформы WdfPdoInitAllocate или WdfControlDeviceInitAllocate , прежде чем драйвер вызовет WdfDeviceCreate. |
|
Для устройства FDO методы инициализации объекта платформы устройства и методы инициализации FDO платформы должны вызываться, прежде чем драйвер вызовет метод WdfDeviceCreate для объекта устройства. |
|
Правило DoubleDeviceInitFree указывает, что драйверы не должны освобождать структуру инициализации устройства дважды. |
|
Правило DriverCreate указывает, что драйвер, использующий платформу драйвера в режиме ядра (KMDF), должен вызвать метод WdfDriverCreate , чтобы создать объект драйвера платформы из подпрограммы DriverEntry . |
|
Правило InitFreeDeviceCallback указывает, что драйвер должен вызывать WdfDeviceInitFree , если драйвер обнаруживает ошибку при инициализации нового объекта устройства платформы, и если драйвер получил WDFDEVICE_INIT структуру из вызова WdfControlDeviceInitAllocate. |
|
Правило InitFreeDeviceCreate указывает, что драйвер должен вызывать WdfDeviceInitFree вместо WdfDeviceCreate , если возникает ошибка в одном из методов инициализации объекта устройства и если драйвер получил структуру WDFDEVICE_INIT из вызова WdfControlDeviceInitAllocate. |
|
Правило InitFreeDeviceCreateType2 указывает, что драйвер не должен вызывать WdfDeviceCreate после вызова WdfDeviceInitFree. |
|
Правило InitFreeDeviceCreateType4 указывает, что драйвер должен вызывать WdfDeviceInitFree , если драйвер обнаруживает ошибку при вызове WdfDeviceCreate и если драйвер получил структуру WDFDEVICE_INIT из вызова WdfControlDeviceInitAllocate. |
|
Правило InitFreeNull указывает, что DDIs, получающие PWDFDEVICE_INIT в качестве параметра, не могут вызываться с помощью указателя NULL на структуру WDFDEVICE_INIT . |
|
Правило MdlAfterReqCompletedIntIoctl указывает, что в функции обратного вызова EvtIoInternalDeviceControl невозможно получить доступ к списку дескрипторов памяти (MDL) после завершения запроса ввода-вывода. |
|
Правило MdlAfterReqCompletedIntIoctlA указывает, что в функции обратного вызова EvtIoInternalDeviceControl невозможно получить доступ к списку дескрипторов памяти (MDL) после завершения запроса ввода-вывода. |
|
Правило MdlAfterReqCompletedIoctl указывает, что в функции обратного вызова EvtIoDeviceControl невозможно получить доступ к списку дескрипторов памяти (MDL) после завершения запроса ввода-вывода. |
|
Правило MdlAfterReqCompletedIoctlA указывает, что в функции обратного вызова EvtIoDeviceControl после завершения запроса ввода-вывода невозможно получить доступ к списку дескрипторов памяти (MDL). |
|
Правило MdlAfterReqCompletedRead указывает, что в функции обратного вызова EvtIoRead полученный объект списка дескрипторов памяти (MDL) недоступен после завершения запроса ввода-вывода. |
|
Правило MdlAfterReqCompletedReadA указывает, что в функции обратного вызова EvtIoRead полученный объект списка дескрипторов памяти (MDL) недоступен после завершения запроса ввода-вывода. |
|
Правило MdlAfterReqCompletedWrite указывает, что в функции обратного вызова EvtIoWrite полученный объект списка дескрипторов памяти (MDL) не может быть получен после завершения запроса ввода-вывода. |
|
Правило MdlAfterReqCompletedWriteA указывает, что в функции обратного вызова EvtIoWrite полученный объект списка дескрипторов памяти (MDL) недоступен после завершения запроса ввода-вывода. |
|
Правило MemAfterReqCompletedIntIoctl указывает, что в функции обратного вызова EvtIoInternalDeviceControl невозможно получить доступ к объекту памяти платформы после завершения запроса ввода-вывода. |
|
Правило MemAfterReqCompletedIntIoctlA указывает, что в функции обратного вызова EvtIoInternalDeviceControl доступ к объекту памяти платформы после завершения запроса ввода-вывода невозможен. |
|
Правило MemAfterReqCompletedIoctl указывает, что в функции обратного вызова EvtIoDeviceControl невозможно получить доступ к объекту памяти платформы после завершения запроса ввода-вывода. |
|
Правило MemAfterReqCompletedIoctlA указывает, что в функции обратного вызова EvtIoDeviceControl после завершения запроса ввода-вывода доступ к объекту памяти платформы невозможен. |
|
Правило MemAfterReqCompletedRead указывает, что в функции обратного вызова EvtIoRead невозможно получить доступ к объекту памяти платформы после выполнения запроса ввода-вывода. |
|
Правило MemAfterReqCompletedReadA указывает, что в функции обратного вызова EvtIoRead невозможно получить доступ к объекту памяти платформы после завершения запроса ввода-вывода. |
|
Правило MemAfterReqCompletedWrite указывает, что в функции обратного вызова EvtIoWrite невозможно получить доступ к объекту памяти платформы после завершения запроса ввода-вывода. |
|
Правило MemAfterReqCompletedWriteA указывает, что в функции обратного вызова EvtIoWrite невозможно получить доступ к объекту памяти платформы после завершения запроса ввода-вывода. |
|
Правило NullCheck проверяет, что значение NULL в коде драйвера не разыменовывается позже в драйвере. Это правило сообщает о дефекте, если выполняется одно из следующих условий:
При нарушениях правил NullCheck наиболее релевантные операторы кода выделяются в области дерева трассировки. Дополнительные сведения о работе с выходными данными отчета см. в разделах Отчет о средстве проверки статических драйверов и Основные сведения о средстве просмотра трассировки. |
|
Правило PdoDeviceInitAPI указывает, что WdfPdoInitAllocate и все другие DDIS инициализации объекта устройства, которые настраивают структуру WDFDEVICE_INIT для физического объекта устройства (PDO), должны вызываться до вызова драйвером WdfDeviceCreate для PDO. |
|
Правило PdoInitFreeDeviceCallback указывает, что драйвер должен вызывать WdfDeviceInitFree , если возникает ошибка, когда драйвер вызывает любую функцию инициализации объекта устройства платформы. |
|
Правило PdoInitFreeDeviceCreate указывает, что драйвер должен вызывать WdfDeviceInitFree вместо WdfDeviceCreate , если в одной из функций инициализации объекта устройства возникает ошибка и если драйвер получил структуру WDFDEVICE_INIT из вызова WdfPdoInitAllocate. |
|
Правило PdoInitFreeDeviceCreateType2 указывает, что драйвер не должен вызывать WdfDeviceCreate после вызова WdfDeviceInitFree. |
|
Правило PdoInitFreeDeviceCreateType4 указывает, что драйвер должен вызывать WdfDeviceInitFree , если возникает ошибка, когда драйвер вызывает WdfDeviceCreate. |
|
Правило ControlDeviceInitAllocate указывает, что для объекта управляющего устройства драйвер должен вызвать метод инициализации объекта устройства платформы WdfControlDeviceInitAllocate , прежде чем драйвер вызовет WdfDeviceCreate. |
|
Правило InputBufferAPI указывает, что правильные DDIs для получения буфера используются в функции обратного вызова EvtIoRead. В функции обратного вызова EvtIoRead не могут быть вызваны следующие DDIs для извлечения буфера: |
Выбор набора правил использования DDI
Выберите проект драйвера (.vcxProj) в Microsoft Visual Studio. В меню Драйвер щелкните Запустить средство проверки статических драйверов....
Перейдите на вкладку Правила . В разделе Наборы правил выберите DDIUsage.
Чтобы выбрать набор правил по умолчанию в окне командной строки разработчика Visual Studio, укажите DDIUsage.sdv с параметром /проверка. Пример:
msbuild /t:sdv /p:Inputs="/check:DDIUsage.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
Дополнительные сведения см. в разделах Использование статического средства проверки драйверов для поиска дефектов в драйверах и Команд статического средства проверки драйверов (MSBuild).