Declaraciones de función KMDF del comprobador de controladores estáticos
Para habilitar SDV para comprobar el controlador KMDF, debe declarar cada función de devolución de llamada mediante un tipo de rol de función de devolución de llamada. Los tipos de rol de función de devolución de llamada se definen en los distintos archivos de encabezado WDF y se incluyen al compilar el controlador con el archivo de encabezado Wdf.h. En la tabla siguiente se muestran los tipos de rol de función y las funciones de devolución de llamada de eventos a las que están asociados.
Debe declarar las funciones de devolución de llamada del controlador antes de las definiciones de función de devolución de llamada. En el ejemplo siguiente se muestra la declaración de tipo de rol de función para la función de devolución de llamada EvtDriverDeviceAdd . En este ejemplo, la función de devolución de llamada se denomina EvtDriverDeviceAdd.
#include <NTDDK.h>
#include <wdf.h>
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
Si una función de devolución de llamada tiene una declaración de prototipo de función, debe reemplazar el prototipo de función por la declaración de tipo de rol de función. Para obtener más información sobre las declaraciones de tipo de rol de función, vea Using Function Role Type Declarations.
En la tabla siguiente se muestran los tipos de función de devolución de llamada y las funciones de devolución de llamada de eventos a las que están asociados.
Tipo de rol de función | Función de devolución de llamada de eventos |
---|---|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP |
|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY |
|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE |
|
EVT_WDF_CHILD_LIST_CREATE_DEVICE |
|
EVT_WDF_CHILD_LIST_DEVICE_REENUMERATED |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE |
|
EVT_WDF_CHILD_LIST_SCAN_FOR_CHILDREN |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_SX |
|
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
|
EVT_WDF_DEVICE_CONTEXT_DESTROY |
|
EVT_WDF_DEVICE_D0_ENTRY |
|
EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED |
|
EVT_WDF_DEVICE_D0_EXIT |
|
EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED |
|
EVT_WDF_DEVICE_DISABLE_WAKE_AT_BUS |
|
EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 |
|
EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX |
|
EVT_WDF_DEVICE_EJECT |
|
EVT_WDF_DEVICE_ENABLE_WAKE_AT_BUS |
|
EVT_WDF_DEVICE_FILE_CREATE |
|
EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS |
|
EVT_WDF_DEVICE_PNP_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_POWER_POLICY_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_POWER_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_PREPARE_HARDWARE |
|
EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST |
|
EVT_WDF_DEVICE_QUERY_REMOVE |
|
EVT_WDF_DEVICE_QUERY_STOP |
|
EVT_WDF_DEVICE_RELATIONS_QUERY |
|
EVT_WDF_DEVICE_RELEASE_HARDWARE |
|
EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES |
|
EVT_WDF_DEVICE_RESOURCE_REQUIREMENTS_QUERY |
|
EVT_WDF_DEVICE_RESOURCES_QUERY |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_FLUSH |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_SUSPEND |
|
EVT_WDF_DEVICE_SET_LOCK |
|
EVT_WDF_DEVICE_SHUTDOWN_NOTIFICATION |
|
EVT_WDF_DEVICE_SURPRISE_REMOVAL |
|
EVT_WDF_DEVICE_USAGE_NOTIFICATION |
|
EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED |
|
EVT_WDF_DEVICE_WAKE_FROM_SX_TRIGGERED |
|
EVT_WDF_DMA_ENABLER_DISABLE |
|
EVT_WDF_DMA_ENABLER_ENABLE |
|
EVT_WDF_DMA_ENABLER_FILL |
|
EVT_WDF_DMA_ENABLER_FLUSH |
|
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_START |
|
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP |
|
EVT_WDF_DPC |
|
EVT_WDF_DRIVER_DEVICE_ADD |
|
EVT_WDF_DRIVER_UNLOAD |
|
EVT_WDF_FILE_CLEANUP |
|
EVT_WDF_FILE_CLOSE |
|
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
|
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
|
EVT_WDF_INTERRUPT_DISABLE |
|
EVT_WDF_INTERRUPT_DPC |
|
EVT_WDF_INTERRUPT_ENABLE |
|
EVT_WDF_INTERRUPT_ISR |
|
EVT_WDF_INTERRUPT_SYNCHRONIZE |
|
EVT_WDF_IO_IN_CALLER_CONTEXT |
|
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
|
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
|
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE |
|
EVT_WDF_IO_QUEUE_IO_DEFAULT |
|
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL |
|
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL |
|
EVT_WDF_IO_QUEUE_IO_READ |
|
EVT_WDF_IO_QUEUE_IO_RESUME |
|
EVT_WDF_IO_QUEUE_IO_STOP |
|
EVT_WDF_IO_QUEUE_IO_WRITE |
|
EVT_WDF_IO_QUEUE_STATE |
|
EVT_WDF_IO_TARGET_QUERY_REMOVE |
|
EVT_WDF_IO_TARGET_REMOVE_CANCELED |
|
EVT_WDF_IO_TARGET_REMOVE_COMPLETE |
|
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
|
EVT_WDF_OBJECT_CONTEXT_DESTROY |
|
EVT_WDF_PROGRAM_DMA |
|
EVT_WDF_REQUEST_CANCEL |
|
EVT_WDF_REQUEST_COMPLETION_ROUTINE |
|
EVT_WDF_TIMER |
|
EVT_WDF_TRACE_CALLBACK |
|
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD |
|
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE |
|
EVT_WDF_WMI_INSTANCE_SET_INSTANCE |
|
EVT_WDF_WMI_INSTANCE_SET_ITEM |
|
EVT_WDF_WMI_PROVIDER_FUNCTION_CONTROL |
|
EVT_WDF_WORKITEM |
|
EVT_WDFDEVICE_WDM_IRP_PREPROCESS |
Tipos de roles de función que permiten varias funciones de devolución de llamada
Hay algunos tipos de roles de función que pueden tener varias funciones de devolución de llamada de eventos asociadas. Por ejemplo, un controlador puede tener varias funciones de devolución de llamada EvtTimerFunc o EvtDpcFunc . En la tabla siguiente se muestra el número máximo de devoluciones de llamada compatibles con SDV para cada tipo de rol de función. Aunque no es incorrecto que un controlador tenga más del número máximo de funciones de devolución de llamada enumeradas en la tabla, complica el proceso de comprobación al usar SDV. Para obtener información sobre los cambios que es posible que tenga que realizar en el archivo Sdv-map.h para dar cabida a las funciones de devolución de llamada adicionales, consulte Duplicate entry points for a function role type (Puntos de entrada duplicados para un tipo de rol de función).
Tipo de rol de función | Número máximo de funciones de devolución de llamada |
---|---|
EVT_WDF_DPC |
7 |
EVT_WDF_INTERRUPT_SYNCHRONIZE |
11 |
EVT_WDF_TIMER |
6 |
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD |
5 |
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE |
5 |
EVT_WDF_WMI_INSTANCE_SET_INSTANCE |
5 |
EVT_WDF_WMI_INSTANCE_SET_ITEM |
5 |
Tipos de roles de función y colas de E/S
Use los siguientes tipos de rol de función al declarar los controladores de solicitudes y las funciones de devolución de llamada que dependen del marco de KMDF para entregar las solicitudes de E/S al controlador (para el envío secuencial o paralelo). No use estos tipos de roles de función para las funciones que reenvía manualmente las solicitudes de la cola predeterminada a otras colas (distribución manual). SDV no admite un modelo de memoria que le permita realizar un seguimiento de las solicitudes de una cola a otra.
Para obtener más información sobre las colas de E/S, consulte Creación de colas de E/S.
Tipos de roles de función usados para la cola de E/S configurada para el envío manual |
---|
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE |
EVT_WDF_IO_QUEUE_IO_DEFAULT |
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL |
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL |
EVT_WDF_IO_QUEUE_IO_READ |
EVT_WDF_IO_QUEUE_IO_RESUME |
EVT_WDF_IO_QUEUE_IO_STOP |
EVT_WDF_IO_QUEUE_IO_WRITE |
EVT_WDF_IO_QUEUE_STATE |
Tipos de roles de función para las funciones EvtCleanupCallback y EvtDestroyCallback
Debe declarar la función EvtCleanupCallback y EvtDestroyCallback con tipos de roles de función específicos del objeto. SDV requiere estos tipos de roles específicos del objeto para determinar si el controlador usa correctamente la función de devolución de llamada. Use las tablas siguientes para determinar qué tipo de función se va a usar.
Tipo de objeto | Tipo de rol de función para EvtCleanupCallback |
---|---|
Objeto de dispositivo |
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
Objeto de cola de E/S |
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
File (objeto) |
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
Todos los demás objetos |
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
Tipo de objeto | Tipo de rol de función para EvDestroyCallback |
---|---|
Objeto de dispositivo |
EVT_WDF_DEVICE_CONTEXT_DESTROY |
Objeto de cola de E/S |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
File (objeto) |
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
Todos los demás objetos |
EVT_WDF_OBJECT_CONTEXT_DESTROY |