Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
FltMgr simplifica el procesamiento de operaciones de E/S para controladores de minifiltro. Un controlador de filtro heredado debe pasar correctamente todas las solicitudes de E/S al controlador inferior siguiente y controlar correctamente las solicitudes pendientes, la sincronización y la finalización de E/S, independientemente de si realiza algún trabajo relacionado con la solicitud. Por el contrario, un controlador de minifiltro solo registra las operaciones de E/S que debe controlar.
En una operación de E/S determinada, FltMgr llama solo a los controladores de minifiltro que registran una rutina de devolución de llamada de preoperación para esa operación. FltMgr también controla ciertas tareas de mantenimiento de IRP en nombre del controlador de minifiltro, como copiar parámetros en la siguiente ubicación de pila y propagar el indicador IRP PendingReturned.
En su rutina de devolución de llamada de preoperación, un controlador de minifiltro:
- Realiza cualquier procesamiento necesario para la operación de E/S.
- Indica lo que se debe hacer al IRP devolviendo el valor adecuado de su rutina de devolución de llamada de preoperación.
Por ejemplo, para reenviar un IRP al controlador inferior siguiente sin una rutina de finalización, el controlador de minifiltro devuelve FLT_PREOP_SUCCESS_NO_CALLBACK. Para hacer lo mismo con una rutina de finalización (la rutina de devolución de llamada de postoperación del controlador de minifiltro para la operación de E/S), el controlador de minifiltro devuelve FLT_PREOP_SUCCESS_WITH_CALLBACK.
En su rutina de devolución de llamada de preoperación, el controlador de minifiltro puede poner en cola la operación en un subproceso de trabajo si es necesario llamando a FltQueueDeferredIoWorkItem. Después, el controlador de minifiltro devuelve FLT_PREOP_PENDING de su rutina de devolución de llamada de preoperación para indicar que la operación de E/S está pendiente. El controlador de minifiltro es responsable de completar o reanudar el procesamiento de la solicitud. Para reanudar el procesamiento, el controlador de minifiltro llama a FltCompletePendedPreOperation a través del subproceso de trabajo.
Si el controlador de minifiltro necesita mantener su propia cola segura para la cancelación por instancia de las operaciones de E/S pendientes que se van a procesar, puede configurar dicha cola realizando las siguientes llamadas:
- Llamada a FltCbdqInitialize en su rutina InstanceSetupCallback.
- Llamada a FltCbdqInsertIo en su rutina de devolución de llamada de preoperación según sea necesario para insertar operaciones de E/S en la cola.
FltMgr llama a una rutina de devolución de llamada de postoperación del controlador de minifiltro para una operación de E/S cuando los controladores de filtro inferiores (filtros heredados y controladores de minifiltro) finalizan el procesamiento de finalización.
En su rutina de devolución de llamada de postoperación, el controlador de minifiltro puede llamar a FltDoCompletionProcessingWhenSafe para asegurarse de que el procesamiento de finalización se realiza en un IRQL seguro. O bien, puede poner en cola el procesamiento de finalización de la operación en un subproceso de trabajo si es necesario llamando a FltQueueDeferredIoWorkItem. Después, el controlador de minifiltro devuelve FLT_POSTOP_MORE_PROCESSING_REQUIRED de su rutina de devolución de llamada de postoperación para detener el procesamiento de finalización de FltMgr para la operación de E/S. Para reanudar el procesamiento de la finalización, el controlador de minifiltro llama a FltCompletePendedPostOperation desde el subproceso de trabajo.
FltMgr añade la opción de poner en cola los elementos de trabajo "genéricos": elementos de trabajo asociados a un controlador de minifiltro o una instancia del controlador de minifiltro en lugar de una operación de E/S. Un controlador de minifiltro puede insertar un elemento de trabajo en una cola de trabajo del sistema llamando a FltQueueGenericWorkItem. Esta rutina es similar a las rutinas como ExQueueWorkItem; por ejemplo, los elementos de trabajo (asignados mediante una llamada a FltAllocateGenericWorkItem) se pueden reutilizar. Sin embargo, FltQueueGenericWorkItem es más seguro para que los controladores de minifiltro los usen, ya que FltMgr no permite que el controlador de minifiltro o la instancia del controlador de minifiltro se descarguen mientras se están procesando los elementos de trabajo pendientes.
FltMgr también incluye la opción para usar operaciones de bloqueo oportunista (oplock). Para las operaciones de bloqueo oportunista, un controlador de minifiltro puede usar rutinas de administrador de filtros como FltInitializeOplock y FltOplockFsctrl, que son equivalentes a las rutinas FsRtlInitializeOplock y FsRtlOplockFsctrl que usan los sistemas de archivos y los controladores de filtro heredados.
Rutinas del administrador de filtros para procesar operaciones de E/S
FltMgr proporciona las siguientes rutinas de soporte para E/S pendientes en las rutinas de devolución de llamada de preoperación y postoperación:
Las rutinas siguientes se usan para poner en cola elementos de trabajo en rutinas de devolución de llamada de preoperación y postoperación:
- FltAllocateDeferredIoWorkItem
- FltAllocateGenericWorkItem
- FltFreeDeferredIoWorkItem
- FltFreeGenericWorkItem
- FltQueueDeferredIoWorkItem
- FltQueueGenericWorkItem
Las rutinas siguientes permiten usar colas seguras para cancelación:
Las rutinas siguientes permiten usar bloqueos oportunistas:
Rutinas de devolución de llamada de minifiltro para procesar operaciones de E/S
Las siguientes rutinas de devolución de llamada se almacenan en la estructura FLT_OPERATION_REGISTRATION para cada tipo de operación de E/S que controla el controlador de minifiltro:
| Nombre de la rutina de devolución de llamada | Tipo de rutina de devolución de llamada |
|---|---|
| PreOperation | PFLT_PRE_OPERATION_CALLBACK |
| PostOperation | PFLT_POST_OPERATION_CALLBACK |