FLT_IO_PARAMETER_BLOCK Struktur (fltkernel.h)

Die FLT_IO_PARAMETER_BLOCK-Struktur enthält die Parameter für den E/A-Vorgang, der durch eine FLT_CALLBACK_DATA Rückrufdatenstruktur dargestellt wird.

Syntax

typedef struct _FLT_IO_PARAMETER_BLOCK {
  ULONG          IrpFlags;
  UCHAR          MajorFunction;
  UCHAR          MinorFunction;
  UCHAR          OperationFlags;
  UCHAR          Reserved;
  PFILE_OBJECT   TargetFileObject;
  PFLT_INSTANCE  TargetInstance;
  FLT_PARAMETERS Parameters;
} FLT_IO_PARAMETER_BLOCK, *PFLT_IO_PARAMETER_BLOCK;

Member

IrpFlags

Eine Bitmaske von Flags, die verschiedene Aspekte des E/A-Vorgangs angeben. Diese Flags werden nur für IRP-basierte Vorgänge verwendet. Die folgende Tabelle enthält Flagwerte.

Wert Bedeutung
IRP_BUFFERED_IO Der Vorgang ist ein gepufferter E/A-Vorgang.
IRP_CLOSE_OPERATION Der Vorgang ist ein Bereinigungs- oder Schließenvorgang.
IRP_DEALLOCATE_BUFFER Der E/A-Manager gibt den Puffer während der Abschlussphase für die IRP frei.
IRP_INPUT_OPERATION Der Vorgang ist ein Eingabevorgang.
IRP_NOCACHE Der Vorgang ist ein nicht zwischengespeicherter E/A-Vorgang.
IRP_PAGING_IO Der Vorgang ist ein Paging-E/A-Vorgang.
IRP_SYNCHRONOUS_API Der E/A-Vorgang ist synchron.
IRP_SYNCHRONOUS_PAGING_IO Der Vorgang ist ein synchroner E/A-Vorgang mit Paging.
IRP_MOUNT_COMPLETION Für den Vorgang wird eine Volumebereitstellung abgeschlossen.
IRP_CREATE_OPERATION Bei dem Vorgang handelt es sich um einen Create- oder Open-Vorgang.
IRP_READ_OPERATION Der E/A-Vorgang dient zum Lesen.
IRP_WRITE_OPERATION Der E/A-Vorgang dient zum Schreiben.
IRP_DEFER_IO_COMPLETION Der E/A-Abschluss des Vorgangs wird zurückgestellt.
IRP_ASSOCIATED_IRP Der Vorgang ist einem master IRP zugeordnet.
IRP_OB_QUERY_NAME Der Vorgang ist eine asynchrone Namensabfrage.
IRP_HOLD_DEVICE_QUEUE Reserviert.
IRP_UM_DRIVER_INITIATED_IO Der Vorgang stammt von einem Benutzermodustreiber.

MajorFunction

Der Hauptfunktionscode für den E/A-Vorgang. Hauptfunktionscodes werden für IRP-basierte Vorgänge, schnelle E/A-Vorgänge und Dateisystem-Rückrufvorgänge (FSFilter) verwendet. Weitere Informationen zu zusätzlichen Vorgängen finden Sie unter FLT_PARAMETERS.

MinorFunction

Der Nebenfunktionscode für den E/A-Vorgang. Dieser Member ist optional und kann NULL sein. Der Wert des MajorFunction-Members bestimmt die möglichen Werte. Weitere Informationen zu Nebenfunktionscodes finden Sie unter FLT_PARAMETERS.

OperationFlags

Eine Bitmaske von Flags, die verschiedene Aspekte des E/A-Vorgangs angeben. Diese Flags werden nur für IRP-basierte Vorgänge verwendet. Der Filter-Manager kopiert diese Flags aus dem Flags-Member der IO_STACK_LOCATION-Struktur , die dem IRP zugeordnet ist. Die folgende Tabelle zeigt die am häufigsten verwendeten Flagwerte.

