Reenvío de solicitudes de E/S

Cuando un controlador recibe una solicitud de E/S que no puede procesar, normalmente realiza una de las siguientes acciones:

  • Reenvía la solicitud recibida a otro controlador.

  • Crea solicitudes adicionales y las envía a otro controlador.

Los controladores basados en marcos reenvía solicitudes mediante destinos de E/S, que representan otros controladores del sistema. Los controladores pueden usar cualquiera de las técnicas siguientes para reenviar una solicitud a un destino de E/S:

  • Un controlador puede reenviar solicitudes de E/S al controlador inferior siguiente llamando a WdfDeviceGetIoTarget, seguido de WdfRequestFormatRequestUsingCurrentType y, por último, WdfRequestSend.

    Esta técnica solo es útil si el controlador recibe una solicitud que no tiene que modificar antes de reenviar.

  • Un controlador puede llamar a WdfFdoInitSetFilter para registrarse como controlador de filtro.

    Si un controlador de filtro no proporciona una cola de E/S para un tipo determinado de solicitud de E/S, el marco reenvía automáticamente las solicitudes de ese tipo al controlador inferior siguiente.

  • Normalmente, un controlador de función examina el contenido de cada solicitud de E/S. Si un controlador de función no puede procesar una solicitud, podría modificar la solicitud y reenviarla a un destino de E/S. O bien, puede crear una o varias solicitudes nuevas y enviarlas a un destino de E/S.

    El objeto de destino de E/S del marco define varios métodos para enviar solicitudes de E/S a otros controladores. Por ejemplo, un controlador puede llamar a WdfIoTargetFormatRequestForRead, seguido de WdfRequestSend, para enviar una solicitud de lectura a un destino de E/S. Para obtener más información sobre los destinos de E/S, consulte Uso de destinos de E/S.

    En raras ocasiones, es posible que un escritor de controladores quiera especificar el contenido de la ubicación de pila de E/S de WDM subyacente de una solicitud antes de enviar una solicitud a un destino de E/S. En esos casos, el controlador puede llamar a WdfRequestWdmFormatUsingStackLocation antes de llamar a WdfRequestSend.

A veces, un controlador debe enviar la misma solicitud a varios destinos de E/S, normalmente porque el controlador debe enviar un único comando a todos sus dispositivos. Antes de enviar una solicitud a un destino de E/S, el controlador puede llamar a WdfRequestChangeTarget para comprobar que el destino de E/S es accesible.

El controlador debe completar finalmente todas las solicitudes que reenvía a un destino de E/S, a menos que establezca la marca de WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET al llamar a WdfRequestSend.

Tenga en cuenta que cuando un controlador reenvía una solicitud, el marco no transfiere literalmente el objeto de solicitud del marco del controlador remitente al controlador receptor. En su lugar, el marco crea un nuevo objeto de solicitud en el controlador que recibe la solicitud. Solo el paquete de solicitud de E/S subyacente de la solicitud (IRP) de la solicitud se transfiere de un controlador a otro.