Usar comprobador de controladores estáticos para buscar defectos en controladores de Windows

El comprobador de controladores estáticos (SDV) usa un conjunto de reglas de interfaz y un modelo del sistema operativo para determinar si el controlador interactúa correctamente con el sistema operativo Windows. SDV busca defectos en el código del controlador que podrían apuntar a posibles errores en los controladores.

SDV puede analizar los controladores en modo kernel que se ajustan a uno de los siguientes modelos de controladores: WDM, KMDF, NDIS o Storport. Para obtener más información, consulte Controladores admitidos y Determinar si el comprobador de controladores estáticos admite el controlador o la biblioteca. Además, SDV proporciona compatibilidad limitada (un conjunto de reglas gravemente restringido centrado en errores generales, como desreferencias null) para los controladores que no siguen los modelos de controladores anteriores.

Preparación del código fuente

Siga estos pasos para preparar el código para su análisis.

  1. Declarar funciones proporcionadas por el controlador mediante tipos de roles de función

    SDV requiere que las funciones se declaren mediante declaraciones de tipo de rol de función. Por ejemplo, se debe declarar una rutina DriverEntry mediante el tipo de rol de función DRIVER_INITIALIZE:

    DRIVER_INITIALIZE DriverEntry;
    

    Después de la declaración, implemente (o defina) la rutina de devolución de llamada de la siguiente manera:

    /
    // Driver initialization routine
    //
    NTSTATUS
      DriverEntry(
        _In_ struct _DRIVER_OBJECT  *DriverObject,
        _In_ PUNICODE_STRING  RegistryPath
        )
      {
          // Function body
      }
    

    Cada modelo de controlador compatible tiene un conjunto de tipos de roles de función para las funciones de devolución de llamada del controlador y las rutinas de envío. Estos tipos de rol de función se declaran en los archivos de encabezado WDK. Por ejemplo, este es el prototipo de función para el tipo de rol DRIVER_INITIALIZE tal y como aparece en Wdm.h.

    /
    // Define driver initialization routine type.
    //
    _Function_class_(DRIVER_INITIALIZE)
    _IRQL_requires_same_
    typedef
    NTSTATUS
    DRIVER_INITIALIZE (
        _In_ struct _DRIVER_OBJECT *DriverObject,
        _In_ PUNICODE_STRING RegistryPath
        );
    
    typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
    

    Dado que los tipos de rol de función ya están definidos en los archivos de encabezado de WDK, solo tiene que declarar las funciones de devolución de llamada para que sean de ese tipo. En este caso, declara que DriverEntry es de tipo DRIVER_INITIALIZE. Para obtener una lista completa de los tipos de roles de función para los modelos de controlador, consulte Uso de declaraciones de tipo de rol de función.

  2. Ejecutar análisis de código para C/C++

    Para ayudarle a determinar si el código fuente está preparado, ejecute la herramienta Análisis de código en Visual Studio. La herramienta Análisis de código busca declaraciones de tipo de rol de función, que SDV requiere. La herramienta Análisis de código puede ayudar a identificar las declaraciones de función que podrían haberse perdido o advertirle cuando los parámetros de la definición de función no coinciden con los del tipo de rol de función.

    • Abra el proyecto de controlador en Visual Studio.
    • En el menú Compilar , haga clic en Ejecutar análisis de código en la solución.

    Los resultados se muestran en la ventana Análisis de código . Corrija las declaraciones de función que se hayan perdido. También puede configurar la herramienta Análisis de código para que se ejecute cada vez que compile la solución.

    En la tabla siguiente se muestran algunas de las advertencias que la herramienta Análisis de código podría encontrar en el código del controlador. Para ejecutar el comprobador de controladores estáticos, el controlador debe estar libre de estos defectos.

    Análisis de código para la advertencia de C/C++ Descripción
    C28101 El módulo Controladores ha inferido que la función actual es una <función de tipo> de función.
    C28022 Las clases de función de esta función no coinciden con las de la definición de tipo que se usa para definirlas.
    C28023 La función que se asigna o se pasa debe tener una anotación de _Function_class_ para al menos una de las clases
    C28024 El puntero de función al que se asigna tiene anotada la clase de función, que no está incluida en la lista de clases de función.
    C28169 La función <> dispatch no tiene ninguna anotación _Dispatch_type_
    C28208 La firma de función no coincide con las declaraciones de función

