IO_STACK_LOCATION结构(wdm.h)
IO_STACK_LOCATION 结构定义 I/O 堆栈位置,它是与每个 IRP 关联的 I/O 堆栈中的条目。 IRP 中的每个 I/O 堆栈位置都有一些常见成员和一些特定于请求类型的成员。
语法
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;
成员
MajorFunction
IRP 主要函数代码 指示要执行的 I/O 操作的类型。
MinorFunction
MajorFunction的子函数代码。 PnP 管理器、电源管理器、文件系统驱动程序和 SCSI 类驱动程序为某些请求设置此成员。
Flags
特定于请求类型的值几乎完全由文件系统驱动程序使用。 可移动媒体设备驱动程序检查此成员是否设置为SL_OVERRIDE_VERIFY_VOLUME进行读取请求,以确定是否继续读取操作,即使设备对象的 标志 设置为DO_VERIFY_VOLUME也是如此。 分层在可移动媒体设备驱动程序上的中间驱动程序必须在所有传入 IRP_MJ_READ 请求中将此成员复制到下一个较低驱动程序的 I/O 堆栈位置。
有关IRP_MJ_CREATE的其他 SL_*
标志的文档,请参阅 IRP_MJ_CREATE(IFS)。
可能的标志值包括:
旗 | 价值 | 描述 |
---|---|---|
SL_KEY_SPECIFIED | 0x01 |
指示 IO_STACK_LOCATION.Parameters.Read(OrWrite).Key 包含启用冗余时应读取给定扇区的副本。 今天,此标志仅用于IRP_MJ_READ操作。 |
SL_OVERRIDE_VERIFY_VOLUME | 0x02 |
此标志用于确定是否继续读取操作,即使设备对象的 标志 设置为DO_VERIFY_VOLUME也是如此。 |
SL_WRITE_THROUGH | 0x04 |
此标志通知存储驱动程序设置适当的标志,以便磁盘绕过写入缓存,以强制磁盘写入其永久性存储介质。 此标志特定于设备;并非所有磁盘驱动器都支持绕过磁盘缓存。 |
SL_FT_SEQUENTIAL_WRITE | 0x08 |
保留供系统使用。 |
SL_FORCE_DIRECT_WRITE | 0x10 |
此标志允许内核模式驱动程序写入到通常无法写入的卷区域,因为阻止文件系统和存储驱动程序堆栈中的直接写入。 直接写入阻止有助于提高安全性。 在文件系统层和存储堆栈层检查此标志。 有关直接写入阻止的详细信息,请参阅 阻止对卷和磁盘的直接写入操作。 |
SL_REALTIME_STREAM | 0x20 |
此标志提示 IO 用于对 CD-ROM 类驱动程序的实时流式处理请求。 这提示驱动程序以有保证的速度执行读取/写入操作,以便进行实时流式处理。 此标志仅对光学介质有效。 |
SL_PERSISTENT_MEMORY_FIXED_MAPPING | 0x20 |
写入请求中字节的持久内存映射在处理此写入请求时无法更改。 此标志仅对永久性内存设备和IRP_MJ_WRITE有效。 |
对于永久性内存设备,重新映射(修改给定 LBA 的物理地址)在持久性内存设备上的原因之一是提供高效的扇区级原子性。 如果未设置标志,则允许重新映射,尤其是在导致驱动程序提供扇区原子性时。 文件系统(或请求者)更喜欢持久性内存设备驱动程序提供扇区原子性。 如果设置了标志,持久性内存驱动程序不应重新映射对应于 LBA 的物理地址。 如果这意味着无法提供扇区原子性,那么它也是如此。 但是,只要没有重新映射,驱动程序就更欢迎提供扇区原子性。
Control
驱动程序可以检查此成员,以确定它是否使用SL_PENDING_RETURNED设置,并在调用 CompletionRoutine 的情况下进行设置。 驱动程序对此成员具有只读访问权限。 驱动程序调用 IoSetCompletionRoutine 或 IoSetCompletionRoutineEx 来指定这些条件。
Parameters
一个联合,取决于 MajorFunction 中包含的主要和次要 IRP 函数代码值和 MinorFunction。 下表显示了哪些 IRP 使用 参数 联合的各个成员。
成员名称 | 使用此成员的 IRP |
---|---|
创建 | IRP_MJ_CREATE |
读取 | IRP_MJ_READ |
写入 | IRP_MJ_WRITE |
QueryFile | IRP_MJ_QUERY_INFORMATION |
SetFile | IRP_MJ_SET_INFORMATION |
QueryVolume | IRP_MJ_QUERY_VOLUME_INFORMATION |
DeviceIoControl | IRP_MJ_DEVICE_CONTROL 和 IRP_MJ_INTERNAL_DEVICE_CONTROL |
MountVolume | IRP_MN_MOUNT_VOLUME |
VerifyVolume | IRP_MN_VERIFY_VOLUME |
Scsi | IRP_MJ_INTERNAL_DEVICE_CONTROL (SCSI) |
QueryDeviceRelations | IRP_MN_QUERY_DEVICE_RELATIONS |
QueryInterface | IRP_MN_QUERY_INTERFACE |
DeviceCapabilities | IRP_MN_QUERY_CAPABILITIES |
FilterResourceRequirements | IRP_MN_FILTER_RESOURCE_REQUIREMENTS |
ReadWriteConfig | IRP_MN_READ_CONFIG 和 IRP_MN_WRITE_CONFIG |
SetLock | IRP_MN_SET_LOCK |
QueryId | IRP_MN_QUERY_ID |
QueryDeviceText | IRP_MN_QUERY_DEVICE_TEXT |
UsageNotification | IRP_MN_DEVICE_USAGE_NOTIFICATION |
WaitWake | IRP_MN_WAIT_WAKE |
PowerSequence | IRP_MN_POWER_SEQUENCE |
Power | IRP_MN_SET_POWER 和 IRP_MN_QUERY_POWER |
StartDevice | IRP_MN_START_DEVICE |
WMI | WMI 次要 IRP |
其他 | 特定于驱动程序的 IRP |
有关详细信息,请参阅 IRP 主要函数代码。
Parameters.Create
NtCreateFile的系统服务参数。
Parameters.Create.SecurityContext
Parameters.Create.Options
Parameters.Create.FileAttributes
Parameters.Create.ShareAccess
Parameters.Create.EaLength
Parameters.CreatePipe
系统服务参数 fo NtCreateNamedPipeFile。
Parameters.CreatePipe.SecurityContext
Parameters.CreatePipe.Options
Parameters.CreatePipe.Reserved
Parameters.CreatePipe.ShareAccess
Parameters.CreatePipe.Parameters
Parameters.CreateMailslot
NtCreateMailslotFile的系统服务参数。
Parameters.CreateMailslot.SecurityContext
Parameters.CreateMailslot.Options
Parameters.CreateMailslot.Reserved
Parameters.CreateMailslot.ShareAccess
Parameters.CreateMailslot.Parameters
Parameters.Read
NtReadFile的系统服务参数。
Parameters.Read.Length
Parameters.Read.Key
Parameters.Read.Flags
Parameters.Read.ByteOffset
Parameters.Write
NtWriteFile的系统服务参数。
Parameters.Write.Length
Parameters.Write.Key
Parameters.Write.Flags
Parameters.Write.ByteOffset
Parameters.QueryDirectory
NtQueryDirectoryFile的系统服务参数。
Parameters.QueryDirectory.Length
Parameters.QueryDirectory.FileName
Parameters.QueryDirectory.FileInformationClass
Parameters.QueryDirectory.FileIndex
Parameters.NotifyDirectory
NtNotifyChangeDirectoryFile的系统服务参数。
Parameters.NotifyDirectory.Length
Parameters.NotifyDirectory.CompletionFilter
Parameters.NotifyDirectoryEx
NtNotifyChangeDirectoryFileEx的系统服务参数。
Parameters.NotifyDirectoryEx.Length
Parameters.NotifyDirectoryEx.CompletionFilter
Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass
Parameters.QueryFile
NtQueryInformationFile的系统服务参数。
Parameters.QueryFile.Length
Parameters.QueryFile.FileInformationClass
Parameters.SetFile
NtSetInformationFile的系统服务参数。
Parameters.SetFile.Length
Parameters.SetFile.FileInformationClass
Parameters.SetFile.FileObject
Parameters.SetFile.ReplaceIfExists
Parameters.SetFile.AdvanceOnly
Parameters.SetFile.ClusterCount
Parameters.SetFile.DeleteHandle
Parameters.QueryEa
NtQueryEaFile的系统服务参数。
Parameters.QueryEa.Length
Parameters.QueryEa.EaList
Parameters.QueryEa.EaListLength
Parameters.QueryEa.EaIndex
Parameters.SetEa
NtSetEaFile的系统服务参数。
Parameters.SetEa.Length
Parameters.QueryVolume
NtQueryVolumeInformationFile的系统服务参数。
Parameters.QueryVolume.Length
Parameters.QueryVolume.FsInformationClass
Parameters.SetVolume
NtSetVolumeInformationFile的系统服务参数。
Parameters.SetVolume.Length
Parameters.SetVolume.FsInformationClass
Parameters.FileSystemControl
NtFsControlFile的系统服务参数。
Parameters.FileSystemControl.OutputBufferLength
Parameters.FileSystemControl.InputBufferLength
Parameters.FileSystemControl.FsControlCode
Parameters.FileSystemControl.Type3InputBuffer
Parameters.LockControl
LockFile/NtUnlockFile的系统服务参数。
Parameters.LockControl.Length
Parameters.LockControl.Key
Parameters.LockControl.ByteOffset
Parameters.DeviceIoControl
NtDeviceIoControlFile的系统服务参数。
Parameters.DeviceIoControl.OutputBufferLength
Parameters.DeviceIoControl.InputBufferLength
Parameters.DeviceIoControl.IoControlCode
Parameters.DeviceIoControl.Type3InputBuffer
Parameters.QuerySecurity
NtQuerySecurityObject的系统服务参数。
Parameters.QuerySecurity.SecurityInformation
Parameters.QuerySecurity.Length
Parameters.SetSecurity
NtSetSecurityObject的系统服务参数。
Parameters.SetSecurity.SecurityInformation
Parameters.SetSecurity.SecurityDescriptor
Parameters.MountVolume
MountVolume的系统服务参数。
Parameters.MountVolume.Vpb
Parameters.MountVolume.DeviceObject
Parameters.MountVolume.OutputBufferLength
Parameters.VerifyVolume
VerifyVolume的系统服务参数。
Parameters.VerifyVolume.Vpb
Parameters.VerifyVolume.DeviceObject
Parameters.Scsi
具有内部设备控制的 Scsi 的参数。
Parameters.Scsi.Srb
Parameters.QueryQuota
NtQueryQuotaInformationFile的系统服务参数。
Parameters.QueryQuota.Length
Parameters.QueryQuota.StartSid
Parameters.QueryQuota.SidList
Parameters.QueryQuota.SidListLength
Parameters.SetQuota
NtSetQuotaInformationFile的系统服务参数。
Parameters.SetQuota.Length
Parameters.QueryDeviceRelations
IRP_MN_QUERY_DEVICE_RELATIONS的参数。
Parameters.QueryDeviceRelations.Type
Parameters.QueryInterface
IRP_MN_QUERY_INTERFACE的参数。
Parameters.QueryInterface.InterfaceType
Parameters.QueryInterface.Size
Parameters.QueryInterface.Version
Parameters.QueryInterface.Interface
Parameters.QueryInterface.InterfaceSpecificData
Parameters.DeviceCapabilities
IRP_MN_QUERY_CAPABILITIES的参数。
Parameters.DeviceCapabilities.Capabilities
Parameters.FilterResourceRequirements
IRP_MN_FILTER_RESOURCE_REQUIREMENTS的参数。
Parameters.FilterResourceRequirements.IoResourceRequirementList
Parameters.ReadWriteConfig
IRP_MN_READ_CONFIG和IRP_MN_WRITE_CONFIG的参数。
Parameters.ReadWriteConfig.WhichSpace
Parameters.ReadWriteConfig.Buffer
Parameters.ReadWriteConfig.Offset
Parameters.ReadWriteConfig.Length
Parameters.SetLock
IRP_MN_SET_LOCK的参数。
Parameters.SetLock.Lock
Parameters.QueryId
IRP_MN_QUERY_ID的参数。
Parameters.QueryId.IdType
Parameters.QueryDeviceText
IRP_MN_QUERY_DEVICE_TEXT的参数。
Parameters.QueryDeviceText.DeviceTextType
Parameters.QueryDeviceText.LocaleId
Parameters.UsageNotification
IRP_MN_DEVICE_USAGE_NOTIFICATION的参数。
Parameters.UsageNotification.InPath
Parameters.UsageNotification.Reserved[3]
Parameters.UsageNotification.Type
Parameters.WaitWake
IRP_MN_WAIT_WAKE的参数。
Parameters.WaitWake.PowerState
Parameters.PowerSequence
IRP_MN_POWER_SEQUENCE的参数。
Parameters.PowerSequence.PowerSequence
Parameters.Power
IRP_MN_SET_POWER和IRP_MN_QUERY_POWER的参数。
Parameters.Power.SystemContext
Parameters.Power.SystemPowerStateContext
Parameters.Power.Type
Parameters.Power.State
Parameters.Power.ShutdownType
Parameters.StartDevice
StartDevice 的参数。
Parameters.StartDevice.AllocatedResources
Parameters.StartDevice.AllocatedResourcesTranslated
Parameters.WMI
WMI IRP 的参数。
Parameters.WMI.ProviderId
Parameters.WMI.DataPath
Parameters.WMI.BufferSize
Parameters.WMI.Buffer
Parameters.Others
其他特定于驱动程序的操作的参数。
Parameters.Others.Argument1
Parameters.Others.Argument2
Parameters.Others.Argument3
Parameters.Others.Argument4
DeviceObject
指向驱动程序创建的 DEVICE_OBJECT 结构的指针,该结构表示此驱动程序处理 IRP 的目标物理、逻辑或虚拟设备。
FileObject
指向 FILE_OBJECT 结构的指针,该结构表示与 DeviceObject 指针关联的文件对象(如果有)。
CompletionRoutine
根据此结构的 Control 字段中的标志调用的完成例程。
Context
用于存储传递给 CompletionRoutine 的上下文参数的地址的驱动程序定义上下文。
言论
对于每个 IRP,驱动程序堆栈中的每个驱动程序都有一个 IO_STACK_LOCATION 结构。 每个 IRP 的 I/O 堆栈位置集都追加到 IRP 中,遵循 IRP 结构。
每个较高级别的驱动程序都负责为每个 IRP 中的下一个较低驱动程序设置 I/O 堆栈位置。 驱动程序必须调用 IoGetCurrentIrpStackLocation 以获取指向每个 IRP 自己的堆栈位置的指针。 高级驱动程序可以调用 IoGetNextIrpStackLocation 以获取指向下一个较低驱动程序堆栈位置的指针。
在调用 IoCallDriver 以将 IRP 传递到较低级别的驱动程序之前,高级驱动程序必须设置堆栈位置内容。 如果驱动程序将输入 IRP 传递到下一个较低级别的驱动程序,调度例程应调用 IoSkipCurrentIrpStackLocation 或 IoCopyCurrentIrpStackLocationToNext 来设置下一个较低驱动程序的 I/O 堆栈位置。
更高级别的驱动程序调用 IoCallDriver 将下级驱动程序的目标设备对象的 DeviceObject 成员设置为下级驱动程序的目标设备对象(位于较低驱动程序的 I/O 堆栈位置)。 当 I/O 管理器在 IRP 完成时调用 IoCompletion 例程时,将每个更高级别的驱动程序的 IoCompletion 例程传递给自己的设备对象。
如果较高级别的驱动程序分配 IRP 以发出自己的请求,则如果该驱动程序既不为其分配堆栈位置,也没有在新分配的 IRP 的堆栈位置中设置
在某些情况下,分层于大容量存储设备驱动程序的更高级别的驱动程序负责拆分基础设备驱动程序的大型传输请求。 具体而言,SCSI 类驱动程序必须检查 Parameters.Read.Length 和 Parameters.Write.Length,确定请求传输的大小是否超过基础 HBA 的传输功能,如果是,请将原始请求的 Length 拆分为满足原始 IRP 的序列。
要求
要求 | 价值 |
---|---|
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |