IO_STACK_LOCATION構造体 (wdm.h)
IO_STACK_LOCATION 構造体は、各 IRP に関連付けられている I/O スタック内のエントリである、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
要求の種類固有の値は、ファイル システム ドライバーによってほぼ排他的に使用されます。 リムーバブル メディア デバイス ドライバーは、デバイス オブジェクトの Flags が DO_VERIFY_VOLUME で設定されている場合でも、読み取り要求のSL_OVERRIDE_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 の物理アドレスを変更) する理由の 1 つは、効率的なセクター レベルのアトミック性を提供することです。 フラグが設定されていない場合、特にドライバーがセクターのアトミック性を提供する場合は、再マップが許可されます。 ファイル システム (またはリクエスター) は、永続メモリ デバイス ドライバーがセクターのアトミック性を提供することを好みます。 フラグが設定されている場合、永続メモリ ドライバーは、LBA に対応する物理アドレスを再マップしないでください。 それがセクターの原子性を提供できないことを意味する場合は、そのようにしてください。 ただし、再マッピングがない限り、ドライバーはセクターの原子性を提供することを歓迎するだけではありません。
Control
ドライバーは、このメンバーを調べて、SL_PENDING_RETURNEDで設定されているかどうかを確認し、CompletionRoutine が呼び出される条件を判断できます。 ドライバーには、このメンバーへの読み取り専用アクセス権があります。 ドライバーは、IoSetCompletionRoutine
Parameters
MajorFunction および
メンバー名 | このメンバーを使用する 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 |
電源 の |
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
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
このドライバーが IRP を処理する対象の物理、論理、または仮想デバイスを表す、ドライバーによって作成された DEVICE_OBJECT 構造体へのポインター。
FileObject
DeviceObject ポインターに関連付けられているファイル オブジェクト (存在する場合) を表す
CompletionRoutine
この構造体の Control フィールドのフラグに応じて呼び出される完了ルーチン。
Context
CompletionRoutine に渡されるコンテキスト パラメーターのアドレスを格納するために使用されるドライバー定義コンテキスト。
備考
IRP ごとに、ドライバー スタック内のドライバーごとに 1 つの IO_STACK_LOCATION 構造があります。 各 IRP の I/O スタックの場所のセットは、IRP 構造体に続いて、IRP に追加されます。
上位レベルのドライバーはすべて、各 IRP の次の下位ドライバーの I/O スタックの場所を設定する役割を担います。 ドライバーは、各 IRP 独自のスタック位置へのポインターを取得する IoGetCurrentIrpStackLocation を呼び出す必要があります。 上位レベルのドライバー IoGetNextIrpStackLocation を呼び出して、次の下位のドライバーのスタック位置へのポインターを取得できます。
上位レベルのドライバーは、下位レベルのドライバーに IRP を渡 IoCallDriver を呼び出す前に、スタックの場所の内容を設定する必要があります。 ドライバーが次の下位レベルのドライバーに入力 IRP を渡す場合、ディスパッチ ルーチンは IoSkipCurrentIrpStackLocation
IoCallDriver に対する上位レベルのドライバーの呼び出しにより、DeviceObject メンバーが、下位ドライバーの I/O スタック位置にある次の下位レベルのドライバーのターゲット デバイス オブジェクトに設定されます。 I/O マネージャーは、IoCompletion ルーチンが IRP の完了時に呼び出されたときに、各上位レベルのドライバーの IoCompletion ルーチンに独自のデバイス オブジェクトへのポインターを渡します。
上位レベルのドライバーが独自の要求を行うために IRP を割り当てる場合、そのドライバーがそれ自体のスタックの場所を割り当てず、新しく割り当てられた IRP の独自のスタック位置に DeviceObject ポインターを設定しない場合、その IoCompletion ルーチンには、NULLDeviceObject ポインターが渡されます。
場合によっては、大容量記憶装置デバイス ドライバーに階層化された上位レベルのドライバーが、基になるデバイス ドライバーの大きな転送要求を分割する役割を担います。 特に、SCSI クラス ドライバーは、Parameters.Read.Length と Parameters.Write.Lengthを確認し、要求された転送のサイズが基になる HBA の転送機能を超えているかどうかを判断し、その場合は、元の IRP を満たすために、元の要求の 長 を部分的な転送のシーケンスに分割する必要があります。
必要条件
要件 | 価値 |
---|---|
ヘッダー | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
関連項目
IoCallDriver の
IoCopyCurrentIrpStackLocationToNext
IoGetNextIrpStackLocation の
IoSetNextIrpStackLocation の