IO_STACK_LOCATION Struktur (wdm.h)
Die IO_STACK_LOCATION-Struktur definiert eine I/O-Stapelposition, bei der es sich um einen Eintrag im E/A-Stapel handelt, der den einzelnen IRP zugeordnet ist. Jeder I/O-Stapelspeicherort in einem IRP verfügt über einige allgemeine Member und einige anforderungstypspezifische Member.
Syntax
typedef struct _IO_STACK_LOCATION {
UCHAR MajorFunction;
UCHAR MinorFunction;
UCHAR Flags;
UCHAR Control;
union {
struct {
PIO_SECURITY_CONTEXT SecurityContext;
ULONG Options;
USHORT POINTER_ALIGNMENT FileAttributes;
USHORT ShareAccess;
ULONG POINTER_ALIGNMENT EaLength;
} Create;
struct {
PIO_SECURITY_CONTEXT SecurityContext;
ULONG Options;
USHORT POINTER_ALIGNMENT Reserved;
USHORT ShareAccess;
PNAMED_PIPE_CREATE_PARAMETERS Parameters;
} CreatePipe;
struct {
PIO_SECURITY_CONTEXT SecurityContext;
ULONG Options;
USHORT POINTER_ALIGNMENT Reserved;
USHORT ShareAccess;
PMAILSLOT_CREATE_PARAMETERS Parameters;
} CreateMailslot;
struct {
ULONG Length;
ULONG POINTER_ALIGNMENT Key;
ULONG Flags;
LARGE_INTEGER ByteOffset;
} Read;
struct {
ULONG Length;
ULONG POINTER_ALIGNMENT Key;
ULONG Flags;
LARGE_INTEGER ByteOffset;
} Write;
struct {
ULONG Length;
PUNICODE_STRING FileName;
FILE_INFORMATION_CLASS FileInformationClass;
ULONG POINTER_ALIGNMENT FileIndex;
} QueryDirectory;
struct {
ULONG Length;
ULONG POINTER_ALIGNMENT CompletionFilter;
} NotifyDirectory;
struct {
ULONG Length;
ULONG POINTER_ALIGNMENT CompletionFilter;
DIRECTORY_NOTIFY_INFORMATION_CLASS POINTER_ALIGNMENT DirectoryNotifyInformationClass;
} NotifyDirectoryEx;
struct {
ULONG Length;
FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
} QueryFile;
struct {
ULONG Length;
FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
PFILE_OBJECT FileObject;
union {
struct {
BOOLEAN ReplaceIfExists;
BOOLEAN AdvanceOnly;
};
ULONG ClusterCount;
HANDLE DeleteHandle;
};
} SetFile;
struct {
ULONG Length;
PVOID EaList;
ULONG EaListLength;
ULONG POINTER_ALIGNMENT EaIndex;
} QueryEa;
struct {
ULONG Length;
} SetEa;
struct {
ULONG Length;
FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
} QueryVolume;
struct {
ULONG Length;
FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
} SetVolume;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT FsControlCode;
PVOID Type3InputBuffer;
} FileSystemControl;
struct {
PLARGE_INTEGER Length;
ULONG POINTER_ALIGNMENT Key;
LARGE_INTEGER ByteOffset;
} LockControl;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT IoControlCode;
PVOID Type3InputBuffer;
} DeviceIoControl;
struct {
SECURITY_INFORMATION SecurityInformation;
ULONG POINTER_ALIGNMENT Length;
} QuerySecurity;
struct {
SECURITY_INFORMATION SecurityInformation;
PSECURITY_DESCRIPTOR SecurityDescriptor;
} SetSecurity;
struct {
PVPB Vpb;
PDEVICE_OBJECT DeviceObject;
ULONG OutputBufferLength;
} MountVolume;
struct {
PVPB Vpb;
PDEVICE_OBJECT DeviceObject;
} VerifyVolume;
struct {
struct _SCSI_REQUEST_BLOCK *Srb;
} Scsi;
struct {
ULONG Length;
PSID StartSid;
PFILE_GET_QUOTA_INFORMATION SidList;
ULONG SidListLength;
} QueryQuota;
struct {
ULONG Length;
} SetQuota;
struct {
DEVICE_RELATION_TYPE Type;
} QueryDeviceRelations;
struct {
const GUID *InterfaceType;
USHORT Size;
USHORT Version;
PINTERFACE Interface;
PVOID InterfaceSpecificData;
} QueryInterface;
struct {
PDEVICE_CAPABILITIES Capabilities;
} DeviceCapabilities;
struct {
PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
} FilterResourceRequirements;
struct {
ULONG WhichSpace;
PVOID Buffer;
ULONG Offset;
ULONG POINTER_ALIGNMENT Length;
} ReadWriteConfig;
struct {
BOOLEAN Lock;
} SetLock;
struct {
BUS_QUERY_ID_TYPE IdType;
} QueryId;
struct {
DEVICE_TEXT_TYPE DeviceTextType;
LCID POINTER_ALIGNMENT LocaleId;
} QueryDeviceText;
struct {
BOOLEAN InPath;
BOOLEAN Reserved[3];
DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
} UsageNotification;
struct {
SYSTEM_POWER_STATE PowerState;
} WaitWake;
struct {
PPOWER_SEQUENCE PowerSequence;
} PowerSequence;
#if ...
struct {
union {
ULONG SystemContext;
SYSTEM_POWER_STATE_CONTEXT SystemPowerStateContext;
};
POWER_STATE_TYPE POINTER_ALIGNMENT Type;
POWER_STATE POINTER_ALIGNMENT State;
POWER_ACTION POINTER_ALIGNMENT ShutdownType;
} Power;
#else
struct {
ULONG SystemContext;
POWER_STATE_TYPE POINTER_ALIGNMENT Type;
POWER_STATE POINTER_ALIGNMENT State;
POWER_ACTION POINTER_ALIGNMENT ShutdownType;
} Power;
#endif
struct {
PCM_RESOURCE_LIST AllocatedResources;
PCM_RESOURCE_LIST AllocatedResourcesTranslated;
} StartDevice;
struct {
ULONG_PTR ProviderId;
PVOID DataPath;
ULONG BufferSize;
PVOID Buffer;
} WMI;
struct {
PVOID Argument1;
PVOID Argument2;
PVOID Argument3;
PVOID Argument4;
} Others;
} Parameters;
PDEVICE_OBJECT DeviceObject;
PFILE_OBJECT FileObject;
PIO_COMPLETION_ROUTINE CompletionRoutine;
PVOID Context;
} IO_STACK_LOCATION, *PIO_STACK_LOCATION;
Angehörige
MajorFunction
Der Hauptfunktionscode, der den Typ des auszuführenden E/A-Vorgangs angibt.
MinorFunction
Ein Unterfunktionscode für MajorFunction. Der PnP-Manager, der Power Manager, Dateisystemtreiber und SCSI-Klassentreiber legen diesen Member für einige Anforderungen fest.
Flags
Anforderungstypspezifische Werte, die fast ausschließlich von Dateisystemtreibern verwendet werden. Wechselmedientreiber überprüfen, ob dieses Element mit SL_OVERRIDE_VERIFY_VOLUME für Leseanforderungen festgelegt ist, um festzustellen, ob der Lesevorgang fortgesetzt werden soll, auch wenn die Flags des Geräteobjekts mit DO_VERIFY_VOLUME festgelegt sind. Zwischentreiber, die über einen Wechselmedientreiber gestapelt sind, müssen dieses Element in den I/O-Stapelspeicherort des nächsten niedrigeren Treibers in allen eingehenden IRP_MJ_READ-Anforderungen kopieren.
Dokumentation zu anderen SL_*
Flags für IRP_MJ_CREATE finden Sie unter IRP_MJ_CREATE (IFS).
Mögliche Kennzeichenwerte sind:
Flagge | Wert | Beschreibung |
---|---|---|
SL_KEY_SPECIFIED | 0x01 |
Gibt an, dass die IO_STACK_LOCATION.Parameters.Read(OrWrite).Key enthält, welche Kopie eines bestimmten Sektors gelesen werden soll, wenn Redundanz aktiviert ist. Dieses Kennzeichen wird heute nur für IRP_MJ_READ Vorgänge verwendet. |
SL_OVERRIDE_VERIFY_VOLUME | 0x02 |
Mit dieser Kennzeichnung wird ermittelt, ob der Lesevorgang fortgesetzt werden soll, auch wenn die Flags des Geräteobjekts mit DO_VERIFY_VOLUME festgelegt sind. |
SL_WRITE_THROUGH | 0x04 |
Dieses Flag informiert den Speichertreiber, geeignete Flags festzulegen, sodass der Datenträger den Schreibcache umgeht, um zu erzwingen, dass der Datenträger in sein persistentes Speichermedium schreibt. Dieses Kennzeichen ist gerätespezifisch; Nicht alle Datenträgerlaufwerke unterstützen das Umgehen des Datenträgercaches. |
SL_FT_SEQUENTIAL_WRITE | 0x08 |
Reserviert für die Systemverwendung. |
SL_FORCE_DIRECT_WRITE | 0x10 |
Mit diesem Flag können Kernelmodustreiber in Volumebereiche schreiben, in die sie normalerweise nicht schreiben können, weil direkte Schreibvorgänge im Dateisystem- und Speichertreiberstapel blockiert werden. Das blockieren von direkten Schreibvorgängen trägt zur Verbesserung der Sicherheit bei. Dieses Kennzeichen wird sowohl auf der Dateisystemebene als auch auf der Speicherstapelebene überprüft. Weitere Informationen zum blockieren von direkten Schreibvorgängen finden Sie unter Blockieren von Direkten Schreibvorgängen auf Volumes und Datenträger. |
SL_REALTIME_STREAM | 0x20 |
Dieses Kennzeichen weist darauf hin, dass die E/A für Echtzeitstreaminganforderungen an einen CD-ROM Klassentreiber bestimmt ist. Dadurch wird der Treiber aufgefordert, LESE-/SCHREIBZUGRIFFsvorgänge mit einer garantierten Geschwindigkeit für echtzeitbasiertes Streaming auszuführen. Dieses Kennzeichen ist nur für optische Medien gültig. |
SL_PERSISTENT_MEMORY_FIXED_MAPPING | 0x20 |
Die beständige Speicherzuordnung der Bytes in der Schreibanforderung kann beim Behandeln dieser Schreibanforderung nicht geändert werden. Dieses Kennzeichen gilt nur für ein dauerhaftes Speichergerät und IRP_MJ_WRITE. |
Für persistente Speichergeräte ist einer der Gründe für das Neumapping (Ändern der physischen Adresse eines bestimmten LBA) auf persistenten Speichergeräten die effiziente Atomität auf Sektorebene. Wenn die Kennzeichnung nicht festgelegt ist, ist das Neumapping insbesondere dann zulässig, wenn dies dazu führt, dass der Faktor Sektoratomität bereitstellt. Dateisysteme (oder der Anforderer) bevorzugen, dass ein beständiger Speichergerätetreiber Sektoratomität bereitstellt. Wenn das Flag festgelegt ist, muss ein persistenter Speichertreiber die physischen Adressen, die den LBAs entsprechen, nicht neu zuordnen. Wenn das bedeutet, dass sektorspezifische Atomität nicht bereitgestellt werden kann, also sei es. Der Fahrer ist jedoch mehr als willkommen, sektorspezifische Atomität bereitzustellen, solange es keine Neuzuordnung gibt.
Control
Treiber können dieses Element überprüfen, um festzustellen, ob es mit SL_PENDING_RETURNED festgelegt ist und unter welchen Bedingungen die CompletionRoutine- aufgerufen wird. Treiber haben schreibgeschützten Zugriff auf dieses Mitglied. Treiber rufen IoSetCompletionRoutine oder IoSetCompletionRoutineEx- auf, um diese Bedingungen anzugeben.
Parameters
Eine Vereinigung, die von den Haupt- und Neben-IRP-Funktionscodewerten in MajorFunction und MinorFunction-abhängt. Die folgende Tabelle zeigt, welche IRPs die einzelnen Member der Parameters Union verwenden.
Weitere Informationen finden Sie unter IRP Major Function Codes.
Parameters.Create
Systemdienstparameter für NtCreateFile.
Parameters.Create.SecurityContext
Parameters.Create.Options
Parameters.Create.FileAttributes
Parameters.Create.ShareAccess
Parameters.Create.EaLength
Parameters.CreatePipe
Systemdienstparameter fo NtCreateNamedPipeFile.
Parameters.CreatePipe.SecurityContext
Parameters.CreatePipe.Options
Parameters.CreatePipe.Reserved
Parameters.CreatePipe.ShareAccess
Parameters.CreatePipe.Parameters
Parameters.CreateMailslot
Systemdienstparameter für NtCreateMailslotFile.
Parameters.CreateMailslot.SecurityContext
Parameters.CreateMailslot.Options
Parameters.CreateMailslot.Reserved
Parameters.CreateMailslot.ShareAccess
Parameters.CreateMailslot.Parameters
Parameters.Read
Systemdienstparameter für NtReadFile-.
Parameters.Read.Length
Parameters.Read.Key
Parameters.Read.Flags
Parameters.Read.ByteOffset
Parameters.Write
Systemdienstparameter für NtWriteFile.
Parameters.Write.Length
Parameters.Write.Key
Parameters.Write.Flags
Parameters.Write.ByteOffset
Parameters.QueryDirectory
Systemdienstparameter für NtQueryDirectoryFile.
Parameters.QueryDirectory.Length
Parameters.QueryDirectory.FileName
Parameters.QueryDirectory.FileInformationClass
Parameters.QueryDirectory.FileIndex
Parameters.NotifyDirectory
Systemdienstparameter für NtNotifyChangeDirectoryFile.
Parameters.NotifyDirectory.Length
Parameters.NotifyDirectory.CompletionFilter
Parameters.NotifyDirectoryEx
Systemdienstparameter für NtNotifyChangeDirectoryFileEx.
Parameters.NotifyDirectoryEx.Length
Parameters.NotifyDirectoryEx.CompletionFilter
Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass
Parameters.QueryFile
Systemdienstparameter für NtQueryInformationFile.
Parameters.QueryFile.Length
Parameters.QueryFile.FileInformationClass
Parameters.SetFile
Systemdienstparameter für NtSetInformationFile.
Parameters.SetFile.Length
Parameters.SetFile.FileInformationClass
Parameters.SetFile.FileObject
Parameters.SetFile.ReplaceIfExists
Parameters.SetFile.AdvanceOnly
Parameters.SetFile.ClusterCount
Parameters.SetFile.DeleteHandle
Parameters.QueryEa
Systemdienstparameter für NtQueryEaFile.
Parameters.QueryEa.Length
Parameters.QueryEa.EaList
Parameters.QueryEa.EaListLength
Parameters.QueryEa.EaIndex
Parameters.SetEa
Systemdienstparameter für NtSetEaFile.
Parameters.SetEa.Length
Parameters.QueryVolume
Systemdienstparameter für NtQueryVolumeInformationFile.
Parameters.QueryVolume.Length
Parameters.QueryVolume.FsInformationClass
Parameters.SetVolume
Systemdienstparameter für NtSetVolumeInformationFile.
Parameters.SetVolume.Length
Parameters.SetVolume.FsInformationClass
Parameters.FileSystemControl
Systemdienstparameter für NtFsControlFile.
Parameters.FileSystemControl.OutputBufferLength
Parameters.FileSystemControl.InputBufferLength
Parameters.FileSystemControl.FsControlCode
Parameters.FileSystemControl.Type3InputBuffer
Parameters.LockControl
Systemdienstparameter für LockFile/NtUnlockFile.
Parameters.LockControl.Length
Parameters.LockControl.Key
Parameters.LockControl.ByteOffset
Parameters.DeviceIoControl
Systemdienstparameter für NtDeviceIoControlFile.
Parameters.DeviceIoControl.OutputBufferLength
Parameters.DeviceIoControl.InputBufferLength
Parameters.DeviceIoControl.IoControlCode
Parameters.DeviceIoControl.Type3InputBuffer
Parameters.QuerySecurity
Systemdienstparameter für NtQuerySecurityObject.
Parameters.QuerySecurity.SecurityInformation
Parameters.QuerySecurity.Length
Parameters.SetSecurity
Systemdienstparameter für NtSetSecurityObject.
Parameters.SetSecurity.SecurityInformation
Parameters.SetSecurity.SecurityDescriptor
Parameters.MountVolume
Systemdienstparameter für MountVolume.
Parameters.MountVolume.Vpb
Parameters.MountVolume.DeviceObject
Parameters.MountVolume.OutputBufferLength
Parameters.VerifyVolume
Systemdienstparameter für VerifyVolume.
Parameters.VerifyVolume.Vpb
Parameters.VerifyVolume.DeviceObject
Parameters.Scsi
Parameter für Scsi mit interner Gerätesteuerung.
Parameters.Scsi.Srb
Parameters.QueryQuota
Systemdienstparameter für NtQueryQuotaInformationFile.
Parameters.QueryQuota.Length
Parameters.QueryQuota.StartSid
Parameters.QueryQuota.SidList
Parameters.QueryQuota.SidListLength
Parameters.SetQuota
Systemdienstparameter für NtSetQuotaInformationFile.
Parameters.SetQuota.Length
Parameters.QueryDeviceRelations
Parameter für IRP_MN_QUERY_DEVICE_RELATIONS.
Parameters.QueryDeviceRelations.Type
Parameters.QueryInterface
Parameter für IRP_MN_QUERY_INTERFACE.
Parameters.QueryInterface.InterfaceType
Parameters.QueryInterface.Size
Parameters.QueryInterface.Version
Parameters.QueryInterface.Interface
Parameters.QueryInterface.InterfaceSpecificData
Parameters.DeviceCapabilities
Parameter für IRP_MN_QUERY_CAPABILITIES.
Parameters.DeviceCapabilities.Capabilities
Parameters.FilterResourceRequirements
Parameter für IRP_MN_FILTER_RESOURCE_REQUIREMENTS.
Parameters.FilterResourceRequirements.IoResourceRequirementList
Parameters.ReadWriteConfig
Parameter für IRP_MN_READ_CONFIG und IRP_MN_WRITE_CONFIG.
Parameters.ReadWriteConfig.WhichSpace
Parameters.ReadWriteConfig.Buffer
Parameters.ReadWriteConfig.Offset
Parameters.ReadWriteConfig.Length
Parameters.SetLock
Parameter für IRP_MN_SET_LOCK.
Parameters.SetLock.Lock
Parameters.QueryId
Parameter für IRP_MN_QUERY_ID.
Parameters.QueryId.IdType
Parameters.QueryDeviceText
Parameter für IRP_MN_QUERY_DEVICE_TEXT.
Parameters.QueryDeviceText.DeviceTextType
Parameters.QueryDeviceText.LocaleId
Parameters.UsageNotification
Parameter für IRP_MN_DEVICE_USAGE_NOTIFICATION.
Parameters.UsageNotification.InPath
Parameters.UsageNotification.Reserved[3]
Parameters.UsageNotification.Type
Parameters.WaitWake
Parameter für IRP_MN_WAIT_WAKE.
Parameters.WaitWake.PowerState
Parameters.PowerSequence
Parameter für IRP_MN_POWER_SEQUENCE.
Parameters.PowerSequence.PowerSequence
Parameters.Power
Parameter für IRP_MN_SET_POWER und IRP_MN_QUERY_POWER.
Parameters.Power.SystemContext
Parameters.Power.SystemPowerStateContext
Parameters.Power.Type
Parameters.Power.State
Parameters.Power.ShutdownType
Parameters.StartDevice
Parameter für StartDevice.
Parameters.StartDevice.AllocatedResources
Parameters.StartDevice.AllocatedResourcesTranslated
Parameters.WMI
Parameter für WMI-IRPs.
Parameters.WMI.ProviderId
Parameters.WMI.DataPath
Parameters.WMI.BufferSize
Parameters.WMI.Buffer
Parameters.Others
Parameter für andere treiberspezifische Vorgänge.
Parameters.Others.Argument1
Parameters.Others.Argument2
Parameters.Others.Argument3
Parameters.Others.Argument4
DeviceObject
Ein Zeiger auf die vom Treiber erstellte DEVICE_OBJECT Struktur, die das zielbasierte, logische oder virtuelle Gerät darstellt, für das dieser Treiber das IRP verarbeiten soll.
FileObject
Ein Zeiger auf eine FILE_OBJECT Struktur, die ggf. das Dateiobjekt darstellt, das DeviceObject Zeiger zugeordnet ist.
CompletionRoutine
Die Abschlussroutine, die abhängig von den Flags im Control Feld dieser Struktur aufgerufen wird.
Context
Treiberdefinierter Kontext, der zum Speichern der Adresse des Kontextparameters verwendet wird, der an die CompletionRoutine übergeben wird.
Bemerkungen
Für jedes IRP gibt es eine IO_STACK_LOCATION Struktur für jeden Treiber in einem Treiberstapel. Jeder IRP-Satz von I/O-Stapelspeicherorten wird an das IRP angefügt und folgt der IRP--Struktur.
Jeder Treiber auf höherer Ebene ist für die Einrichtung des I/O-Stapelstandorts für den nächsten niedrigeren Treiber in jedem IRP verantwortlich. Ein Treiber muss IoGetCurrentIrpStackLocation- aufrufen, um einen Zeiger auf seine eigene Stapelposition für jedes IRP abzurufen. Treiber auf höherer Ebene können IoGetNextIrpStackLocation- aufrufen, um einen Zeiger auf den Stapelspeicherort des nächsten niedrigeren Treibers zu erhalten.
Der Treiber auf höherer Ebene muss den Stapelspeicherortinhalt einrichten, bevor IoCallDriver- aufgerufen wird, um einen IRP an den Niedrigeren Treiber zu übergeben. Wenn der Treiber die Eingabe-IRP an den nächsten niedrigeren Treiber weitergibt, sollte die Dispatch-Routine IoSkipCurrentIrpStackLocation oder IoCopyCurrentIrpStackLocationToNext aufrufen, um die I/O-Stapelposition des nächsten unteren Treibers einzurichten.
Ein Aufruf des Treibers auf höherer Ebene an IoCallDriver legt das DeviceObject Mitglied auf das Zielgerätobjekt des nächsten niedrigeren Treibers im I/O-Stapel des unteren Treibers fest. Der I/O-Manager übergibt die IoCompletion jedes höheren Treibers routine einen Zeiger auf sein eigenes Geräteobjekt, wenn die IoCompletion- Routine nach Abschluss des IRP aufgerufen wird.
Wenn ein höherer Treiber IRPs zuweist, um Eigene Anforderungen zu stellen, wird seine IoCompletion- Routine an einen NULL-DeviceObject Zeiger übergeben, wenn dieser Treiber weder eine Stapelposition für sich selbst zuweist noch den DeviceObject Zeiger an seiner eigenen Stapelposition des neu zugewiesenen IRP einrichtet.
In einigen Fällen ist ein höherer Treiber, der über einen Massenspeichergerätetreiber angeordnet ist, verantwortlich für das Aufteilen großer Übertragungsanforderungen für den zugrunde liegenden Gerätetreiber. Insbesondere müssen SCSI-Klassentreiber die Parameters.Read.Length und Parameters.Write.Lengthüberprüfen, bestimmen, ob die Größe der angeforderten Übertragung die Übertragungsfunktionen der zugrunde liegenden HBA überschreitet und in diesem Falls dies der Length der ursprünglichen Anforderung in eine Sequenz von teilbasierten Übertragungen zur Erfüllung der ursprünglichen IRP entspricht.
Anforderungen
Anforderung | Wert |
---|---|
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |