Funzione FltQueueDeferredIoWorkItem (fltkernel.h)

La routine FltQueueDeferredIoWorkItem pubblica un'operazione di I/O basata su IRP in una coda di lavoro.

Sintassi

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

Parametri

[in] FltWorkItem

Puntatore all'elemento di lavoro da aggiungere alla coda di lavoro. L'elemento di lavoro deve essere stato allocato chiamando FltAllocateDeferredIoWorkItem.

[in] Data

Puntatore alla struttura FLT_CALLBACK_DATA per l'operazione di I/O. L'operazione deve essere un'operazione di I/O basata su IRP. Per determinare se una determinata struttura di dati di callback rappresenta un'operazione di I/O basata su IRP, usare la macro FLT_IS_IRP_OPERATION .

[in] WorkerRoutine

Puntatore a una routine di callback fornita dal chiamante. Questa routine viene dichiarata come segue:

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

dove:

  • FltWorkItem è un puntatore opaco a una struttura dell'elemento di lavoro posticipata.
  • CallbackData è un puntatore alla struttura dei dati di callback per l'operazione di I/O.
  • Il contesto è un puntatore di informazioni di contesto facoltativo passato come parametro Context di FltQueueDeferredIoWorkItem.

[in] QueueType

Specifica la coda in cui deve essere inserito l'elemento di lavoro che FltWorkItem punta. QueueType può essere uno dei valori seguenti.

Valore Significato
CriticalWorkQueue Inserire l'elemento di lavoro nella coda da cui un thread di sistema con un attributo di priorità in tempo reale elabora l'elemento di lavoro.
RitardatoWorkQueue Inserire l'elemento di lavoro nella coda da cui un thread di sistema con un attributo con priorità variabile elabora l'elemento di lavoro.

Il valore QueueTypeHyperCriticalWorkQueue è riservato per l'uso del sistema.

[in] Context

Puntatore a informazioni di contesto definite dal chiamante da passare come parametro Context della routine di callback specificata nel parametro WorkerRoutine .

Valore restituito

La routine FltQueueDeferredIoWorkItem restituisce STATUS_SUCCESS o un valore NTSTATUS appropriato, ad esempio uno dei seguenti:

Codice restituito Descrizione
STATUS_FLT_DELETING_OBJECT L'istanza di destinazione per l'operazione di I/O (Data-Iopb-TargetInstance>>) viene distrutta. Si tratta di un codice di errore.
STATUS_FLT_NOT_SAFE_TO_POST_OPERATION L'operazione di I/O non può essere pubblicata in modo sicuro in un thread di lavoro. Per possibili motivi per cui viene restituito questo codice di errore, vedere Osservazioni.

Commenti

La routine FltQueueDeferredIoWorkItem pubblica un'operazione di I/O in una coda di lavoro di sistema. La routine di callback di WorkerRoutine specificata viene chiamata nel contesto di un thread di sistema, in IRQL PASSIVE_LEVEL.

L'operazione deve essere un'operazione di I/O basata su IRP. Per determinare se una determinata struttura di dati di callback rappresenta un'operazione di I/O basata su IRP, usare la macro FLT_IS_IRP_OPERATION .

FltQueueDeferredIoWorkItem restituisce STATUS_FLT_NOT_SAFE_TO_POST_OPERATION quando l'operazione di I/O non può essere pubblicata in modo sicuro in un thread di lavoro. I motivi possibili includono quanto segue:

  • FltQueueDeferredIoWorkItem non può pubblicare un'operazione di I/O di paging in un thread di lavoro.

  • FltQueueDeferredIoWorkItem non può inviare un'operazione di I/O a un thread di lavoro se il campo TopLevelIrp del thread corrente non è NULL, perché la ricorsione del file system risultante potrebbe causare deadlock o overflow dello stack. Per altre informazioni, vedere IoGetTopLevelIrp.

Un driver minifilter può usare FltQueueDeferredIoWorkItem in una routine di callback preoperazione (PFLT_PRE_OPERATION_CALLBACK) come indicato di seguito:

  1. Il callback di preoperazione chiama FltAllocateDeferredIoWorkItem per allocare l'elemento di lavoro.

  2. Il callback di preoperazione chiama FltQueueDeferredIoWorkItem per pubblicare l'operazione nella coda di lavoro.

  3. Il callback di preoperazione restituisce FLT_PREOP_PENDING.

  4. Dopo l'elaborazione dell'operazione di I/O, la routine di lavoro chiama FltCompletePendedPreOperation per restituire l'operazione di I/O a Filter Manager.

  5. La routine di lavoro chiama FltFreeDeferredIoWorkItem per liberare l'elemento di lavoro.

Un driver minifilter può usare FltQueueDeferredIoWorkItem in una routine di callback post-operazione (PFLT_POST_OPERATION_CALLBACK) come indicato di seguito:

  1. Il callback post-operazione chiama FltAllocateDeferredIoWorkItem per allocare l'elemento di lavoro.

  2. Il callback post-operazione chiama FltQueueDeferredIoWorkItem per pubblicare l'operazione nella coda di lavoro.

  3. Il callback post-operazione restituisce FLT_POSTOP_MORE_PROCESSING_REQUIRED.

  4. Dopo aver elaborato l'operazione di I/O, la routine di lavoro chiama FltCompletePendedPostOperation per restituire l'operazione di I/O a Filter Manager.

  5. La routine di lavoro chiama FltFreeDeferredIoWorkItem per liberare l'elemento di lavoro.

Requisiti

Requisito Valore
Client minimo supportato Windows 2000
Piattaforma di destinazione Universale
Intestazione fltkernel.h (includere Fltkernel.h)
Libreria Fltmgr.lib
DLL Fltmgr.sys
IRQL <= DISPATCH_LEVEL

Vedi anche

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateDeferredIoWorkItem

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltFreeDeferredIoWorkItem

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK