Compartir a través de


Error de una operación de E/S en una rutina de devolución de llamada de postoperación

Una rutina de devolución de llamada de postoperación del controlador minifiltro puede producir un error en una operación de E/S correcta, pero simplemente con errores en una operación de E/S no deshace el efecto de la operación. El controlador de minifiltro es responsable de realizar cualquier procesamiento necesario para deshacer la operación.

Por ejemplo, una rutina de devolución de llamada posterior a la creación de un controlador minifiltro puede producir un error en una operación de IRP_MJ_CREATE correcta mediante los pasos siguientes:

  1. Llamar a FltCancelFileOpen para cerrar el archivo creado o abierto por la operación de creación. Tenga en cuenta que FltCancelFileOpen no deshace ninguna modificación en el archivo. Por ejemplo, FltCancelFileOpen no elimina un archivo recién creado ni restaura un archivo truncado a su tamaño anterior.

  2. Establecer el campo IoStatus.Status de la estructura de datos de devolución de llamada en el valor NTSTATUS final de la operación. Este valor debe ser un valor NTSTATUS de error válido, como STATUS_ACCESS_DENIED.

  3. Establecer el campo IoStatus.Information de la estructura de datos de devolución de llamada en cero.

  4. Devolver FLT_POSTOP_FINISHED_PROCESSING.

Al establecer el campo IoStatus.Status de la estructura de datos de devolución de llamada en el valor NTSTATUS final de la operación, el controlador de minifiltro debe especificar un valor NTSTATUS de error válido. Tenga en cuenta que los controladores de minifiltro no pueden especificar STATUS_FLT_DISALLOW_FAST_IO; solo el administrador de filtros puede usar este valor NTSTATUS.

Los autores de llamadas de FltCancelFileOpen deben ejecutarse en IRQL <= APC_LEVEL. Sin embargo, un controlador de minifiltro puede llamar de forma segura a esta rutina desde una rutina de devolución de llamada posterior a la creación, ya que, para IRP_MJ_CREATE operaciones, se llama a la rutina de devolución de llamada postoperación en IRQL = PASSIVE_LEVEL, en el contexto del subproceso que originó la operación de creación.