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:

  1. Der Voroperationsrückruf ruft FltAllocateDeferredIoWorkItem auf, um das Arbeitselement zuzuweisen.

  2. Der Voroperationsrückruf ruft FltQueueDeferredIoWorkItem auf, um den Vorgang in der Arbeitswarteschlange zu posten.

  3. Der Voroperationsrückruf gibt FLT_PREOP_PENDING zurück.

  4. Nach der Verarbeitung des E/A-Vorgangs ruft die Arbeitsroutine FltCompletePendedPreOperation auf, um den E/A-Vorgang an den Filter-Manager zurückzugeben.

  5. 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:

  1. Der Rückruf nach dem Vorgang ruft FltAllocateDeferredIoWorkItem auf, um das Arbeitselement zuzuweisen.

  2. Der Rückruf nach dem Vorgang ruft FltQueueDeferredIoWorkItem auf, um den Vorgang in der Arbeitswarteschlange zu posten.

  3. Der Rückruf nach dem Vorgang gibt FLT_POSTOP_MORE_PROCESSING_REQUIRED zurück.

  4. Nach der Verarbeitung des E/A-Vorgangs ruft die Arbeitsroutine FltCompletePendedPostOperation auf, um den E/A-Vorgang an den Filter-Manager zurückzugeben.

  5. 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

Weitere Informationen

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateDeferredIoWorkItem

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltFreeDeferredIoWorkItem

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK