共用方式為


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 的條件。 驅動程式具有此成員的唯讀存取權。 驅動程式會呼叫 IoSetCompletionRoutineIoSetCompletionRoutineEx 來指定這些條件。

Parameters

聯集,相依於主要和次要 IRP 函式程式代碼值,包含在 MajorFunctionMinorFunction中。 下表顯示哪些 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_CONTROLIRP_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_CONFIGIRP_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_POWERIRP_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

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 傳遞給下一個較低層級的驅動程式,分派例程應該呼叫 IoSkipCurrentIrpStackLocationIoCopyCurrentIrpStackLocationToNext,以設定下一個較低驅動程式的 I/O 堆棧位置。

較高層級驅動程式 IoCallDriver 的呼叫 會將 DeviceObject 成員設定為下一個較低層級驅動程式的目標裝置對象,位於較低驅動程式的 I/O 堆棧位置。 I/O 管理員會在 IRP 完成時呼叫 ioCompletion IoCompletion 例程時,傳遞每個較高層級驅動程式的 IoCompletion 例程指標。

如果較高層級的驅動程式配置 IRP 來提出自己的要求, 則如果該驅動程式本身未配置堆棧位置,也不會在新配置的 IRP 的堆疊位置中設定 DeviceObject 指標,則會傳遞 NULLDeviceObject 指標。

在某些情況下,分層於大量儲存裝置驅動程式的較高層級驅動程序會負責分割基礎設備驅動器的大型傳輸要求。 特別是,SCSI 類別驅動程式必須檢查 Parameters.Read.LengthParameters.Write.Length,判斷要求傳輸的大小是否超過基礎 HBA 的傳輸功能,如果是的話,請將原始要求的 Length 分割成滿足原始 IRP 的序列。

要求

要求 價值
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)

另請參閱

IO_STATUS_BLOCK

IRP

IoCallDriver

IoCopyCurrentIrpStackLocationToNext

IoGetCurrentIrpStackLocation

IoGetNextIrpStackLocation

IoSetCompletionRoutine

IoSetNextIrpStackLocation

IoSkipCurrentIrpStackLocation