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 |
---|---|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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 . |
|
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. |
|
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. |
|
La regla DoubleDeviceInitFree especifica que los controladores no deben liberar la estructura de inicialización del dispositivo dos veces. |
|
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 . |
|
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. |
|
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. |
|
La regla InitFreeDeviceCreateType2 especifica que un controlador no debe llamar a WdfDeviceCreate después de llamar a WdfDeviceInitFree. |
|
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. |
|
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 . |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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:
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. |
|
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. |
|
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. |
|
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. |
|
La regla PdoInitFreeDeviceCreateType2 especifica que un controlador no debe llamar a WdfDeviceCreate después de llamar a WdfDeviceInitFree. |
|
La regla PdoInitFreeDeviceCreateType4 especifica que el controlador debe llamar a WdfDeviceInitFree si se produce un error cuando el controlador llama a WdfDeviceCreate. |
|
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. |
|
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
Seleccione el proyecto de controlador (.vcxProj) en Microsoft Visual Studio. En el menú Controlador , haga clic en Iniciar comprobador de controladores estáticos....
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).