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. In der folgenden Tabelle sind Flagwerte aufgeführt.
Wert | Bedeutung |
---|---|
IRP_BUFFERED_IO | Der Vorgang ist ein gepufferter E/A-Vorgang. |
IRP_CLOSE_OPERATION | Der Vorgang ist ein Bereinigungs- oder Schließvorgang. |
IRP_DEALLOCATE_BUFFER | Der E/A-Manager gibt den Puffer während der Abschlussphase für das 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 Auslagerungs-E/A-Vorgang. |
IRP_SYNCHRONOUS_API | Der E/A-Vorgang ist synchron. |
IRP_SYNCHRONOUS_PAGING_IO | Der Vorgang ist ein synchroner Paging-E/A-Vorgang. |
IRP_MOUNT_COMPLETION | Für den Vorgang wird eine Volumebereitstellung abgeschlossen. |
IRP_CREATE_OPERATION | Der Vorgang ist ein Vorgang zum Erstellen oder Öffnen. |
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 verzögert. |
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-Elements 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. In der folgenden Tabelle sind die am häufigsten verwendeten Flagwerte aufgeführt.
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 gewährt werden kann. |
SL_FORCE_ACCESS_CHECK | Wird für IRP_MJ_CREATE verwendet. Wenn dieses Flag festgelegt ist, müssen Zugriffsüberprüfungen auch dann durchgeführt werden, wenn der Wert des RequestorMode-Elements 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 aus Sicherheitsgründen normalerweise nicht schreiben können. Dieses Flag wird sowohl auf der Dateisystem- als auch auf der Speicherstapelebene überprüft. 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 flag DO_VERIFY_VOLUME 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 die Überprüfung von der vorherigen Überprüfung 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 Instanzzeiger 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:
- PFLT_POST_OPERATION_CALLBACK
- PFLT_PRE_OPERATION_CALLBACK
- PFLT_COMPLETED_ASYNC_IO_CALLBACK
- PFLT_GENERATE_FILE_NAME
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-Instanzstapel die geänderten Parameter in ihren Rückrufroutinen vor und nach der Operation.
Die geänderten Parameter werden nicht von der postoperationseigenen Rückrufroutine des Minifilters oder von Minifiltern über diesem Minifilter im Minifilter-Instanzstapel 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 Instanz 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 Instanzzeiger für eine Instanz, die an das Volume angefügt ist, 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 wie die vom TargetInstance-Member angegebene Instanz befindet.
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_PARAMETERS für IRP_MJ_ACQUIRE_FOR_MOD_WRITE
- FLT_PARAMETERS für IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
- FLT_PARAMETERS für IRP_MJ_CREATE
- FLT_PARAMETERS für IRP_MJ_CREATE_MAILSLOT
- FLT_PARAMETERS für IRP_MJ_CREATE_NAMED_PIPE
- FLT_PARAMETERS für IRP_MJ_DEVICE_CONTROL
- FLT_PARAMETERS für IRP_MJ_DIRECTORY_CONTROL
- FLT_PARAMETERS für IRP_MJ_FAST_IO_CHECK_IF_POSSIBLE
- FLT_PARAMETERS für IRP_MJ_FILE_SYSTEM_CONTROL
- FLT_PARAMETERS für IRP_MJ_INTERNAL_DEVICE_CONTROL
- FLT_PARAMETERS für IRP_MJ_LOCK_CONTROL
- FLT_PARAMETERS für IRP_MJ_MDL_READ
- FLT_PARAMETERS für IRP_MJ_MDL_READ_COMPLETE
- FLT_PARAMETERS für IRP_MJ_MDL_WRITE_COMPLETE
- FLT_PARAMETERS für IRP_MJ_NETWORK_QUERY_OPEN
- FLT_PARAMETERS für IRP_MJ_PNP
- FLT_PARAMETERS für IRP_MJ_PREPARE_MDL_WRITE
- FLT_PARAMETERS für IRP_MJ_QUERY_EA
- FLT_PARAMETERS für IRP_MJ_QUERY_INFORMATION
- FLT_PARAMETERS für IRP_MJ_QUERY_OPEN
- FLT_PARAMETERS für IRP_MJ_QUERY_QUOTA
- FLT_PARAMETERS für IRP_MJ_QUERY_SECURITY
- FLT_PARAMETERS für IRP_MJ_QUERY_VOLUME_INFORMATION
- FLT_PARAMETERS für IRP_MJ_READ
- FLT_PARAMETERS für IRP_MJ_RELEASE_FOR_MOD_WRITE
- FLT_PARAMETERS für IRP_MJ_RELEASE_FOR_SECTION_SYNCHRONIZATION
- FLT_PARAMETERS für IRP_MJ_SET_EA
- FLT_PARAMETERS für IRP_MJ_SET_INFORMATION
- FLT_PARAMETERS für IRP_MJ_SET_QUOTA
- FLT_PARAMETERS für IRP_MJ_SET_SECURITY
- FLT_PARAMETERS für IRP_MJ_SET_VOLUME_INFORMATION
- FLT_PARAMETERS für IRP_MJ_SYSTEM_CONTROL
- FLT_PARAMETERS für IRP_MJ_VOLUME_MOUNT
- FLT_PARAMETERS für IRP_MJ_WRITE