Condividi tramite


Funzione FltQueueDeferredIoWorkItem (fltkernel.h)

La routine FltQueueDeferredIoWorkItem invia un'operazione di I/O basata su IRP a 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, utilizzare la macro FLT_IS_IRP_OPERATION.

[in] WorkerRoutine

Puntatore a una routine di callback del ruolo di lavoro 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 posticipato.
  • callbackData è un puntatore alla struttura dei dati di callback per l'operazione di I/O.
  • Context è un puntatore facoltativo alle informazioni sul contesto 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.
DelayedWorkQueue Inserire l'elemento di lavoro nella coda da cui un thread di sistema con un attributo di priorità variabile elabora l'elemento di lavoro.

Il valore QueueType HyperCriticalWorkQueue è riservato per l'uso del sistema.

[in] Context

Puntatore alle informazioni sul 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 registrata in modo sicuro in un thread di lavoro. Per possibili motivi per cui viene restituito questo codice di errore, vedere la sezione Osservazioni.

Osservazioni

La routine FltQueueDeferredIoWorkItem invia un'operazione di I/O a una coda di lavoro di sistema. Il WorkerRoutine specificato routine di callback viene chiamato nel contesto di un thread di sistema, in PASSIVE_LEVEL IRQL.

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, utilizzare la macro FLT_IS_IRP_OPERATION.

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

  • 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 minifiltro può usare FltQueueDeferredIoWorkItem in una routine di callback di 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 Gestione filtri.

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

Un driver minifiltro 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 l'elaborazione dell'operazione di I/O, la routine di lavoro chiama FltCompletePendedPostOperation per restituire l'operazione di I/O a Gestione filtri.

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

Fabbisogno

Requisito Valore
client minimo supportato Windows 2000
piattaforma di destinazione Universale
intestazione fltkernel.h (include Fltkernel.h)
libreria Fltmgr.lib
dll Fltmgr.sys
IRQL <= DISPATCH_LEVEL

Vedere anche

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateDeferredIoWorkItem

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltFreeDeferredIoWorkItem

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK