Freigeben über


FltQueueDeferredIoWorkItem-Funktion (fltkernel.h)

Die FltQueueDeferredIoWorkItem Routine sendet einen IRP-basierten E/A-Vorgang in einer Arbeitswarteschlange.

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 die Arbeitsaufgabe, die der Arbeitswarteschlange hinzugefügt werden soll. Die Arbeitsaufgabe muss durch Aufrufen 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. Um zu bestimmen, ob eine bestimmte Rückrufdatenstruktur einen IRP-basierten E/A-Vorgang darstellt, verwenden Sie das FLT_IS_IRP_OPERATION Makro.

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

wo:

  • FltWorkItem- ist ein undurchsichtiger Zeiger auf eine Struktur zurückgestellter Arbeitsaufgaben.
  • CallbackData- ist ein Zeiger auf die Rückrufdatenstruktur für den E/A-Vorgang.
  • Context ist ein optionaler Kontextinformationspunkt, der als Context-Parameter von FltQueueDeferredIoWorkItemübergeben wurde.

[in] QueueType

Gibt die Warteschlange an, in die die Arbeitsaufgabe FltWorkItem Punkt eingefügt werden soll. QueueType- kann einer der folgenden Werte sein:

Wert Bedeutung
CriticalWorkQueue- Fügen Sie die Arbeitsaufgabe in die Warteschlange ein, aus der ein Systemthread mit einem Attribut mit Echtzeitpriorität die Arbeitsaufgabe verarbeitet.
DelayedWorkQueue Fügen Sie die Arbeitsaufgabe in die Warteschlange ein, aus der ein Systemthread mit einem variablen Prioritätsattribut die Arbeitsaufgabe verarbeitet.

Der QueueType-wertHyperCriticalWorkQueue für die Systemverwendung reserviert ist.

[in] Context

Ein Zeiger zum Aufrufen von kontextdefinierten Kontextinformationen, die als Context-Parameter der rückrufroutinierten Parameter übergeben werden sollen.

Rückgabewert

Die FltQueueDeferredIoWorkItem- Routine gibt STATUS_SUCCESS oder einen entsprechenden NTSTATUS-Wert wie einen der folgenden zurück:

Rückgabecode Beschreibung
STATUS_FLT_DELETING_OBJECT Die Zielinstanz für den E/A-Vorgang (Data->Iopb->TargetInstance) wird heruntergerissen. Dies ist ein Fehlercode.
STATUS_FLT_NOT_SAFE_TO_POST_OPERATION Der E/A-Vorgang kann nicht sicher in einen Arbeitsthread gepostet werden. Mögliche Gründe für die Rückgabe dieses Fehlercodes finden Sie in den Hinweisen.

Bemerkungen

Die FltQueueDeferredIoWorkItem Routine sendet einen E/A-Vorgang in einer Systemarbeitswarteschlange. Die angegebene WorkerRoutine Rückrufroutine wird im Kontext eines Systemthreads bei IRQL-PASSIVE_LEVEL aufgerufen.

Der Vorgang muss ein IRP-basierter E/A-Vorgang sein. Um zu bestimmen, ob eine bestimmte Rückrufdatenstruktur einen IRP-basierten E/A-Vorgang darstellt, verwenden Sie das FLT_IS_IRP_OPERATION Makro.

FltQueueDeferredIoWorkItem- gibt STATUS_FLT_NOT_SAFE_TO_POST_OPERATION zurück, wenn der E/A-Vorgang nicht sicher in einen Arbeitsthread gepostet werden kann. Mögliche Gründe sind:

  • FltQueueDeferredIoWorkItem kann keinen Auslagerungs-E/A-Vorgang in einem Arbeitsthread bereitstellen.

  • FltQueueDeferredIoWorkItem kann keinen E/A-Vorgang in einem Arbeitsthread bereitstellen, wenn das TopLevelIrp- Feld des aktuellen Threads nicht NULL-ist, da die resultierende Dateisystem-Rekursion Deadlocks oder Stapelüberläufe verursachen kann. Weitere Informationen finden Sie unter IoGetTopLevelIrp.

Ein Minifiltertreiber kann FltQueueDeferredIoWorkItem- in einer Preoperation-Rückrufroutine (PFLT_PRE_OPERATION_CALLBACK) wie folgt verwenden:

  1. Der Voroperationsrückruf ruft FltAllocateDeferredIoWorkItem- auf, um die Arbeitsaufgabe zuzuweisen.

  2. Der Voroperationsrückruf ruft FltQueueDeferredIoWorkItem- auf, um den Vorgang in der Arbeitswarteschlange zu veröffentlichen.

  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 die Arbeitsaufgabe frei zu geben.

Ein Minifiltertreiber kann FltQueueDeferredIoWorkItem- in einer Post-Operation-Rückrufroutine (PFLT_POST_OPERATION_CALLBACK) wie folgt verwenden:

  1. Der Rückruf nach dem Vorgang ruft FltAllocateDeferredIoWorkItem- auf, um die Arbeitsaufgabe zuzuweisen.

  2. Der Rückruf nach dem Vorgang ruft FltQueueDeferredIoWorkItem- auf, um den Vorgang in der Arbeitswarteschlange zu veröffentlichen.

  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 die Arbeitsaufgabe frei zu geben.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 2000
Zielplattform- Universal
Header- fltkernel.h (include Fltkernel.h)
Library Fltmgr.lib
DLL- Fltmgr.sys
IRQL- <= DISPATCH_LEVEL

Siehe auch

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateDeferredIoWorkItem-

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltFreeDeferredIoWorkItem-

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK