DRIVER_DISPATCH función de devolución de llamada (wdm.h)
La rutina de devolución de llamada ofrece varios IRP. Para obtener una lista de códigos de función, vea Comentarios.
Sintaxis
DRIVER_DISPATCH DriverDispatch;
NTSTATUS DriverDispatch(
[in, out] _DEVICE_OBJECT *DeviceObject,
[in, out] _IRP *Irp
)
{...}
Parámetros
[in, out] DeviceObject
Puntero proporcionado por el autor de la llamada a una estructura de DEVICE_OBJECT . Este es el objeto de dispositivo para el dispositivo de destino, creado anteriormente por la rutina AddDevice del controlador.
[in, out] Irp
Puntero proporcionado por el autor de la llamada a una estructura IRP que describe la operación de E/S solicitada.
Valor devuelto
Si la rutina se realiza correctamente, debe devolver STATUS_SUCCESS. De lo contrario, debe devolver uno de los valores de estado de error definidos en Ntstatus.h.
Comentarios
Los parámetros de entrada para todas las rutinas dispatch se proporcionan en la estructura IRP a la que apunta Irp. Los parámetros adicionales se proporcionan en la ubicación de pila de E/S asociada del controlador, que se describe en la estructura de IO_STACK_LOCATION y se puede obtener mediante una llamada a IoGetCurrentIrpStackLocation.
Por lo general, todas las rutinas de distribución se ejecutan en un contexto de subproceso arbitrario en IRQL = PASSIVE_LEVEL, pero hay excepciones. Para obtener más información, vea Rutinas de distribución e IRQL.
Para obtener más información sobre las rutinas de envío, vea Escribir rutinas de distribución. Para obtener más información sobre los IRP, consulte Control de IRP.
IRP | Acerca de la implementación de la devolución de llamada |
---|---|
IRP_MJ_CLEANUP | La rutina DispatchCleanup de un controlador debe denominarse XxxDispatchCleanup, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchCleanup en DriverObject-MajorFunction>[IRP_MJ_CLEANUP]. |
IRP_MJ_CLOSE | La rutina DispatchClose de un controlador debe denominarse XxxDispatchClose, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchClose en DriverObject-MajorFunction>[IRP_MJ_CLOSE]. |
IRP_MJ_CREATE | La rutina DispatchCreate de un controlador debe denominarse XxxDispatchCreate, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchCreate en DriverObject-MajorFunction>[IRP_MJ_CREATE]. |
IRP_MJ_CREATE o IRP_MJ_CLOSE | Un controlador puede proporcionar una sola rutina DispatchCreateClose en lugar de rutinas DispatchCreate y DispatchClose independientes. La rutina DispatchCreateClose de un controlador debe denominarse XxxDispatchCreateClose, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchCreateClose en DriverObject-MajorFunction>[IRP_MJ_CREATE] y enDriverObject-MajorFunction>[IRP_MJ_CLOSE]. |
IRP_MJ_DEVICE_CONTROL | La rutina DispatchDeviceControl de un controlador debe denominarse XxxDispatchDeviceControl, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchDeviceControl en DriverObject-MajorFunction>[IRP_MJ_DEVICE_CONTROL]. El sistema usa las marcas FILE_XXX en el código de control de E/S para determinar si el remitente irP tiene los privilegios para enviar el IRP al objeto de dispositivo. Los controladores para Windows Server 2003 y versiones posteriores de Windows pueden usar la rutina IoValidateDeviceIoControlAccess para realizar comprobaciones de acceso más estrictas en DispatchDeviceControl. |
IRP_MJ_FLUSH_BUFFERS | La rutina DispatchFlushBuffers de un controlador debe denominarse XxxDispatchFlushBuffers, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchFlushBuffers en DriverObject-MajorFunction>[IRP_MJ_FLUSH_BUFFERS]. |
IRP_MJ_INTERNAL_DEVICE_CONTROL | La rutina DispatchInternalDeviceControl de un controlador debe denominarse XxxDispatchInternalDeviceControl, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchInternalDeviceControl en DriverObject-MajorFunction>[IRP_MJ_INTERNAL_DEVICE_CONTROL]. |
IRP_MJ_PNP | La rutina DispatchPnP de un controlador debe denominarse XxxDispatchPnP, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchPnP en DriverObject-MajorFunction>[IRP_MJ_PNP]. |
IRP_MJ_POWER | La rutina DispatchPower de un controlador debe denominarse XxxDispatchPower, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchPower en DriverObject-MajorFunction>[IRP_MJ_POWER]. |
IRP_MJ_QUERY_INFORMATION | La rutina DispatchQueryInformation de un controlador debe denominarse XxxDispatchQueryInformation, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchQueryInformation en DriverObject-MajorFunction>[IRP_MJ_QUERY_INFORMATION]. |
IRP_MJ_READ | La rutina DispatchRead de un controlador debe denominarse XxxDispatchRead, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchRead en DriverObject-MajorFunction>[IRP_MJ_READ]. |
IRP_MJ_READ o IRP_MJ_WRITE | Un controlador puede proporcionar una sola rutina DispatchReadWrite en lugar de rutinas de DispatchRead y DispatchWrite independientes. La rutina DispatchReadWrite de un controlador debe denominarse XxxDispatchReadWrite, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchReadWrite en DriverObject-MajorFunction>[IRP_MJ_READ] y enDriverObject-MajorFunction>[IRP_MJ_WRITE]. |
IRP_MJ_SET_INFORMATION | La rutina DispatchSetInformation de un controlador debe denominarse XxxDispatchSetInformation, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchSetInformation en DriverObject-MajorFunction>[IRP_MJ_SET_INFORMATION]. |
IRP_MJ_SHUTDOWN | La rutina DispatchShutdown de un controlador debe denominarse XxxDispatchShutdown, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchShutdown en DriverObject-MajorFunction>[IRP_MJ_SHUTDOWN]. Además, para recibir solicitudes de IRP_MJ_SHUTDOWN , un controlador debe llamar a IoRegisterShutdownNotification o IoRegisterLastChanceShutdownNotification para registrar su rutina DispatchShutdown con el sistema. |
IRP_MJ_SYSTEM_CONTROL | La rutina DispatchSystemControl de un controlador debe denominarse XxxDispatchSystemControl, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchSystemControl en DriverObject-MajorFunction>[IRP_MJ_SYSTEM_CONTROL]. |
IRP_MJ_WRITE | La rutina DispatchWrite de un controlador debe denominarse XxxDispatchWrite, donde Xxx es un prefijo específico del controlador. La rutina DriverEntry del controlador debe almacenar la dirección de la rutina DispatchWrite en DriverObject-MajorFunction>[IRP_MJ_WRITE]. |
Ejemplos
Para definir una rutina de devolución de llamada, primero debe proporcionar una declaración de función que identifique el tipo de rutina de devolución de llamada que está definiendo. Windows proporciona un conjunto de tipos de función de devolución de llamada para controladores. Declarar una función mediante los tipos de función de devolución de llamada ayuda a Code Analysis for Drivers, Static Driver Verifier (SDV) y otras herramientas de comprobación encuentran errores y es un requisito para escribir controladores para el sistema operativo Windows.
Por ejemplo, para definir una rutina de devolución de llamada DispatchCleanup denominada MyDispatchCleanup
, use el tipo DRIVER_DISPATCH como se muestra en este ejemplo de código:
DRIVER_DISPATCH MyDispatchCleanup;
A continuación, implemente la rutina de devolución de llamada de la siguiente manera:
_Use_decl_annotations_
NTSTATUS
MyDispatchCleanup(
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp
)
{
// Function body
}
El tipo de función DRIVER_DISPATCH se define en el archivo de encabezado Wdm.h. Para identificar con más precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar the_Use_decl_annotations_annotation a la definición de función. The_Use_decl_annotations_annotation garantiza que se usen las anotaciones que se aplican al tipo de función DRIVER_DISPATCH en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, vea Declarar funciones mediante tipos de roles de función para controladores WDM. Para obtener información sobre Use_decl_annotations, consulte Anotación del comportamiento de la función.
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Escritorio |
Encabezado | wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Se llama en PASSIVE_LEVEL (consulte la sección Comentarios). |