Ejecución del comprobador de controladores estáticos

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

    Se abre la aplicación Comprobador de controladores estáticos, donde puede controlar, configurar y programar cuando el comprobador de controladores estáticos realiza un análisis.

  2. Si el controlador incluye una biblioteca, haga clic en la pestaña Bibliotecas y haga clic en Agregar biblioteca para agregar la biblioteca.

    Vaya al directorio del código fuente de la biblioteca y seleccione el archivo de proyecto (.vcxProj). Agregue todas las bibliotecas que incluye el controlador. Las bibliotecas se deben agregar antes de que SDV analice el controlador. Al iniciar un análisis del controlador, SDV también analiza las bibliotecas que no se han procesado. Una vez procesada una biblioteca, se almacena en la memoria caché global de SDV. Para obtener más información, vea Procesamiento de bibliotecas en comprobador de controladores estáticos.

  3. Compruebe los valores de configuración del comprobador de controladores estáticos. Haga clic en la pestaña Configurar.

    Configuración del proyecto La configuración del proyecto muestra la configuración y la plataforma que seleccionó en Visual Studio.

    Recursos En la mayoría de los casos, puede usar la configuración predeterminada. Si SDV informa de tiempo de espera, GiveUp o Spaceout, puede intentar ajustar esta configuración. Para obtener más información, consulte Recomendaciones para solucionar problemas del comprobador de controladores estáticos.

    Horario Seleccione una hora de inicio para que comience la comprobación. La configuración predeterminada es comenzar el análisis inmediatamente después de hacer clic en Iniciar en la pestaña Principal . Según el tamaño del controlador y su complejidad, el análisis estático puede tardar mucho tiempo en ejecutarse. Es posible que quiera programar el análisis para comenzar cuando sea más conveniente para usted; por ejemplo, al final del día.

    Nota

    ]Asegúrese de comprobar el plan de administración de energía del equipo para asegurarse de que el equipo no entrará en estado de suspensión durante el análisis.

  4. Haga clic en la pestaña Reglas para seleccionar qué reglas de uso de la API de controladores comprobará al iniciar el análisis.

    Static Driver Verifier detecta el tipo de controlador que está analizando (WDF, WDM, NDIS o Storport) y selecciona el conjunto predeterminado de reglas para el tipo de controlador. Si es la primera vez que ejecuta SDV en el controlador, debe ejecutar el conjunto de reglas predeterminado.

    Para obtener información sobre las reglas, consulte Reglas de cumplimiento de DDI.

  5. Inicie el análisis estático. Haga clic en la pestaña Principal y haga clic en Inicio. Al hacer clic en Inicio, se muestra un mensaje para informarle de que el análisis estático está programado y que el análisis puede tardar mucho tiempo en ejecutarse. Haga clic en Aceptar para continuar. El análisis comienza en el momento programado.

Visualización y análisis de los resultados

A medida que continúa el análisis estático, SDV notifica el estado del análisis. Una vez completado el análisis, SDV notifica los resultados y las estadísticas. Si el controlador no cumple una regla de uso de API, el resultado se notifica como un defecto.

Si se encontraron problemas, SDV los muestra en las páginas Advertencias y Errores . En la página Propiedades del controlador se muestran los resultados de las pruebas de determinadas propiedades del controlador. Las pruebas de propiedades del controlador se usan para identificar las características del controlador para calificar aún más el análisis. Puede usar los resultados de Las propiedades del controlador para confirmar las propiedades esperadas y las funcionalidades admitidas del controlador.

Para ver defectos específicos en el informe comprobador de controladores estáticos, haga clic en el defecto en el panel Resultados . Se abre el Visor de seguimiento, que muestra un seguimiento de la ruta de acceso del código a la infracción de la regla. Para obtener más información, consulte Interpretación de los resultados del comprobador de controladores estáticos.

Nota

El comprobador de controladores estáticos conserva los resultados y la configuración del análisis. Para borrar los resultados, haga clic en Limpiar.

Solución de problemas de resultados del comprobador de controladores estáticos

Si SDV informa de que no se encontraron defectos, compruebe la pestaña Principal para asegurarse de que se detecten puntos de entrada. Si el controlador no declara funciones mediante los tipos de rol de función, SDV no podrá analizar y encontrar defectos en el código del controlador. Para obtener más información, vea Uso de declaraciones de tipo de rol de función.

Si SDV informa de tiempos de espera o no devuelve resultados útiles, es posible que tenga que cambiar algunas opciones de configuración de SDV. Para obtener más información sobre cómo solucionar problemas de SDV, consulte Recomendaciones para solucionar problemas del comprobador de controladores estáticos.

Determinar si el comprobador de controladores estáticos admite el controlador o la biblioteca

Uso de declaraciones de tipo de rol de función

Reglas de comprobador de controladores estáticos

Herramienta de análisis de código