Compartir vía


Cómo completar un IRP en una rutina de envío

Si se puede completar inmediatamente un IRP de entrada, una rutina de envío hace lo siguiente:

  1. Establece los miembros Status e Information del bloque de estado de E/S de IRP con los valores adecuados, en general:

    • La rutina de distribución establece Status en STATUS_SUCCESS o en un error adecuado (STATUS_XXX), que puede ser el valor devuelto por una llamada a una rutina de soporte técnico o, para determinadas solicitudes sincrónicas, mediante un controlador inferior.

      Si un controlador de nivel inferior devuelve STATUS_PENDING, un controlador de nivel superior no debe llamar a IoCompleteRequest para irP, con una excepción: el controlador de nivel superior puede usar un evento para sincronizar entre su rutina de IoCompletion y su rutina de distribución, en cuyo caso la rutina ioCompletion indica el evento y devuelve STATUS_MORE_PROCESSING_REQUIRED. La rutina de distribución espera el evento y, a continuación, llama a IoCompleteRequest para completar el IRP.

    • Establece Información en el número de bytes transferidos correctamente si se cumplió una solicitud para transferir datos, como una solicitud de lectura o escritura.

    • Establece Information en un valor que varía según la solicitud específica de otros IRP que se completa con STATUS_SUCCESS.

    • Establece Information en un valor que varía según la solicitud específica de IRP que se completa con una advertencia STATUS_XXX. Por ejemplo, establecería Información en el número de bytes transferidos para una advertencia como STATUS_BUFFER_OVERFLOW.

    • Normalmente, establece Information en cero para las solicitudes que se completan con un error STATUS_XXX.

  2. Llama a IoCompleteRequest con irP y con PriorityBoost = IO_NO_INCREMENT.

  3. Devuelve el STATUS_XXX adecuado que ya se ha establecido en el bloque de estado de E/S. Tenga en cuenta que una llamada a IoCompleteRequest hace que el IRP especificado no sea accesible por el autor de la llamada, por lo que el valor devuelto de una rutina de envío no se puede establecer desde el bloque de estado de E/S de un IRP ya completado.

Siga esta guía de implementación para llamar a IoCompleteRequest con un IRP:

Libere siempre los bloqueos de número que el controlador esté manteniendo antes de llamar a IoCompleteRequest.

Se tarda un tiempo indeterminado en completar un IRP, especialmente en una cadena de controladores en capas. Además, se puede producir un interbloqueo si una rutina ioCompletion del controlador de nivel superior envía un IRP de vuelta hacia abajo a un controlador inferior que mantiene un bloqueo de giro.