Wert Bedeutung
SL_CASE_SENSITIVE Wird für IRP_MJ_CREATE verwendet. Wenn dieses Flag festgelegt ist, sollte bei Dateinamenvergleichen die Groß-/Kleinschreibung beachtet werden.
SL_EXCLUSIVE_LOCK Wird für IRP_MJ_LOCK_CONTROL verwendet. Wenn dieses Flag festgelegt ist, wird eine exklusive Bytebereichssperre angefordert. Andernfalls wird eine freigegebene Sperre angefordert.
SL_FAIL_IMMEDIATELY Wird für IRP_MJ_LOCK_CONTROL verwendet. Wenn dieses Flag festgelegt ist, sollte die Sperranforderung fehlschlagen, wenn sie nicht sofort erteilt werden kann.
SL_FORCE_ACCESS_CHECK Wird für IRP_MJ_CREATE verwendet. Wenn dieses Flag festgelegt ist, müssen Zugriffsprüfungen durchgeführt werden, auch wenn der Wert des RequestorMode-Members des IRP KernelMode ist.
SL_FORCE_DIRECT_WRITE Wird für IRP_MJ_WRITE und IOCTL_DISK_COPY_DATA verwendet. Wenn dieses Flag festgelegt ist, können Kernelmodustreiber in Volumebereiche schreiben, in die sie normalerweise aus Sicherheitsgründen nicht schreiben dürfen. Dieses Flag wird sowohl auf der Dateisystemebene als auch auf Speicherstapelebene aktiviert. Das SL_FORCE_DIRECT_WRITE-Flag ist in Windows Vista und höheren Versionen von Windows verfügbar.
SL_INDEX_SPECIFIED Wird für IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA und IRP_MJ_SET_QUOTA verwendet. Wenn dieses Flag festgelegt ist, sollte die Suche nach Verzeichnis-, Kontingent- oder erweiterten Attributinformationen am Eintrag in der Liste beginnen, dessen Index angegeben ist.
SL_OPEN_PAGING_FILE Wird für IRP_MJ_CREATE verwendet. Wenn dieses Flag festgelegt ist, handelt es sich bei der Datei um eine Auslagerungsdatei.
SL_OPEN_TARGET_DIRECTORY Wird für IRP_MJ_CREATE verwendet. Wenn dieses Flag festgelegt ist, sollte das übergeordnete Verzeichnis der Datei geöffnet werden.
SL_OVERRIDE_VERIFY_VOLUME Wird für IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_READ und IRP_MJ_WRITE verwendet. Wenn dieses Flag festgelegt ist, sollte der E/A-Vorgang auch dann ausgeführt werden, wenn das DO_VERIFY_VOLUME-Flag für das Geräteobjekt des Volumes festgelegt ist.
SL_RESTART_SCAN Wird für IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA und IRP_MJ_SET_QUOTA verwendet. Wenn dieses Flag festgelegt ist, sollte die Suche nach Verzeichnis-, Kontingent- oder erweiterten Attributinformationen mit dem ersten Eintrag im Verzeichnis oder der Liste beginnen. Andernfalls sollte der Scan nach dem vorherigen Scan fortgesetzt werden.
SL_RETURN_SINGLE_ENTRY Wird für IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA und IRP_MJ_SET_QUOTA verwendet. Wenn dieses Flag festgelegt ist, sollte die Suche nach Verzeichnis-, Kontingent- oder erweiterten Attributinformationen nur den ersten gefundenen Eintrag zurückgeben.
SL_WATCH_TREE Wird für IRP_MJ_DIRECTORY_CONTROL verwendet. Wenn dieses Flag festgelegt ist, sollten auch alle Unterverzeichnisse dieses Verzeichnisses überwacht werden. Andernfalls muss nur das Verzeichnis selbst überwacht werden.
SL_WRITE_THROUGH Wird für IRP_MJ_WRITE verwendet. Wenn dieses Flag festgelegt ist, müssen die Dateidaten in den persistenten Speicher geschrieben und nicht nur in den Cache geschrieben werden.

Reserved

Ist für das System reserviert. Nicht verwenden.

TargetFileObject

Ein Dateiobjektzeiger für die Datei oder das Verzeichnis, das das Ziel für diesen E/A-Vorgang ist.

TargetInstance

Ein undurchsichtiger instance Zeiger für den Minifilter, der das Ziel für diesen E/A-Vorgang ist.

Parameters

Eine FLT_PARAMETERS-Struktur , die die Parameter für den E/A-Vorgang enthält, die von den Membern MajorFunction und MinorFunction angegeben werden.

Hinweise

Die FLT_IO_PARAMETER_BLOCK-Struktur enthält die Parameter für den E/A-Vorgang, der durch eine Rückrufdatenstruktur (FLT_CALLBACK_DATA) dargestellt wird. Die Rückrufdatenstruktur enthält einen Zeiger auf die FLT_IO_PARAMETER_BLOCK-Struktur im Iopb-Element .

Ein Minifilter empfängt einen Zeiger auf die Rückrufdatenstruktur als Eingabeparameter Data oder CallbackData auf die folgenden Rückrufroutinentypen:

Die Preoperations- und Postoperationsrückrufroutinen eines Minifilters können den Inhalt der FLT_IO_PARAMETER_BLOCK-Struktur für den E/A-Vorgang ändern, mit Ausnahme der Member MajorFunction und Reserved . Wenn dies der Fall ist, muss FltSetCallbackDataDirty aufgerufen werden, es sei denn, es wurde auch das IoStatus-Element der Rückrufdatenstruktur für den Vorgang geändert. Andernfalls werden die geänderten Werte ignoriert.

