Partager via


FltQueueDeferredIoWorkItem, fonction (fltkernel.h)

La routine FltQueueDeferredIoWorkItem publie une opération d’E/S basée sur IRP dans une file d’attente de travail.

Syntaxe

NTSTATUS FLTAPI FltQueueDeferredIoWorkItem(
  [in] PFLT_DEFERRED_IO_WORKITEM         FltWorkItem,
  [in] PFLT_CALLBACK_DATA                Data,
  [in] PFLT_DEFERRED_IO_WORKITEM_ROUTINE WorkerRoutine,
  [in] WORK_QUEUE_TYPE                   QueueType,
  [in] PVOID                             Context
);

Paramètres

[in] FltWorkItem

Pointeur vers l’élément de travail à ajouter à la file d’attente de travail. L’élément de travail doit avoir été alloué en appelant FltAllocateDeferredIoWorkItem.

[in] Data

Pointeur vers la structure FLT_CALLBACK_DATA pour l’opération d’E/S. L’opération 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.

[in] WorkerRoutine

Pointeur vers une routine de rappel worker fournie par l’appelant. Cette routine est déclarée comme suit :

typedef VOID
(*PFLT_DEFERRED_IO_WORKITEM_ROUTINE) (
    _In_ PFLT_DEFERRED_IO_WORKITEM FltWorkItem,
    _In_ PFLT_CALLBACK_DATA CallbackData,
    _In_opt_ PVOID Context
    );

où:

  • FltWorkItem est un pointeur opaque vers une structure d’élément de travail différée.
  • CallbackData est un pointeur vers la structure de données de rappel pour l’opération d’E/S.
  • Context est un pointeur d’informations de contexte facultatif qui a été passé en tant que paramètre Context de FltQueueDeferredIoWorkItem.

[in] QueueType

Spécifie la file d’attente dans laquelle l’élément de travail FltWorkItem points à insérer. QueueType peut être l’une des valeurs suivantes.

Valeur Signification
CriticalWorkQueue Insérez l’élément de travail dans la file d’attente à partir de laquelle un thread système avec un attribut de priorité en temps réel traite l’élément de travail.
DelayedWorkQueue Insérez l’élément de travail dans la file d’attente à partir de laquelle un thread système avec un attribut de priorité variable traite l’élément de travail.

La valeur QueueTypeHyperCriticalWorkQueue est réservée à l’utilisation du système.

[in] Context

Pointeur vers les informations de contexte définies par l’appelant à passer en tant que paramètre Context de la routine de rappel spécifiée dans le paramètre WorkerRoutine.

Valeur de retour

La routine FltQueueDeferredIoWorkItem retourne STATUS_SUCCESS ou une valeur NTSTATUS appropriée, comme l’une des suivantes :

Retourner le code Description
STATUS_FLT_DELETING_OBJECT L’instance cible de l’opération d’E/S (Data->Iopb->TargetInstance) est détruite. Il s’agit d’un code d’erreur.
STATUS_FLT_NOT_SAFE_TO_POST_OPERATION L’opération d’E/S ne peut pas être publiée en toute sécurité sur un thread de travail. Consultez les remarques pour des raisons possibles pour lesquelles ce code d’erreur est retourné.

Remarques

La routine FltQueueDeferredIoWorkItem publie une opération d’E/S dans une file d’attente de travail système. La routine de rappel WorkerRoutine spécifiée est appelée dans le contexte d’un thread système, à l’PASSIVE_LEVEL IRQL.

L’opération 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.

FltQueueDeferredIoWorkItem retourne STATUS_FLT_NOT_SAFE_TO_POST_OPERATION lorsque l’opération d’E/S ne peut pas être publiée en toute sécurité sur un thread de travail. Les raisons possibles sont les suivantes :

  • FltQueueDeferredIoWorkItem ne peut pas publier une opération d’E/S de pagination sur un thread de travail.

  • FltQueueDeferredIoWorkItem ne peut pas publier une opération d’E/S sur un thread de travail si le champ TopLevelIrp du thread actuel n’est pas NULL, car la récursivité du système de fichiers résultante peut entraîner des blocages ou des dépassements de pile. Pour plus d’informations, consultez IoGetTopLevelIrp.

Un pilote minifilter peut utiliser FltQueueDeferredIoWorkItem dans une routine de rappel de préopération (PFLT_PRE_OPERATION_CALLBACK) comme suit :

  1. Le rappel de préopération appelle FltAllocateDeferredIoWorkItem pour allouer l’élément de travail.

  2. Le rappel de préopération appelle FltQueueDeferredIoWorkItem publier l’opération dans la file d’attente de travail.

  3. Le rappel de préopération retourne FLT_PREOP_PENDING.

  4. Après avoir traité l’opération d’E/S, la routine de travail appelle FltCompletePendedPreOperation pour renvoyer l’opération d’E/S au Gestionnaire de filtres.

  5. La routine de travail appelle FltFreeDeferredIoWorkItem pour libérer l’élément de travail.

Un pilote minifilter peut utiliser fltQueueDeferredIoWorkItem dans une routine de rappel post-opération (PFLT_POST_OPERATION_CALLBACK) comme suit :

  1. Le rappel post-opération appelle FltAllocateDeferredIoWorkItem pour allouer l’élément de travail.

  2. Le rappel post-opération appelle FltQueueDeferredIoWorkItem pour publier l’opération dans la file d’attente de travail.

  3. Le rappel post-opération retourne FLT_POSTOP_MORE_PROCESSING_REQUIRED.

  4. Après avoir traité l’opération d’E/S, la routine de travail appelle FltCompletePendedPostOperation pour renvoyer l’opération d’E/S au Gestionnaire de filtres.

  5. La routine de travail appelle FltFreeDeferredIoWorkItem pour libérer l’élément de travail.

Exigences

Exigence Valeur
client minimum pris en charge Windows 2000
plateforme cible Universel
d’en-tête fltkernel.h (include Fltkernel.h)
bibliothèque Fltmgr.lib
DLL Fltmgr.sys
IRQL <= DISPATCH_LEVEL

Voir aussi

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateDeferredIoWorkItem

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltFreeDeferredIoWorkItem

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK