Partager via


FsRtlCheckOplockEx2, fonction (ntifs.h)

FsRtlCheckOplockEx2 synchronise l’IRP pour une opération d’E/S de fichier avec l’état actuel du verrou opportuniste (oplock) du fichier.

Syntaxe

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
);

Paramètres

[in] Oplock

Pointeur vers la structure oplock opaque du fichier. Ce pointeur doit avoir été initialisé par un appel précédent à FsRtlInitializeOplock.

[in] Irp

Pointeur vers l’IRP qui déclare l’opération d’E/S demandée.

[in] Flags

Masque de bits pour l’opération d’E/S de fichier associée. Un système de fichiers ou un pilote de filtre définit des bits pour spécifier le comportement de FsRtlCheckOplockEx2. indicateurs dispose des options suivantes :

Valeur de l’indicateur Signification
OPLOCK_FLAG_COMPLETE_IF_OPLOCKED (0x00000001) Spécifie d’autoriser un saut d’oplock à continuer sans bloquer ou en attente l’opération qui a provoqué l’arrêt d’oplock.
OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002) Spécifie que FsRtlCheckOplockEx2 doit uniquement rechercher une clé d’oplock sur l’FILE_OBJECT associée à l’IRP vers laquelle pointe le paramètre Irp. FsRtlCheckOplockEx2 devez ensuite ajouter la clé si celle-ci est fournie dans l’IRP. Aucun autre traitement oplock ne se produit ; c’est-à-dire qu’aucune rupture d’oplock ne se produit. Prise en charge à partir de Windows 7.
OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004) Spécifie que FsRtlCheckOplockEx2 doit rétablir tout état précédemment configuré via un appel à la routine FsRtlOplockFsctrl. FsRtlOplockFsctrl est appelée pendant le traitement d’une requête IRP_MJ_CREATE qui spécifie l’indicateur FILE_OPEN_REQUIRING_OPLOCK dans le paramètre d’options de création. L’indicateur OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK est généralement utilisé dans le traitement final d’une telle demande de création lorsqu’elle a échoué précédemment. Prise en charge à partir de Windows 7.
OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008) Spécifie d’autoriser tous les sauts d’oplock à continuer indépendamment de la clé oplock. Prise en charge à partir de Windows 7.
OPLOCK_FLAG_PARENT_OBJECT (0x00000010) Spécifie que Oplock est associé au parent (répertoire) du fichier ou du répertoire auquel l’IRP dans le paramètre Irp est dirigé. Prise en charge à partir de Windows 8.
OPLOCK_FLAG_CLOSING_DELETE_ON_CLOSE (0x00000020) Spécifie que l’opération d’E/S spécifiée dans Irp est un IRP_MJ_CLEANUP pour un handle qui a été ouvert à l’origine avec l’indicateur de FILE_DELETE_ON_CLOSE défini dans ses options de création. Cet indicateur n’a aucun effet si Irp n’est pas une opération de IRP_MJ_CLEANUP. La spécification de cet indicateur peut entraîner un arrêt d’oplock. Prise en charge à partir de Windows 8.
OPLOCK_FLAG_REMOVING_FILE_OR_LINK (0x00000040) Spécifie la gestion d’un saut d’oplock sur un répertoire parent lors de la suppression d’un fichier ou d’un lien dans ce répertoire. S’il est spécifié, cet indicateur doit être combiné à OPLOCK_FLAG_PARENT_OBJECT. Cet indicateur doit être spécifié lorsque le système de fichiers traite une opération qui entraîne la suppression d’un lien ou d’un fichier. Prise en charge à partir de Windows 8.

[in] FlagsEx2

Réservé; doit être défini sur zéro.

[in, optional] CompletionRoutineContext

Pointeur vers les informations de contexte définies par l’appelant à passer à la routine de rappel vers laquelle le paramètre CompletionRoutine pointe vers. Ce paramètre est facultatif et peut être NULL.

[in, optional] CompletionRoutine

Pointeur vers une routine de rappel fournie par l’appelant. Si un saut d’oplock est en cours, cette routine est appelée lorsque l’arrêt est terminé. Ce paramètre est facultatif et peut être NULL. S’il s’agit NULL, FsRtlCheckOpLockEx2 fonctionne de manière synchrone, en plaçant l’appelant dans un état d’attente jusqu’à ce que l’arrêt d’oplock soit terminé.

CompletionRoutine est déclaré comme suit :

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

completionRoutine a les paramètres suivants :

  • Contexte: pointeur d’informations de contexte transmis dans le paramètre context à FsRtlCheckOplockEx2.
  • Irp: pointeur vers l’IRP pour l’opération d’E/S.

[in, optional] PostIrpRoutine

Pointeur vers une routine de rappel fournie par l’appelant pour être appelée si l’opération d’E/S est publiée dans une file d’attente de travail. Ce paramètre est facultatif et peut être NULL.

PostIrpRoutine est déclaré comme suit :

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

PostIrpRoutine a les paramètres suivants :

  • Context, qui est un pointeur d’informations de contexte qui a été transmis dans le paramètre Context à FsRtlCheckOplockEx2.
  • Irp: pointeur vers l’IRP pour l’opération d’E/S.

[in] Timeout

