Envío de IRP a colas de E/S

[Se aplica a KMDF y UMDF]

Un controlador basado en marcos puede especificar dinámicamente una cola de destino para un IRP entrante. Para enviar un IRP a una cola específica, un controlador debe llamar al método WdfDeviceWdmDispatchIrpToIoQueue .

Normalmente, un controlador llama a WdfDeviceWdmDispatchIrpToIoQueue desde su función de devolución de llamada EvtDeviceWdmIrpPreprocess o EvtDeviceWdmIrpDispatch . Para obtener el mejor rendimiento, la mayoría de los controladores no proporcionan ambas funciones de devolución de llamada.

Nota Un controlador UMDF puede proporcionar una función de devolución de llamada EvtDeviceWdmIrpDispatch , pero solo los controladores KMDF pueden proporcionar EvtDeviceWdmIrpPreprocess.

Si el controlador ya proporciona EvtDeviceWdmIrpPreprocess, puede usarlo para seleccionar dinámicamente una cola. Si no es así, proporcione EvtDeviceWdmIrpDispatch y llame a WdfDeviceWdmDispatchIrpToIoQueue desde dentro de esa función de devolución de llamada.

Además, debe tener en cuenta lo siguiente:

Envío de IRP no preprocesados

Para enviar IRP desde la función de devolución de llamada EvtDeviceWdmIrpDispatch de un controlador, use el procedimiento siguiente:

  1. Desde su función de devolución de llamada EvtDriverDeviceAdd , el controlador llama a WdfDeviceConfigureWdmIrpDispatchCallback para registrar una función de devolución de llamada EvtDeviceWdmIrpDispatch .

    Si el destino es la cola de E/S del dispositivo primario, un controlador KMDF debe llamar a WdfPdoInitAllowForwardingRequestToParent antes de llamar a WdfDeviceCreate. Si un controlador KMDF también ha proporcionado una función de devolución de llamada EvtDeviceWdmIrpPreprocess , el marco llama a esa función primero cuando llega un IRP. Una vez que la función de devolución de llamada preprocesa la solicitud, llama a WdfDeviceWdmDispatchPreprocessedIrp para devolver el IRP al marco.

  2. El marco llama a la función de devolución de llamada EvtDeviceWdmIrpDispatch del controlador.

  3. Desde EvtDeviceWdmIrpDispatch, el controlador puede llamar a WdfDeviceWdmDispatchIrpToIoQueue o WdfDeviceWdmDispatchIrp, pero no a ambos. Un controlador KMDF tiene la opción adicional de llamar a ninguno de estos métodos y, en su lugar, completar el IRP o marcarlo pendiente.

  4. Si un controlador KMDF ha establecido la marca de WDF_DISPATCH_IRP_TO_IO_QUEUE_INVOKE_INCALLERCTX_CALLBACK y no ha habilitado el progreso hacia delante garantizado para la cola de E/S de destino, el marco llama a EvtIoInCallerContext del controlador, si se proporciona. Después de preprocesar la solicitud, la función de devolución de llamada debe ponerla en cola llamando a WdfDeviceEnqueueRequest o completarla llamando a WdfRequestComplete.

Envío de IRP preprocesados

Para enviar IRP desde la función de devolución de llamada EvtDeviceWdmIrpPreprocess de un controlador a una cola de E/S específica, use el procedimiento siguiente:

  1. El controlador registra una función de devolución de llamada EvtDeviceWdmIrpPreprocess llamando a WdfDeviceInitAssignWdmIrpPreprocessCallback.
  2. El controlador llama a WdfPdoInitAllowForwardingRequestToParent si el destino es la cola de E/S del dispositivo primario.
  3. Desde EvtDeviceWdmIrpPreprocess, llame a WdfDeviceWdmDispatchIrpToIoQueue con Marcas establecidas en WDF_DISPATCH_IRP_TO_IO_QUEUE_PREPROCESSED_IRP.
  4. Si el controlador ha establecido la marca de WDF_DISPATCH_IRP_TO_IO_QUEUE_INVOKE_INCALLERCTX_CALLBACK y no ha habilitado el progreso hacia delante garantizado para la cola de E/S de destino, el marco llama a EvtIoInCallerContext del controlador, si se proporciona. Después de que la función de devolución de llamada haya terminado de preprocesar la solicitud, debe ponerla en cola llamando a WdfDeviceEnqueueRequest o completarla llamando a WdfRequestComplete.