Modificación de los parámetros de una operación de E/S
Un controlador de minifiltro puede modificar los parámetros de una operación de E/S. Por ejemplo, una rutina de devolución de llamada de preoperación del controlador minifiltro puede redirigir una operación de E/S a otro volumen cambiando la instancia de destino de la operación. La nueva instancia de destino debe ser una instancia del mismo controlador de minifiltro en la misma altitud en otro volumen.
Los parámetros de una operación de E/S se encuentran en la estructura de datos de devolución de llamada (FLT_CALLBACK_DATA) y la estructura del bloque de parámetros de E/S (FLT_IO_PARAMETER_BLOCK) para la operación. La rutina de devolución de llamada de preoperación del controlador minifilter y la rutina de devolución de llamada posterior a la operación reciben un puntero a la estructura de datos de devolución de llamada para la operación en el parámetro Entrada de datos. El miembro Iopb de la estructura de datos de devolución de llamada es un puntero a una estructura de bloques de parámetros de E/S que contiene los parámetros de la operación.
Si una rutina de devolución de llamada de preoperación del controlador minifiltro modifica los parámetros de una operación de E/S, todos los controladores de minifiltro por debajo de ese controlador de minifiltro en la pila de instancias del controlador minifiltro recibirán los parámetros modificados en sus rutinas de devolución de llamada de preoperación y postoperación.
La rutina de devolución de llamada de postoperación del controlador minifiltro actual no recibe los parámetros modificados o los controladores de minifiltro por encima de ese controlador de minifiltro en la pila de instancias del controlador minifiltro. En todas las situaciones, las rutinas de devolución de llamada de preoperación y postoperación de un controlador minifiltro reciben los mismos valores de parámetro de entrada para una operación de E/S determinada.
Después de modificar los parámetros de una operación de E/S, la rutina de devolución de llamada de preoperación o postoperación debe indicar que lo ha hecho llamando a FltSetCallbackDataDirty, a menos que haya cambiado el contenido del campo IoStatus de la estructura de datos de devolución de llamada. De lo contrario, el administrador de filtros omitirá los cambios en los valores de parámetro. FltSetCallbackDataDirty establece la marca FLTFL_CALLBACK_DATA_DIRTY en la estructura de datos de devolución de llamada para la operación de E/S. Los controladores de minifiltro pueden probar esta marca llamando a FltIsCallbackDataDirty o borrarlo llamando a FltClearCallbackDataDirty.
Si una rutina de devolución de llamada de preoperación del controlador minifiltro modifica los parámetros de una operación de E/S, todos los controladores de minifiltro debajo de ese controlador de minifiltro en la pila de instancias del controlador de minifiltro recibirán los parámetros modificados en los parámetros de entrada Data y FltObjects a sus rutinas de devolución de llamada de preoperación y postoperación. (Los controladores minifiltros no pueden modificar directamente el contenido de la estructura FLT_RELATED_OBJECTS a la que apunta el parámetro FltObjects . Sin embargo, si un controlador de minifiltro modifica la instancia de destino o el objeto de archivo de destino para una operación de E/S, el administrador de filtros modifica el valor del miembro Instance o FileObject correspondiente de la estructura de FLT_RELATED_OBJECTS que se pasa a controladores de minifiltro inferiores).
Aunque cualquier cambio de parámetro que realice la rutina de devolución de llamada de preoperación de un controlador minifiltro no es recibido por la rutina de devolución de llamada postoperación del controlador minifiltro, una rutina de devolución de llamada de preoperación es capaz de pasar información sobre los parámetros modificados a la propia rutina de devolución de llamada postoperación del controlador minifiltro. Si la rutina de devolución de llamada de preoperación pasa la operación de E/S a la pila devolviendo FLT_PREOP_SUCCESS_WITH_CALLBACK o FLT_PREOP_SYNCHRONIZE, puede almacenar información sobre los valores de parámetro modificados en una estructura definida por el controlador minifiltro a la que apunta el parámetro de salida CompletionContext . El administrador de filtros pasa este puntero de estructura en el parámetro de entrada CompletionContext a la rutina de devolución de llamada de postoperación.
Para obtener más información sobre los parámetros de una operación de E/S, consulte FLT_CALLBACK_DATA y FLT_IO_PARAMETER_BLOCK.