Si ce n’est pas zéro, spécifie un délai d’attente (en millisecondes) pour attendre sur un événement utilisé pour bloquer le thread de l’appelant afin d’attendre la fin du saut d’oplock. Cette valeur est ignorée, sauf si les deux conditions suivantes sont remplies : CompletionRoutine a la valeur NULL et NotifyRoutine n’est pas NULL.

[in, optional] NotifyContext

Pointeur vers une structure OPLOCK_NOTIFY_PARAMS à passer à la routine de rappel vers laquelle pointe le paramètre NotifyRoutine. Ce paramètre est facultatif et peut être NULL.

[in, optional] NotifyRoutine

Pointeur vers une routine de rappel fournie par l’appelant pour être appelée pour la notification d’état oplock. Ce paramètre est facultatif et peut être NULL.

notifyRoutine est déclaré comme suit :

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

NotifyRoutine a les paramètres suivants :

  • NotifyParams, qui est défini comme paramètre NotifyContext passé à FsRtlCheckOplockEx2.

Valeur de retour

FsRtlCheckOplockEx2 retourne STATUS_SUCCESS ou un code NTSTATUS approprié tel que l’un des éléments suivants :

Retourner le code Description
STATUS_CANCELLED L’IRP a été annulé. STATUS_CANCELLED est un code d’erreur.
STATUS_CANNOT_BREAK_OPLOCK Impossible d’accomplir le saut d’oplock. L’IRP est une demande de IRP_MJ_CREATE. FILE_OPEN_REQUIRING_OPLOCK a été spécifié dans le paramètre d’options de création pour l’opération, et il existe un oplock accordé.
STATUS_OPLOCK_BREAK_IN_PROGRESS Une rupture d’oplock est en cours. L’IRP est une requête IRP_MJ_CREATE et FILE_COMPLETE_IF_OPLOCKED a été spécifié dans le paramètre d’options de création pour l’opération. STATUS_OPLOCK_BREAK_IN_PROGRESS est un code de réussite retourné si OPLOCK_FLAG_COMPLETE_IF_OPLOCKED a été défini et qu’un oplock a été rompu.
STATUS_PENDING Un saut d’oplock est en cours et le contrôle de l’IRP a été passé au package oplock. Si CompletionRoutine est NULL, blocs FsRtlCheckOplockEx2 pendant que le saut d’oplock est traité plutôt que de retourner STATUS_PENDING. STATUS_PENDING est un code de réussite.

Remarques

Les minifilters doivent appeler fltCheckOplockEx au lieu de FsRtlCheckOplockEx2 .

FsRtlCheckOplockEx2 synchronise l’IRP pour une opération d’E/S avec l’état d’oplock actuel d’un fichier en fonction des conditions suivantes :

  • Si l’opération d’E/S provoque l’arrêt de l’oplock, le saut d’oplock est lancé.

  • Si l’opération d’E/S ne peut pas continuer tant que le saut d’oplock n’est pas terminé et qu’une routine d’achèvement dans completionRoutine a été spécifiée, FsRtlCheckOplockEx2 retourne STATUS_PENDING et appelle la routine de rappel spécifiée dans PostIrpRoutine. Lorsque le saut d’oplock a été reconnu, la routine de rappel dans CompletionRoutine est appelée.

  • Si l’opération d’E/S ne peut pas continuer tant que l’arrêt d’oplock n’est pas terminé et que completionRoutine n’a pas été spécifié, le thread de l’appelant est bloqué et FsRtlCheckOplockEx2 retourne uniquement lorsque l’arrêt d’oplock est terminé.

Si le thread de l’appelant est bloqué et que NotifyRoutine n’est pas NULL, NotifyRoutine sera appelé pour toute ou toutes les raisons suivantes définies dans NotifyParams:

  • OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT
  • OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED

L’appel à NotifyRoutine pour l’une des raisons ci-dessus se produit uniquement si CompletionRoutine a la valeur NULL et qu’il est nécessaire de bloquer le thread de l’appelant pour attendre la fin de l’arrêt.

Si notifyRoutine est appelé pour une raison OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT, il est toujours appelé pour une raison OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED si l’attente se termine/se termine pour une raison quelconque (qui ne peut jamais être).

FsRtlCheckOplockEx2 ignore les codes d’état OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT et de OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED retournés par NotifyRoutine.

Une PostIrpRoutine doit être spécifiée uniquement si un CompletionRoutine a été spécifié. Lorsque PostIrpRoutine n’est pas NULL, il est appelé avant que tout soit mis en file d’attente vers la file d’attente Irp en attente.

Si l’indicateur OPLOCK_FLAG_PARENT_OBJECT est spécifié dans indicateurs, FsRtlCheckOplockEx2 interrompt inconditionnellement tout oplock parent existant ; autrement dit, le code principal du Irp n’est pas pris en compte.

Si un système de fichiers utilise des oplocks, il doit appeler FsRtlCheckOplockEx2 à partir de toutes les routines de distribution pour les opérations d’E/S qui peuvent provoquer des sauts d’oplock. Cette règle s’applique aux types d’opérations d’E/S suivants, car ces opérations peuvent entraîner des sauts d’oplock :

  • 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

Pour plus d’informations sur les verrous oplocks, consultez verrous opportunistes.

Exigences

Exigence Valeur
client minimum pris en charge Windows 10, version 2004
d’en-tête ntifs.h

Voir aussi

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