FltQueueDeferredIoWorkItem-Funktion (fltkernel.h)
Die FltQueueDeferredIoWorkItem-Routine stellt einen IRP-basierten E/A-Vorgang in einer Arbeitswarteschlange bereit.
Syntax
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
);
Parameter
[in] FltWorkItem
Ein Zeiger auf das Arbeitselement, das der Arbeitswarteschlange hinzugefügt werden soll. Das Arbeitselement muss durch Aufrufen von FltAllocateDeferredIoWorkItem zugewiesen worden sein.
[in] Data
Ein Zeiger auf die FLT_CALLBACK_DATA Struktur für den E/A-Vorgang. Der Vorgang muss ein IRP-basierter E/A-Vorgang sein. Verwenden Sie das Makro FLT_IS_IRP_OPERATION , um zu bestimmen, ob eine bestimmte Rückrufdatenstruktur einen IRP-basierten E/A-Vorgang darstellt.
[in] WorkerRoutine
Ein Zeiger auf eine vom Anrufer bereitgestellte Workerrückrufroutine. Diese Routine wird wie folgt deklariert:
typedef VOID
(*PFLT_DEFERRED_IO_WORKITEM_ROUTINE) (
_In_ PFLT_DEFERRED_IO_WORKITEM FltWorkItem,
_In_ PFLT_CALLBACK_DATA CallbackData,
_In_opt_ PVOID Context
);
Dabei gilt:
- FltWorkItem ist ein undurchsichtiger Zeiger auf eine verzögerte Arbeitselementstruktur.
- CallbackData ist ein Zeiger auf die Rückrufdatenstruktur für den E/A-Vorgang.
- Context ist ein optionaler Kontextinformationszeiger, der als Context-Parameter von FltQueueDeferredIoWorkItem übergeben wurde.
[in] QueueType
Gibt die Warteschlange an, in die das Arbeitselement eingefügt werden soll, auf das FltWorkItem verweist. QueueType kann einer der folgenden Werte sein.
Wert | Bedeutung |
---|---|
CriticalWorkQueue | Fügen Sie das Arbeitselement in die Warteschlange ein, aus der ein Systemthread mit einem Echtzeitprioritätsattribut das Arbeitselement verarbeitet. |
DelayedWorkQueue | Fügen Sie das Arbeitselement in die Warteschlange ein, aus der ein Systemthread mit einem Attribut der Variablenpriorität das Arbeitselement verarbeitet. |
Der QueueType-WertHyperCriticalWorkQueue ist für die Systemverwendung reserviert.
[in] Context
Ein Zeiger auf vom Aufrufer definierte Kontextinformationen, die als Context-Parameter der im WorkerRoutine-Parameter angegebenen Rückrufroutine-Routine übergeben werden sollen.
Rückgabewert
Die FltQueueDeferredIoWorkItem-Routine gibt STATUS_SUCCESS oder einen entsprechenden NTSTATUS-Wert zurück, z. B. einen der folgenden:
Rückgabecode | Beschreibung |
---|---|
STATUS_FLT_DELETING_OBJECT | Das Ziel instance für den E/A-Vorgang (Data-Iopb-TargetInstance>>) wird abgerissen. Dies ist ein Fehlercode. |
STATUS_FLT_NOT_SAFE_TO_POST_OPERATION | Der E/A-Vorgang kann nicht sicher an einen Workerthread gesendet werden. Mögliche Gründe für die Rückgabe dieses Fehlercodes finden Sie unter Hinweise. |
Hinweise
Mit der FltQueueDeferredIoWorkItem-Routine wird ein E/A-Vorgang an eine Systemarbeitswarteschlange gesendet. Die angegebene WorkerRoutine-Rückrufroutine-Routine wird im Kontext eines Systemthreads aufgerufen, bei IRQL PASSIVE_LEVEL.
Der Vorgang muss ein IRP-basierter E/A-Vorgang sein. Verwenden Sie das Makro FLT_IS_IRP_OPERATION , um zu bestimmen, ob eine bestimmte Rückrufdatenstruktur einen IRP-basierten E/A-Vorgang darstellt.
FltQueueDeferredIoWorkItem gibt STATUS_FLT_NOT_SAFE_TO_POST_OPERATION zurück, wenn der E/A-Vorgang nicht sicher an einen Workerthread gesendet werden kann. Mögliche Gründe sind u. a. die folgenden:
FltQueueDeferredIoWorkItem kann keinen Paging-E/A-Vorgang in einem Workerthread veröffentlichen.
FltQueueDeferredIoWorkItem kann keinen E/A-Vorgang in einem Workerthread posten, wenn das TopLevelIrp-Feld des aktuellen Threads nicht NULL ist, da die resultierende Dateisystemrekursion Deadlocks oder Stapelüberläufe verursachen kann. Weitere Informationen finden Sie unter IoGetTopLevelIrp.
Ein Minifiltertreiber kann FltQueueDeferredIoWorkItem in einer PFLT_PRE_OPERATION_CALLBACK-Routine (Preoperation Callback) wie folgt verwenden:
Der Voroperationsrückruf ruft FltAllocateDeferredIoWorkItem auf, um das Arbeitselement zuzuweisen.
Der Voroperationsrückruf ruft FltQueueDeferredIoWorkItem auf, um den Vorgang in der Arbeitswarteschlange zu posten.
Der Voroperationsrückruf gibt FLT_PREOP_PENDING zurück.
Nach der Verarbeitung des E/A-Vorgangs ruft die Arbeitsroutine FltCompletePendedPreOperation auf, um den E/A-Vorgang an den Filter-Manager zurückzugeben.
Die Arbeitsroutine ruft FltFreeDeferredIoWorkItem auf, um das Arbeitselement frei zu geben.
Ein Minifiltertreiber kann FltQueueDeferredIoWorkItem in einer Rückrufroutine nach dem Vorgang (PFLT_POST_OPERATION_CALLBACK) wie folgt verwenden:
Der Rückruf nach dem Vorgang ruft FltAllocateDeferredIoWorkItem auf, um das Arbeitselement zuzuweisen.
Der Rückruf nach dem Vorgang ruft FltQueueDeferredIoWorkItem auf, um den Vorgang in der Arbeitswarteschlange zu posten.
Der Rückruf nach dem Vorgang gibt FLT_POSTOP_MORE_PROCESSING_REQUIRED zurück.
Nach der Verarbeitung des E/A-Vorgangs ruft die Arbeitsroutine FltCompletePendedPostOperation auf, um den E/A-Vorgang an den Filter-Manager zurückzugeben.
Die Arbeitsroutine ruft FltFreeDeferredIoWorkItem auf, um das Arbeitselement frei zu geben.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 2000 |
Zielplattform | Universell |
Header | fltkernel.h (include Fltkernel.h) |
Bibliothek | Fltmgr.lib |
DLL | Fltmgr.sys |
IRQL | <= DISPATCH_LEVEL |