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 |
此旗標是用來判斷是否要繼續讀取作業,即使裝置物件的 Flags 是以 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
聯集,相依於主要和次要 IRP 函式程式代碼值,包含在 MajorFunction 和 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 |
如需詳細資訊,請參閱
Parameters.Create
NtCreateFile的系統服務參數。
Parameters.Create.SecurityContext
Parameters.Create.Options
Parameters.Create.FileAttributes
Parameters.Create.ShareAccess
Parameters.Create.EaLength
Parameters.CreatePipe
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
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 例程時,傳遞每個較高層級驅動程式的 IoCompletion 例程指標。
如果較高層級的驅動程式配置 IRP 來提出自己的要求,
在某些情況下,分層於大量儲存裝置驅動程式的較高層級驅動程序會負責分割基礎設備驅動器的大型傳輸要求。 特別是,SCSI 類別驅動程式必須檢查 Parameters.Read.Length 和 Parameters.Write.Length,判斷要求傳輸的大小是否超過基礎 HBA 的傳輸功能,如果是的話,請將原始要求的 Length 分割成滿足原始 IRP 的序列。
要求
要求 | 價值 |
---|---|
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |