Compartir a través de


Conjunto de reglas de uso de DDI (KMDF)

Use estas reglas para comprobar que el controlador usa correctamente los DDIs de KMDF.

En esta sección

Tema Descripción

BufAfterReqCompletedIoctl

La regla BufAfterReqCompletedIoctl especifica que dentro de la función de devolución de llamada EvtIoDeviceControl , no se puede acceder al búfer de solicitud de E/S recuperado una vez completada la solicitud de E/S.

BufAfterReqCompletedIntIoctl

La regla BufAfterReqCompletedIntIoctl especifica que una vez completada una solicitud, no se puede tener acceso a su búfer (solo dentro de la función de devolución de llamada EvtIoInternalDeviceControl ). El búfer se recupera llamando a WdfRequestRetrieveOutputBuffer o WdfRequestRetrieveUnsafeUserOutputBuffer o WdfRequestRetrieveInputBuffer o WdfRequestRetrieveUnsafeUserInputBuffer.

BufAfterReqCompletedIntIoctlA

La regla BufAfterReqCompletedIntIoctlA comprueba que una vez completada una solicitud, no se puede tener acceso a su búfer (solo dentro de la devolución de llamada EvtIoInternalDeviceControl ). El búfer se recuperó llamando a WdfRequestRetrieveInputBuffer o WdfRequestRetrieveOutputBuffer o WdfRequestRetrieveUnsafeUserInputBuffer o WdfRequestRetrieveUnsafeUserOutputBuffer.

BufAfterReqCompletedIoctlA

La regla BufAfterReqCompletedIoctlA especifica que dentro de la función de devolución de llamada EvtIoDeviceControl , no se puede acceder al búfer de solicitud de E/S recuperado una vez completada la solicitud de E/S.

BufAfterReqCompletedRead

La regla BufAfterReqCompletedRead especifica que dentro de la función de devolución de llamada EvtIoRead , no se puede acceder al búfer de solicitud de E/S recuperado una vez completada la solicitud de E/S. Hay 14 DDIs que sirven como métodos de acceso al búfer posibles.

BufAfterReqCompletedReadA

La regla BufAfterReqCompletedReadA especifica que dentro de la función de devolución de llamada EvtIoRead , no se puede tener acceso al búfer de solicitud de E/S recuperado una vez completada la solicitud de E/S. Hay 14 DDIs que sirven como métodos de acceso al búfer posibles.

BufAfterReqCompletedWrite

La regla BufAfterReqCompletedWrite especifica que dentro de la función de devolución de llamada EvtIoWrite , no se puede tener acceso al búfer de solicitud de E/S recuperado una vez completada la solicitud de E/S.

BufAfterReqCompletedWriteA

La regla BufAfterReqCompletedWriteA especifica que dentro de la función de devolución de llamada EvtIoWrite , no se puede tener acceso al búfer de solicitud de E/S recuperado una vez completada la solicitud de E/S.

ChildDeviceInitApi

La regla ChildDeviceInitApi especifica que, para un dispositivo secundario, se debe llamar a los métodos de inicialización de objetos de dispositivo de marco antes de que el controlador llame al método WdfDeviceCreate para el objeto de dispositivo secundario.

ControlDeviceDeleted

La regla ControDeviceDeleted especifica que si un controlador PnP crea un objeto de dispositivo de control, el controlador debe eliminar el objeto de dispositivo de control en una de las funciones de devolución de llamada de limpieza antes de que se descargue el controlador.

ControlDeviceInitAPI

La regla ControlDeviceInitAPI especifica que se debe llamar a WdfControlDeviceInitAllocate y todos los demás DDIs de inicialización de objetos de dispositivo que configuran una estructura de WDFDEVICE_INIT para el dispositivo de control antes de WdfDeviceCreate para el dispositivo de control.

CtlDeviceFinishInitDeviceAdd

La regla CtlDeviceFinishInitDeviceAdd especifica que si un controlador crea un objeto de dispositivo de control en una función de devolución de llamada EvtDriverDeviceAdd , debe llamar a WdfControlFinishInitializing después de crear el dispositivo y antes de salir de la función de devolución de llamada EvtDriverDeviceAdd . Esta regla no se aplica a los controladores que no son PnP.

CtlDeviceFinishInitDrEntry

La regla CtlDeviceFinishInitDrEntry especifica que si un controlador crea un objeto de dispositivo de control en una función de devolución de llamada DriverEntry , debe llamar a WdfControlFinishInitializing una vez creado el dispositivo y antes de salir de la función de devolución de llamada EvtDriverDeviceAdd . Esta regla no se aplica a los controladores que no son PnP.

DeviceCreateFail

La regla DeviceCreateFail especifica que EVT_WDF_DRIVER_DEVICE_ADD devuelve un estado de error cuando se produce un error en la llamada a WdfDeviceCreate .

DeviceInitAllocate

La regla DeviceInitAllocate especifica que, para un dispositivo PDO o un objeto de dispositivo de control, se debe llamar a los métodos de inicialización de objetos de dispositivo de marco WdfPdoInitAllocate o WdfControlDeviceInitAllocate antes de que el controlador llame a WdfDeviceCreate.

DeviceInitAPI

Para un dispositivo FDO, se deben llamar a los métodos de inicialización de objetos de dispositivo de marco y a los métodos de inicialización de FDO de marco antes de que el controlador llame al método WdfDeviceCreate para el objeto de dispositivo.

DoubleDeviceInitFree

La regla DoubleDeviceInitFree especifica que los controladores no deben liberar la estructura de inicialización del dispositivo dos veces.

DriverCreate

La regla DriverCreate especifica que un controlador que usa kernel Mode Driver Framework (KMDF) debe llamar al método WdfDriverCreate para crear un objeto de controlador de marco desde su rutina DriverEntry .

InitFreeDeviceCallback

La regla InitFreeDeviceCallback especifica que un controlador debe llamar a WdfDeviceInitFree si el controlador encuentra un error mientras inicializa un nuevo objeto de dispositivo de marco y si el controlador recibió la estructura de WDFDEVICE_INIT de una llamada a WdfControlDeviceInitAllocate.

InitFreeDeviceCreate

La regla InitFreeDeviceCreate especifica que un controlador debe llamar a WdfDeviceInitFree en lugar de WdfDeviceCreate si se produce un error en uno de los métodos de inicialización del objeto de dispositivo y si el controlador recibió la estructura WDFDEVICE_INIT de una llamada a WdfControlDeviceInitAllocate.

InitFreeDeviceCreateType2

La regla InitFreeDeviceCreateType2 especifica que un controlador no debe llamar a WdfDeviceCreate después de llamar a WdfDeviceInitFree.

InitFreeDeviceCreateType4

La regla InitFreeDeviceCreateType4 especifica que un controlador debe llamar a WdfDeviceInitFree si el controlador encuentra un error mientras llama a WdfDeviceCreate y si el controlador recibió la estructura WDFDEVICE_INIT de una llamada a WdfControlDeviceInitAllocate.

InitFreeNull

La regla InitFreeNull especifica que las DDIs que reciben PWDFDEVICE_INIT como parámetro no se pueden llamar mediante un puntero NULL a una estructura de WDFDEVICE_INIT .

MdlAfterReqCompletedIntIoctl

La regla MdlAfterReqCompletedIntIoctl especifica que dentro de la función de devolución de llamada EvtIoInternalDeviceControl , no se puede tener acceso a la lista de descriptores de memoria (MDL) una vez completada la solicitud de E/S.

MdlAfterReqCompletedIntIoctlA

La regla MdlAfterReqCompletedIntIoctlA especifica que dentro de la función de devolución de llamada EvtIoInternalDeviceControl , no se puede tener acceso a la lista de descriptores de memoria (MDL) una vez completada la solicitud de E/S.

MdlAfterReqCompletedIoctl

La regla MdlAfterReqCompletedIoctl especifica que dentro de la función de devolución de llamada EvtIoDeviceControl , no se puede tener acceso a la lista de descriptores de memoria (MDL) una vez completada la solicitud de E/S.

MdlAfterReqCompletedIoctlA

La regla MdlAfterReqCompletedIoctlA especifica que dentro de la función de devolución de llamada EvtIoDeviceControl , no se puede tener acceso a la lista de descriptores de memoria (MDL) una vez completada la solicitud de E/S.

MdlAfterReqCompletedRead

La regla MdlAfterReqCompletedRead especifica que dentro de la función de devolución de llamada EvtIoRead , no se puede tener acceso al objeto de lista de descriptores de memoria (MDL) recuperado una vez completada la solicitud de E/S.

MdlAfterReqCompletedReadA

La regla MdlAfterReqCompletedReadA especifica que dentro de la función de devolución de llamada EvtIoRead , no se puede acceder al objeto de lista de descriptores de memoria (MDL) recuperado una vez completada la solicitud de E/S.

MdlAfterReqCompletedWrite

La regla MdlAfterReqCompletedWrite especifica que dentro de la función de devolución de llamada EvtIoWrite , no se puede acceder al objeto de lista de descriptores de memoria (MDL) recuperado una vez completada la solicitud de E/S.

MdlAfterReqCompletedWriteA

La regla MdlAfterReqCompletedWriteA especifica que dentro de la función de devolución de llamada EvtIoWrite , no se puede tener acceso al objeto de lista de descriptores de memoria (MDL) recuperado una vez completada la solicitud de E/S.

MemAfterReqCompletedIntIoctl

La regla MemAfterReqCompletedIntIoctl especifica que dentro de la función de devolución de llamada EvtIoInternalDeviceControl , no se puede tener acceso al objeto de memoria del marco una vez completada la solicitud de E/S.

MemAfterReqCompletedIntIoctlA

La regla MemAfterReqCompletedIntIoctlA especifica que dentro de la función de devolución de llamada EvtIoInternalDeviceControl , no se puede tener acceso al objeto de memoria del marco una vez completada la solicitud de E/S.

