Partager via


Fonction FltQueueDeferredIoWorkItem (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 de 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.
  • Le contexte 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 vers lequel FltWorkItem pointe doit être inséré. 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 retournée

La routine FltQueueDeferredIoWorkItem retourne STATUS_SUCCESS ou une valeur NTSTATUS appropriée, par exemple :

Code de retour Description
STATUS_FLT_DELETING_OBJECT Le instance cible pour l’opération d’E/S (Data-Iopb-TargetInstance>>) est en cours de suppression. 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 Remarques pour connaître les 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, au 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é dans un thread worker. Les raisons possibles sont les suivantes :

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

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

Un pilote de minifiltre 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 pour 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 de minifiltre 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.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000
Plateforme cible Universal
En-tête fltkernel.h (inclure 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