Compartir a través de


Función FsRtlCheckOplockEx2 (ntifs.h)

FsRtlCheckOplockEx2 sincroniza el IRP de una operación de E/S de archivo con el estado actual de bloqueo oportunista (oplock) del archivo.

Sintaxis

NTSTATUS FsRtlCheckOplockEx2(
  [in]           POPLOCK                       Oplock,
  [in]           PIRP                          Irp,
  [in]           ULONG                         Flags,
  [in]           ULONG                         FlagsEx2,
  [in, optional] PVOID                         CompletionRoutineContext,
  [in, optional] POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
  [in, optional] POPLOCK_FS_PREPOST_IRP        PostIrpRoutine,
  [in]           ULONGLONG                     Timeout,
  [in, optional] PVOID                         NotifyContext,
  [in, optional] POPLOCK_NOTIFY_ROUTINE        NotifyRoutine
);

Parámetros

[in] Oplock

Puntero a la estructura oplock oppac del archivo. Este puntero debe haberse inicializado mediante una llamada anterior a FsRtlInitializeOplock.

[in] Irp

Puntero al IRP que declara la operación de E/S solicitada.

[in] Flags

Máscara de bits para la operación de E/S de archivo asociada. Un sistema de archivos o un controlador de filtro establece bits para especificar el comportamiento de FsRtlCheckOplockEx2. Las marcas tienen las siguientes opciones:

Valor de marca Significado
OPLOCK_FLAG_COMPLETE_IF_OPLOCKED (0x00000001) Especifica que se permite que una interrupción de interbloqueo continúe sin bloquear o pendiente la operación que provocó la interrupción del interbloqueo de operación.
OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002) Especifica que FsRtlCheckOplockEx2 solo debe comprobar si hay una clave de interbloqueo en el FILE_OBJECT asociado al IRP al que apunta el parámetro Irp . FsRtlCheckOplockEx2 debe agregar la clave si se proporciona una en irP. No se produce ningún otro procesamiento de interbloqueo; es decir, no se producirá ninguna interrupción de interbloqueo. Se admite a partir de Windows 7.
OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004) Especifica que FsRtlCheckOplockEx2 debe revertir cualquier estado configurado previamente mediante una llamada a la rutina FsRtlOplockFsctrl . Se llama a FsRtlOplockFsctrl durante el procesamiento de una solicitud de IRP_MJ_CREATE que especifica la marca FILE_OPEN_REQUIRING_OPLOCK en el parámetro create options. La marca OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK se usa normalmente en el procesamiento final de dicha solicitud de creación cuando se produjo un error anteriormente. Se admite a partir de Windows 7.
OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008) Especifica para permitir que todos los saltos de interbloqueo continúen independientemente de la clave de interbloqueo. Se admite a partir de Windows 7.
OPLOCK_FLAG_PARENT_OBJECT (0x00000010) Especifica que Oplock está asociado al elemento primario (directorio) del archivo o directorio al que se dirige el IRP en el parámetro Irp . Se admite a partir de Windows 8.
OPLOCK_FLAG_CLOSING_DELETE_ON_CLOSE (0x00000020) Especifica que la operación de E/S especificada en Irp es un IRP_MJ_CLEANUP para un identificador que se abrió originalmente con la marca FILE_DELETE_ON_CLOSE establecida en sus opciones de creación. Esta marca no tiene ningún efecto si Irp no es una operación de IRP_MJ_CLEANUP. Si se especifica esta marca, se puede producir una interrupción de interbloqueo. Se admite a partir de Windows 8.
OPLOCK_FLAG_REMOVING_FILE_OR_LINK (0x00000040) Especifica el control de una interrupción de interbloqueo en un directorio primario al eliminar un archivo o vínculo en ese directorio. Si se especifica, esta marca debe combinarse con OPLOCK_FLAG_PARENT_OBJECT. Esta marca debe especificarse cuando el sistema de archivos está procesando una operación que da lugar a la eliminación de un vínculo o archivo. Se admite a partir de Windows 8.

[in] FlagsEx2

Reservados; debe establecerse en cero.

[in, optional] CompletionRoutineContext