Wenn der Filter-Manager einen Preoperation- oder Postoperation-Rückruf für einen Minifilter ausgibt, sind FltObjects-FileObject> und TargetFileObject (CallbackData-Iopb-TargetFileObject>>) zunächst identisch. Wenn ein Minifilter TargetFileObject oder TargetInstance ändert, führt der nachfolgende Aufruf von FltSetCallbackDataDirty aus einem Rückruf vor der Operation dazu, dass der Filter-Manager FltObjects-FileObject> und FltObjects-Instance> ersetzt, bevor der Vorgang an niedrigere Filter gesendet wird.

Wenn die Preoperations-Rückrufroutine eines Minifilters die Parameter für einen E/A-Vorgang ändert, erhalten alle Minifilter darunter im Minifilter instance Stapels die geänderten Parameter in ihren Rückrufroutinen vor und nach der Operation.

Die geänderten Parameter werden nicht von der eigenen Postoperation-Rückrufroutine des Minifilters oder von Minifiltern über diesem Minifilter im Minifilter instance-Stapels empfangen. In allen Fällen erhalten die Rückrufroutinen preoperation und postoperation eines Minifilters die gleichen Eingabeparameterwerte.

Wenn ein Minifilter den Wert des TargetInstance-Members ändert, muss der neue Wert ein Zeiger auf eine instance desselben Minifilters in derselben Höhe auf einem anderen Volume sein. Darüber hinaus muss das Geräteobjekt des neuen Volumes eine Stapelgröße aufweisen, die größer oder gleich der des Geräteobjekts des ursprünglichen Volumes ist.

Um die Stapelgröße für ein Volumegeräteobjekt abzurufen, gehen Sie bei einem undurchsichtigen instance Zeiger für eine an das Volume angefügte instance wie folgt vor:

  • Rufen Sie FltGetVolumeFromInstance auf, um den Volumezeiger abzurufen.
  • Rufen Sie FltGetDeviceObject auf, um einen Zeiger auf das Volumegerätobjekt abzurufen. Dieser Zeiger wird im DeviceObject-Parameter zurückgegeben. Die Stapelgröße des Geräteobjekts finden Sie unter DeviceObject-StackSize>.
  • Wenn der Volumezeiger nicht mehr benötigt wird, rufen Sie FltObjectDereference auf, um die Verweisanzahl zu verringern.
  • Wenn der Volumegeräteobjektzeiger nicht mehr benötigt wird, rufen Sie ObDereferenceObject auf, um die Verweisanzahl zu verringern.

Ein Minifilter kann den Wert des TargetFileObject-Members ändern. Der neue Wert muss jedoch ein Zeiger auf ein Dateiobjekt für eine Datei sein, die sich auf demselben Volume befindet wie das vom TargetInstance-Member angegebene instance.

Ein Minifilter kann den Wert des MajorFunction-Members nicht sicher ändern. Stattdessen muss ein neuer E/A-Vorgang initiiert werden.

Ein Minifilter kann einen E/A-Vorgang initiieren, indem er eine Supportroutine wie FltReadFile aufruft oder FltAllocateCallbackData aufruft , um eine Rückrufdatenstruktur zuzuweisen. Initialisieren der E/A-Parameter in der FLT_IO_PARAMETER_BLOCK-Struktur und Übergeben der Rückrufdatenstruktur an FltPerformSynchronousIo oder FltPerformAsynchronousIo.

Hinweis

Verwenden Sie Supportroutinen nach Möglichkeit beim Initiieren von E/A-Vorgängen. Ein Minifilter sollte nur dann eigene Rückrufdaten zuordnen, wenn keine Unterstützungsfunktion für einen bestimmten E/A-Vorgang vorhanden ist.

Anforderungen

Anforderung Wert
Header fltkernel.h (include Fltkernel.h)

Weitere Informationen

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FLT_PARAMETERS

FltAllocateCallbackData

FltClearCallbackDataDirty

FltDecodeParameters

FltIsCallbackDataDirty

FltReadFile

FltSetCallbackDataDirty

IO_STACK_LOCATION

IRP

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_CREATE

IRP_MJ_DEVICE_CONTROL

IRP_MJ_DIRECTORY_CONTROL

IRP_MJ_FILE_SYSTEM_CONTROL

IRP_MJ_FLUSH_BUFFERS

IRP_MJ_INTERNAL_DEVICE_CONTROL

IRP_MJ_LOCK_CONTROL

IRP_MJ_PNP

IRP_MJ_QUERY_EA

IRP_MJ_QUERY_INFORMATION

IRP_MJ_QUERY_QUOTA

IRP_MJ_QUERY_SECURITY

IRP_MJ_QUERY_VOLUME_INFORMATION

IRP_MJ_READ

IRP_MJ_SET_EA

IRP_MJ_SET_INFORMATION

IRP_MJ_SET_QUOTA

IRP_MJ_SET_SECURITY

IRP_MJ_SET_VOLUME_INFORMATION

IRP_MJ_SHUTDOWN

IRP_MJ_WRITE

PFLT_COMPLETED_ASYNC_IO_CALLBACK

PFLT_GENERATE_FILE_NAME

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK