Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Un pilote minifilter appelle FltCheckOplock pour synchroniser la structure de données de rappel pour une opération d’E/S basée sur IRP avec l’état actuel du verrou opportuniste (oplock) du fichier.
Syntaxe
FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplock(
[in] POPLOCK Oplock,
[in] PFLT_CALLBACK_DATA CallbackData,
[in, optional] PVOID Context,
[in, optional] PFLTOPLOCK_WAIT_COMPLETE_ROUTINE WaitCompletionRoutine,
[in, optional] PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE PrePostCallbackDataRoutine
);
Paramètres
[in] Oplock
Pointeur oplock opaque pour le fichier. Ce pointeur doit avoir été initialisé par un appel précédent à FltInitializeOplock.
[in] CallbackData
Pointeur vers la structure des données de rappel (FLT_CALLBACK_DATA) pour l’opération d’E/S.
[in, optional] Context
Pointeur vers lequel les informations de contexte définies par l’appelant doivent être transmises aux routines de rappel qui WaitCompletionRoutine et PrePostCallbackDataRoutine point à. Le Gestionnaire de filtres traite ces informations comme opaques.
[in, optional] WaitCompletionRoutine
Pointeur vers une routine de rappel fournie par l’appelant. Si un saut d’oplock est en cours, le Gestionnaire de filtre appelle cette routine lorsque le saut d’oplock est terminé. Ce paramètre est facultatif et peut être NULL. S’il est NULL, l’appelant est mis dans un état d’attente jusqu’à ce que l’arrêt de verrouillage soit terminé.
Cette routine est déclarée comme suit :
typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
où:
CallbackData est un pointeur vers une structure FLT_CALLBACK_DATA pour l’opération d’E/S.
Context est un pointeur d’informations de contexte qui a été transmis dans le paramètre Context à FltCheckOplock.
[in, optional] PrePostCallbackDataRoutine
Pointeur vers une routine de rappel fournie par l’appelant à appeler 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.
Cette routine est déclarée comme suit :
typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
où:
CallbackData est un pointeur vers une structure FLT_CALLBACK_DATA pour l’opération d’E/S.
Context est un pointeur d’informations de contexte qui a été transmis dans le paramètre Context à FltCheckOplock.
Valeur de retour
FltCheckOplock retourne l’un des codes FLT_PREOP_CALLBACK_STATUS suivants :
| Retourner le code | Descriptif |
|---|---|
| FLT_PREOP_COMPLETE | FltCheckOplock a rencontré un échec d’allocation de pool ou un appel à la fonction FsRtlCheckOplock a renvoyé une erreur. FltCheckOplock définira le code d’erreur dans le membre Status de la structure IO_STATUS_BLOCK du membre IoStatus de la structure de données de rappel FLT_CALLBACK_DATA . Le paramètre CallbackData pointe vers cette FLT_CALLBACK_DATA. |
| FLT_PREOP_PENDING | Un arrêt d’oplock a été lancé, ce qui a provoqué la publication de l’opération d’E/S dans une file d’attente de travail. L’opération d’E/S est représentée par les données de rappel auxquelles pointe le paramètre CallbackData. |
| FLT_PREOP_SUCCESS_NO_CALLBACK | L’opération d’E/S a été effectuée immédiatement. N’oubliez pas que si cette opération était une opération de création qui spécifiait FILE_COMPLETE_IF_OPLOCKED dans le paramètre create-options, il peut y avoir un saut d’oplock en cours même si l’opération a été effectuée immédiatement. Pour déterminer si c’est le cas, l’appelant doit vérifier l’état dans le membre Status de la structure IO_STATUS_BLOCK du membre IoStatus de la structure de données de rappel FLT_CALLBACK_DATA . |
Remarques
Un pilote minifilter appelle FltCheckOplock pour synchroniser une opération d’E/S basée sur IRP 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 l’arrêt de l’oplock n’est pas terminé, FltCheckOplock retourne FLT_PREOP_PENDING et appelle la routine de rappel vers laquelle pointe le paramètre PrePostCallbackDataRoutine .
Si un pilote de minifiltre utilise des verrouillages opérationnels, il doit appeler FltCheckOplock à partir de toutes les routines de rappel de préopération (PFLT_PRE_OPERATION_CALLBACK) pour les opérations d’E/S susceptibles d’entraîner des ruptures de verrouillage. 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 (Opération de mise à jour des informations)
- IRP_MJ_WRITE
- IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
L’opération d’E/S doit être une opération d’E/S basée sur IRP. Pour déterminer si une structure de données de rappel donnée représente une opération d’E/S basée sur IRP, utilisez la macro FLT_IS_IRP_OPERATION.
Les minifilters ne doivent pas appeler FltCheckOplock à nouveau dans le rappel spécifié dans WaitCompletionRoutine. Cela peut entraîner une condition d’interblocage si le package oplock appelle le rappel d’achèvement avant FltCheckOplock retourne.
Pour plus d’informations sur les verrous opportunistes, consultez la documentation du Kit de développement logiciel (SDK) Microsoft Windows.
Exigences
| Exigence | Valeur |
|---|---|
| plateforme cible | Universel |
| d’en-tête | fltkernel.h (inclure Fltkernel.h) |
| IRQL | <= APC_LEVEL |
Voir aussi
FSCTL_OPBATCH_ACK_CLOSE_PENDING