Puntero a la información de contexto definida por el autor de la llamada que se va a pasar a la rutina de devolución de llamada a la que apunta el parámetro CompletionRoutine . Este parámetro es opcional y puede ser NULL.

[in, optional] CompletionRoutine

Puntero a una rutina de devolución de llamada proporcionada por el autor de la llamada. Si hay un salto de interbloqueo en curso, se llama a esta rutina cuando se completa la interrupción. Este parámetro es opcional y puede ser NULL. Si es NULL, FsRtlCheckOpLockEx2 funciona sincrónicamente, colocando el autor de la llamada en un estado de espera hasta que se complete la interrupción del interbloqueo de operación.

CompletionRoutine se declara de la siguiente manera:

typedef VOID
(*POPLOCK_WAIT_COMPLETE_ROUTINE) (
      IN PVOID Context,
      IN PIRP Irp
      );

CompletionRoutine tiene los parámetros siguientes:

  • Contexto: puntero de información de contexto que se pasó en el parámetro Context a FsRtlCheckOplockEx2.
  • Irp: puntero al IRP para la operación de E/S.

[in, optional] PostIrpRoutine

Puntero a una rutina de devolución de llamada proporcionada por el autor de la llamada que se llamará si la operación de E/S se publica en una cola de trabajo. Este parámetro es opcional y puede ser NULL.

PostIrpRoutine se declara de la siguiente manera:

typedef VOID
(*POPLOCK_FS_PREPOST_IRP) (
      IN PVOID Context,
      IN PIRP Irp
      );

PostIrpRoutine tiene los parámetros siguientes:

  • Context, que es un puntero de información de contexto que se pasó en el parámetro Context a FsRtlCheckOplockEx2.
  • Irp: puntero al IRP para la operación de E/S.

[in] Timeout

Si no es cero, especifica un tiempo de espera (en milisegundos) que se esperará en un evento usado para bloquear el subproceso del autor de la llamada para esperar a que se complete la interrupción de interbloqueo de operación. Este valor se omite a menos que se cumplan las dos condiciones siguientes: CompletionRoutine es NULL y NotifyRoutine no es NULL.

[in, optional] NotifyContext

Puntero a una estructura de OPLOCK_NOTIFY_PARAMS que se va a pasar a la rutina de devolución de llamada a la que apunta el parámetro NotifyRoutine . Este parámetro es opcional y puede ser NULL.

[in, optional] NotifyRoutine

Puntero a una rutina de devolución de llamada proporcionada por el autor de llamada que se llamará para la notificación de estado de interbloqueo. Este parámetro es opcional y puede ser NULL.

NotifyRoutine se declara de la siguiente manera:

typedef NTSTATUS
(*POPLOCK_NOTIFY_ROUTINE) (
      IN POPLOCK_NOTIFY_PARAMS NotifyParams
      );

NotifyRoutine tiene los parámetros siguientes:

  • NotifyParams, que se establece como el parámetro NotifyContext pasado a FsRtlCheckOplockEx2.

Valor devuelto

FsRtlCheckOplockEx2 devuelve STATUS_SUCCESS o un código NTSTATUS adecuado, como uno de los siguientes:

Código devuelto Descripción
STATUS_CANCELLED Se canceló el IRP. STATUS_CANCELLED es un código de error.
STATUS_CANNOT_BREAK_OPLOCK No se puede realizar la interrupción de interbloqueo. IrP es una solicitud de IRP_MJ_CREATE. FILE_OPEN_REQUIRING_OPLOCK se especificó en el parámetro create options para la operación y hay un oplock concedido.
STATUS_OPLOCK_BREAK_IN_PROGRESS Hay una interrupción de interbloqueo en curso. IRP es una solicitud de IRP_MJ_CREATE y FILE_COMPLETE_IF_OPLOCKED se especificó en el parámetro create options para la operación. STATUS_OPLOCK_BREAK_IN_PROGRESS es un código correcto que se devuelve si se estableció OPLOCK_FLAG_COMPLETE_IF_OPLOCKED y se ha interrumpido un interbloqueo.
STATUS_PENDING Se está llevando a cabo una interrupción de interbloqueo y el control del IRP se pasó al paquete oplock. Si CompletionRoutine es NULL, FsRtlCheckOplockEx2 se bloquea mientras se procesa la interrupción de interbloqueo de operación en lugar de devolver STATUS_PENDING. STATUS_PENDING es un código correcto.

