Compartir a través de


Devolver FLT_PREOP_SYNCHRONIZE

Nota:

Un controlador de minifiltro no debe usar FLT_PREOP_SYNCHRONIZE para contener un recurso entre llamadas previas y posteriores a la operación (igual que no debe contener un recurso en una llamada de E/S). Para ello, no es seguro, ya que puede dar lugar a interbloqueos.

Si la rutina de devolución de llamada de un controlador minifiltro sincroniza una operación de E/S devolviendo FLT_PREOP_SYNCHRONIZE, el Administrador de filtros llama a la rutina de devolución de llamada posterior a la operación del filtro durante la finalización de E/S:

  • Si el filtro no se está purgando, el Administrador de filtros llama a la rutina de devolución de llamada posterior a la operación del filtro en el mismo contexto de subproceso que la devolución de llamada de la operación previa, en IRQL <= APC_LEVEL. (Tenga en cuenta que este contexto de subproceso no es necesariamente el contexto del subproceso de origen).
  • Si el filtro se está purgando, el Administrador de filtros no se vuelve a sincronizar con el subproceso original.

Nota:

Si la rutina de devolución de llamada previa a la operación de un filtro devuelve FLT_PREOP_SYNCHRONIZE, debe implementar una rutina de devolución de llamada posterior a la operación.

Si la rutina de devolución de llamada anterior a la operación del filtro devuelve FLT_PREOP_SYNCHRONIZE, puede devolver un valor distinto de NULL en su parámetro de salida CompletionContext . Este parámetro es un puntero de contexto opcional que se pasa a la rutina de devolución de llamada posterior a la operación correspondiente. La rutina de devolución de llamada posterior a la operación recibe este puntero en su parámetro de entrada CompletionContext .

Una rutina de devolución de llamada del controlador de minifiltro debe devolver FLT_PREOP_SYNCHRONIZE solo para las operaciones de E/S basadas en IRP. Sin embargo, este valor de estado se puede devolver para otros tipos de operación. Si se devuelve para una operación de E/S que no es una operación de E/S basada en IRP, el Administrador de filtros trata este valor devuelto como si fuera FLT_PREOP_SUCCESS_WITH_CALLBACK. Para determinar si una operación es una operación de E/S basada en IRP, use la macro FLT_IS_IRP_OPERATION .

Los filtros no deben devolver FLT_PREOP_SYNCHRONIZE para las operaciones de creación, ya que estas operaciones ya están sincronizadas por el Administrador de filtros. Si un controlador de minifiltro ha registrado rutinas de devolución de llamada previas y posteriores a la operación para las operaciones de IRP_MJ_CREATE, se llama a la rutina de devolución de llamada posterior a la creación en IRQL = PASSIVE_LEVEL, en el mismo contexto de subproceso que la rutina de devolución de llamada anterior a la creación.

Los controladores de minifiltro nunca deben devolver FLT_PREOP_SYNCHRONIZE para las operaciones asincrónicas de lectura o escritura. Si lo hace, puede degradar gravemente tanto el controlador de minifiltro como el rendimiento del sistema e incluso puede provocar interbloqueos si, por ejemplo, el subproceso modificado del escritor de páginas está bloqueado. Antes de devolver FLT_PREOP_SYNCHRONIZE para una operación de lectura o escritura basada en IRP, un controlador de minifiltro debe comprobar que la operación es sincrónica mediante una llamada a FltIsOperationSynchronous.

No se pueden sincronizar los siguientes tipos de operaciones de E/S:

FLT_PREOP_SYNCHRONIZE no se puede devolver para ninguna de estas operaciones.