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:
Il callback di preoperazione chiama FltAllocateDeferredIoWorkItem per allocare l'elemento di lavoro.
Il callback di preoperazione chiama FltQueueDeferredIoWorkItem per pubblicare l'operazione nella coda di lavoro.
Il callback di preoperazione restituisce FLT_PREOP_PENDING.
Dopo l'elaborazione dell'operazione di I/O, la routine di lavoro chiama FltCompletePendedPreOperation per restituire l'operazione di I/O a Filter Manager.
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:
Il callback post-operazione chiama FltAllocateDeferredIoWorkItem per allocare l'elemento di lavoro.
Il callback post-operazione chiama FltQueueDeferredIoWorkItem per pubblicare l'operazione nella coda di lavoro.
Il callback post-operazione restituisce FLT_POSTOP_MORE_PROCESSING_REQUIRED.
Dopo aver elaborato l'operazione di I/O, la routine di lavoro chiama FltCompletePendedPostOperation per restituire l'operazione di I/O a Filter Manager.
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 |