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 :
Le rappel de préopération appelle FltAllocateDeferredIoWorkItem pour allouer l’élément de travail.
Le rappel de préopération appelle FltQueueDeferredIoWorkItem pour publier l’opération dans la file d’attente de travail.
Le rappel de préopération retourne FLT_PREOP_PENDING.
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.
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 :
Le rappel post-opération appelle FltAllocateDeferredIoWorkItem pour allouer l’élément de travail.
Le rappel post-opération appelle FltQueueDeferredIoWorkItem pour publier l’opération dans la file d’attente de travail.
Le rappel post-opération retourne FLT_POSTOP_MORE_PROCESSING_REQUIRED.
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.
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 |