MemAfterReqCompletedIoctl

La regla MemAfterReqCompletedIoctl especifica que dentro de la función de devolución de llamada EvtIoDeviceControl , no se puede tener acceso al objeto de memoria del marco una vez completada la solicitud de E/S.

MemAfterReqCompletedIoctlA

La regla MemAfterReqCompletedIoctlA especifica que dentro de la función de devolución de llamada EvtIoDeviceControl , no se puede tener acceso al objeto de memoria del marco una vez completada la solicitud de E/S.

MemAfterReqCompletedRead

La regla MemAfterReqCompletedRead especifica que dentro de la función de devolución de llamada EvtIoRead , no se puede tener acceso al objeto de memoria del marco una vez completada la solicitud de E/S.

MemAfterReqCompletedReadA

La regla MemAfterReqCompletedReadA especifica que dentro de la función de devolución de llamada EvtIoRead , no se puede tener acceso al objeto de memoria del marco una vez completada la solicitud de E/S.

MemAfterReqCompletedWrite

La regla MemAfterReqCompletedWrite especifica que dentro de la función de devolución de llamada EvtIoWrite , no se puede tener acceso al objeto de memoria del marco una vez completada la solicitud de E/S.

MemAfterReqCompletedWriteA

La regla MemAfterReqCompletedWriteA especifica que dentro de la función de devolución de llamada EvtIoWrite , no se puede tener acceso al objeto de memoria del marco una vez completada la solicitud de E/S.

NullCheck

La regla NullCheck comprueba que un valor NULL dentro del código de controlador no se desreferencia más adelante en el controlador. Esta regla notifica un defecto si se cumple alguna de estas condiciones:

  • Hay una asignación de NULL que se desreferencia más adelante.
  • Hay un parámetro global o un procedimiento en un controlador que puede ser NULL que se desreferencia más adelante y hay una comprobación explícita en el controlador que sugiere que el valor inicial del puntero puede ser NULL.

Con las infracciones de la regla NullCheck, las instrucciones de código más relevantes se resaltan en el panel del árbol de seguimiento. Para obtener más información sobre cómo trabajar con la salida del informe, vea Informe de comprobador de controladores estáticos y Descripción del Visor de seguimiento.

PdoDeviceInitAPI

La regla PdoDeviceInitAPI especifica que se debe llamar a WdfPdoInitAllocate y a todos los demás DDIs de inicialización de objetos de dispositivo que configuran una estructura de WDFDEVICE_INIT para el objeto de dispositivo físico (PDO) antes de que el controlador llame a WdfDeviceCreate para el PDO.

PdoInitFreeDeviceCallback

La regla PdoInitFreeDeviceCallback especifica que el controlador debe llamar a WdfDeviceInitFree si se produce un error cuando el controlador llama a cualquier función de inicialización de objetos de dispositivo de marco.

PdoInitFreeDeviceCreate

La regla PdoInitFreeDeviceCreate especifica que un controlador debe llamar a WdfDeviceInitFree en lugar de WdfDeviceCreate si se produce un error en una de las funciones de inicialización de objetos de dispositivo y si el controlador recibió la estructura WDFDEVICE_INIT de una llamada a WdfPdoInitAllocate.

PdoInitFreeDeviceCreateType2

La regla PdoInitFreeDeviceCreateType2 especifica que un controlador no debe llamar a WdfDeviceCreate después de llamar a WdfDeviceInitFree.

PdoInitFreeDeviceCreateType4

La regla PdoInitFreeDeviceCreateType4 especifica que el controlador debe llamar a WdfDeviceInitFree si se produce un error cuando el controlador llama a WdfDeviceCreate.

ControlDeviceInitAllocate

La regla ControlDeviceInitAllocate especifica que para un objeto de dispositivo de control, el controlador debe llamar al método de inicialización del objeto de dispositivo de marco WdfControlDeviceInitAllocate antes de que el controlador llame a WdfDeviceCreate.

InputBufferAPI

La regla InputBufferAPI especifica que los DDIs correctos para la recuperación del búfer se usan en la función de devolución de llamada EvtIoRead. Dentro de la función de devolución de llamada EvtIoRead , no se puede llamar a las siguientes DDIs para la recuperación del búfer:

Para seleccionar el conjunto de reglas de uso de DDI

  1. Seleccione el proyecto de controlador (.vcxProj) en Microsoft Visual Studio. En el menú Controlador , haga clic en Iniciar comprobador de controladores estáticos....

  2. Haga clic en la pestaña Reglas . En Conjuntos de reglas, seleccione DDIUsage.

    Para seleccionar el conjunto de reglas predeterminado en una ventana del símbolo del sistema para desarrolladores de Visual Studio, especifique DDIUsage.sdv con la opción /check . Por ejemplo:

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

    Para obtener más información, consulte Uso del comprobador de controladores estáticos para buscar defectos en controladores y comandos de comprobador de controladores estáticos (MSBuild).