Compartir a través de


Uso de rutinas de finalización de IRP

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.

Los controladores de filtro del sistema de archivos usan rutinas de finalización similares a las usadas por los controladores de dispositivo. Una rutina de finalización realiza el procesamiento de finalización en un IRP. Cualquier rutina de controlador que pase un IRP hacia abajo al controlador de nivel inferior siguiente puede registrar opcionalmente una rutina de finalización para irP llamando a IoSetCompletionRoutine antes de llamar a IoCallDriver.

Cada rutina de finalización de IRP se define de la siguiente manera:

NTSTATUS
(*PIO_COMPLETION_ROUTINE) (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

Las rutinas de finalización se llaman en IRQL <= DISPATCH_LEVEL, en un contexto de subproceso arbitrario.

Dado que se pueden llamar en IRQL DISPATCH_LEVEL, las rutinas de finalización no pueden llamar a rutinas en modo kernel a las que se debe llamar en un IRQL inferior, como IoDeleteDevice. Por el mismo motivo, las estructuras de datos que se usan en una rutina de finalización deben asignarse desde un grupo no paginado.

En esta sección se describen los temas siguientes:

Cómo se realiza el procesamiento de finalización

Comprobación de la marca PendingReturned

Devolver el estado de las rutinas de finalización

Ejemplo: Envío y finalización de Pass-Through simple

Restricciones en rutinas de finalización