Compartir a través de


Cómo se realiza el procesamiento de finalización

Nota:

Para lograr una confiabilidad y un rendimiento óptimos, use controladores de minifiltro del sistema de archivos con compatibilidad con el Administrador de filtros de archivos en lugar de controladores de filtro del sistema de archivos heredados. Para migrar el controlador heredado a un controlador de minifiltro, consulte Directrices para migrar controladores de filtro heredados.

El procesamiento de finalización se realiza en dos fases. La primera fase se realiza en un contexto de subproceso arbitrario, en IRQL <= DISPATCH_LEVEL. En esta fase, se realizan las siguientes tareas:

  • Cada rutina de finalización registrada para irP se llama a su vez, empezando por la ubicación de pila irP más baja. Si una rutina de finalización devuelve STATUS_MORE_PROCESSING_REQUIRED, se detiene el procesamiento de finalización.

  • Si el IRP contiene una lista de descriptores de memoria (MDL), se desbloquean las páginas físicas asignadas por MDL.

  • La segunda fase de finalización de E/S se pone en cola en el subproceso de destino (solicitud) como un APC de kernel especial.

La segunda fase se realiza en el contexto del subproceso que originó la solicitud de E/S. Se ejecuta como un APC de kernel especial y, por tanto, se ejecuta en irQL APC_LEVEL. En esta fase, se realizan las siguientes tareas:

  • Si el IRP representa una operación almacenada en búfer, el contenido de Irp-AssociatedIrp.SystemBuffer> se copia en Irp-UserBuffer>.

  • Si el IRP contiene una MDL, se libera mdL.

  • El contenido de Irp-IoStatus> se copia en Irp-UserIosb> para que el originador de la solicitud de E/S pueda ver el estado final de la operación.

  • Si se ha proporcionado un evento en Irp-UserEvent>, se señala. De lo contrario, si hay un objeto de archivo para este IRP, se señala su evento.

  • Si el IRP se creó mediante una llamada a IoBuildDeviceIoControlRequest o IoBuildSynchronousFsdRequest, se quita de la lista de solicitudes de E/S pendientes del subproceso.

  • Un usuario APC se pone en cola, si el autor de la llamada solicitó uno.

  • El IRP se libera.

Si se detiene el procesamiento de finalización de un IRP porque se devuelve una rutina de finalización STATUS_MORE_PROCESSING_REQUIRED, se puede reanudar llamando a IoCompleteRequest en el mismo IRP. Cuando se produce esta situación, el procesamiento de primera fase se reanuda, empezando por la rutina de finalización del controlador inmediatamente por encima de la que devolvió la rutina de finalización STATUS_MORE_PROCESSING_REQUIRED.