Comentarios

Los minifiltros deben llamar a FltCheckOplockEx en lugar de FsRtlCheckOplockEx2.

FsRtlCheckOplockEx2 sincroniza el IRP de una operación de E/S con el estado de interbloqueo actual de un archivo según las condiciones siguientes:

  • Si la operación de E/S hará que el interbloqueo se interrumpa, se inicia la interrupción de interbloqueo.

  • Si la operación de E/S no puede continuar hasta que se complete la interrupción del interbloqueo de operación y se haya especificado una rutina de finalización en CompletionRoutine , FsRtlCheckOplockEx2 devuelve STATUS_PENDING y llama a la rutina de devolución de llamada especificada en PostIrpRoutine. Cuando se ha confirmado la interrupción de interbloqueo, se llama a la rutina de devolución de llamada en CompletionRoutine .

  • Si la operación de E/S no puede continuar hasta que se complete la interrupción del interbloqueo de operación y no se haya especificado CompletionRoutine , el subproceso del autor de la llamada se bloqueará y FsRtlCheckOplockEx2 solo devolverá cuando se complete la interrupción del interbloqueo de operación.

Si el subproceso del autor de la llamada está bloqueado y NotifyRoutine no es NULL, se llamará a NotifyRoutine por cualquiera de los siguientes motivos establecidos en NotifyParams:

  • OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT
  • OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED

La llamada a NotifyRoutine por cualquiera de los motivos anteriores solo se produce si CompletionRoutine es NULL y es necesario bloquear el subproceso del autor de la llamada para esperar a que se complete la interrupción.

Si se invoca NotifyRoutine por motivos OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT, siempre se invocará por motivos OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED si la espera finaliza o se completa por cualquier motivo (que puede ser nunca).

FsRtlCheckOplockEx2 omite los códigos de estado de OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT y OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED devueltos por NotifyRoutine.

Una propiedad PostIrpRoutine solo debe especificarse si se ha especificado un Objeto CompletionRoutine . Cuando PostIrpRoutine no es NULL, se llama a antes de que todo se pone en cola a la cola de Irp en espera.

Si se especifica la marca de OPLOCK_FLAG_PARENT_OBJECT en Marcas, FsRtlCheckOplockEx2 interrumpirá incondicionalmente cualquier interbloqueo primario existente; es decir, no se tiene en cuenta el código principal de Irp .

Si un sistema de archivos usa oplocks, debe llamar a FsRtlCheckOplockEx2 desde cualquier rutina de envío para las operaciones de E/S que puedan provocar interrupciones de interbloqueo. Esta regla se aplica a los siguientes tipos de operaciones de E/S, ya que estas operaciones pueden provocar interrupciones de interbloqueo:

  • IRP_MJ_CLEANUP

  • IRP_MJ_CREATE

  • IRP_MJ_FILE_SYSTEM_CONTROL

  • IRP_MJ_FLUSH_BUFFERS

  • IRP_MJ_LOCK_CONTROL

  • IRP_MJ_READ

  • IRP_MJ_SET_INFORMATION

  • IRP_MJ_WRITE

Para obtener más información sobre los interbloqueos, vea Bloqueos oportunistas.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 10, versión 2004
Encabezado ntifs.h

Consulte también

FSCTL_OPBATCH_ACK_CLOSE_PENDING

FSCTL_OPLOCK_BREAK_ACKNOWLEDGE

FSCTL_OPLOCK_BREAK_ACK_NO_2

FSCTL_OPLOCK_BREAK_NOTIFY

FSCTL_REQUEST_BATCH_OPLOCK

FSCTL_REQUEST_FILTER_OPLOCK

FSCTL_REQUEST_OPLOCK_LEVEL_1

FSCTL_REQUEST_OPLOCK_LEVEL_2

FltCheckOplockEx

FsRtlCurrentBatchOplock

FsRtlInitializeOplock

FsRtlOplockFsctrl

FsRtlOplockIsFastIoPossible

FsRtlUninitializeOplock

OPLOCK_NOTIFY_PARAMS