Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Используйте эти правила, чтобы убедиться, что драйвер правильно использует 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 с параметром /check . Рассмотрим пример.
msbuild /t:sdv /p:Inputs="/check:DDIUsage.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах и команды средства проверки статических драйверов (MSBuild).