struktur IO_STACK_LOCATION (wdm.h)
Struktur IO_STACK_LOCATION mendefinisikan lokasi tumpukan I/O , yang merupakan entri dalam tumpukan I/O yang terkait dengan setiap IRP. Setiap lokasi tumpukan I/O dalam IRP memiliki beberapa anggota umum dan beberapa anggota khusus jenis permintaan.
Sintaksis
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;
Anggota
MajorFunction
Kode fungsi utama IRP menunjukkan jenis operasi I/O yang akan dilakukan.
MinorFunction
Kode subfungsi untuk MajorFunction. Manajer PnP, manajer daya, driver sistem file, dan driver kelas SCSI mengatur anggota ini untuk beberapa permintaan.
Flags
Nilai khusus jenis permintaan yang digunakan hampir secara eksklusif oleh driver sistem file. Driver perangkat media yang dapat dilepas memeriksa apakah anggota ini diatur dengan SL_OVERRIDE_VERIFY_VOLUME untuk permintaan baca guna menentukan apakah akan melanjutkan operasi baca meskipun
Untuk dokumentasi bendera SL_*
lain untuk IRP_MJ_CREATE, lihat IRP_MJ_CREATE (IFS).
Kemungkinan nilai bendera meliputi:
Bendera | Nilai | Deskripsi |
---|---|---|
SL_KEY_SPECIFIED | 0x01 |
Menunjukkan bahwa IO_STACK_LOCATION.Parameters.Read(OrWrite).Key berisi salinan sektor tertentu yang harus dibaca ketika redundansi diaktifkan. Hari ini bendera ini hanya digunakan dengan operasi IRP_MJ_READ. |
SL_OVERRIDE_VERIFY_VOLUME | 0x02 |
Bendera ini digunakan untuk menentukan apakah akan melanjutkan operasi baca meskipun Bendera |
SL_WRITE_THROUGH | 0x04 |
Bendera ini menginformasikan driver penyimpanan untuk mengatur bendera yang sesuai sehingga disk melewati cache tulis untuk memaksa disk menulis ke media penyimpanan persistennya. Bendera ini khusus untuk perangkat; tidak semua disk drive mendukung melewati disk-cache. |
SL_FT_SEQUENTIAL_WRITE | 0x08 |
Dicadangkan untuk penggunaan sistem. |
SL_FORCE_DIRECT_WRITE | 0x10 |
Bendera ini memungkinkan driver mode kernel menulis ke area volume yang biasanya tidak dapat mereka tulis karena memblokir penulisan langsung dalam sistem file dan tumpukan driver penyimpanan. Pemblokiran tulis langsung membantu meningkatkan keamanan. Bendera ini diperiksa baik di lapisan sistem file maupun lapisan tumpukan penyimpanan. Untuk informasi selengkapnya tentang pemblokiran tulis langsung, lihat Memblokir Operasi Tulis Langsung ke Volume dan Disk. |
SL_REALTIME_STREAM | 0x20 |
Bendera ini mengisyaratkan bahwa IO adalah untuk permintaan streaming real time ke driver kelas CD-ROM. Ini mengisyaratkan driver untuk melakukan operasi BACA/TULIS pada kecepatan yang dijamin untuk streaming real time. Bendera ini hanya valid dengan media optik. |
SL_PERSISTENT_MEMORY_FIXED_MAPPING | 0x20 |
Pemetaan memori persisten byte dalam permintaan tulis tidak dapat berubah saat menangani permintaan tulis ini. Bendera ini hanya valid dengan perangkat memori persisten dan IRP_MJ_WRITE. |
Untuk perangkat memori persisten, salah satu alasan untuk memulihkan (memodifikasi alamat fisik LBA tertentu) pada perangkat memori persisten adalah untuk memberikan atomitas tingkat sektor yang efisien. Jika bendera tidak diatur, pemetaan ulang diperbolehkan terutama jika mengakibatkan driver memberikan atomitas sektor. Sistem file (atau pemohon) lebih memilih bahwa driver perangkat memori persisten memberikan atomitas sektor. Jika bendera diatur, driver memori persisten tidak akan memetakan ulang alamat fisik yang sesuai dengan LBA. Jika itu berarti atomitas sektor tidak dapat disediakan, jadi baik itu. Namun, pendorong lebih dari dipersilakan untuk memberikan atomitas sektor selama tidak ada remapping.
Control
Driver dapat memeriksa anggota ini untuk menentukan apakah diatur dengan SL_PENDING_RETURNED dan dalam kondisi apa CompletionRoutine
Parameters
Serikat yang bergantung pada nilai kode fungsi IRP utama dan minor yang terkandung dalam MajorFunction dan MinorFunction . Tabel berikut menunjukkan IRP mana yang menggunakan masing-masing anggota parameter union.
Nama anggota | IRP yang menggunakan anggota ini |
---|---|
Buat | IRP_MJ_CREATE |
Baca |
IRP_MJ_READ |
Tulis |
IRP_MJ_WRITE |
QueryFile | IRP_MJ_QUERY_INFORMATION |
SetFile |
IRP_MJ_SET_INFORMATION |
queryVolume |
IRP_MJ_QUERY_VOLUME_INFORMATION |
DeviceIoControl |
IRP_MJ_DEVICE_CONTROL dan 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 dan IRP_MN_WRITE_CONFIG |
SetLock |
IRP_MN_SET_LOCK |
|
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 dan IRP_MN_QUERY_POWER |
StartDevice | IRP_MN_START_DEVICE |
WMI | IRP kecil WMI |
Lainnya | IRP khusus driver |
Untuk informasi selengkapnya, lihat Kode Fungsi Utama IRP.
Parameters.Create
Parameter layanan sistem untuk
Parameters.Create.SecurityContext
Parameters.Create.Options
Parameters.Create.FileAttributes
Parameters.Create.ShareAccess
Parameters.Create.EaLength
Parameters.CreatePipe
Parameter layanan sistem untuk NtCreateNamedPipeFile.
Parameters.CreatePipe.SecurityContext
Parameters.CreatePipe.Options
Parameters.CreatePipe.Reserved
Parameters.CreatePipe.ShareAccess
Parameters.CreatePipe.Parameters
Parameters.CreateMailslot
Parameter layanan sistem untuk
Parameters.CreateMailslot.SecurityContext
Parameters.CreateMailslot.Options
Parameters.CreateMailslot.Reserved
Parameters.CreateMailslot.ShareAccess
Parameters.CreateMailslot.Parameters
Parameters.Read
Parameter layanan sistem untuk
Parameters.Read.Length
Parameters.Read.Key
Parameters.Read.Flags
Parameters.Read.ByteOffset
Parameters.Write
Parameter layanan sistem untuk NtWriteFile.
Parameters.Write.Length
Parameters.Write.Key
Parameters.Write.Flags
Parameters.Write.ByteOffset
Parameters.QueryDirectory
Parameter layanan sistem untuk NtQueryDirectoryFile.
Parameters.QueryDirectory.Length
Parameters.QueryDirectory.FileName
Parameters.QueryDirectory.FileInformationClass
Parameters.QueryDirectory.FileIndex
Parameters.NotifyDirectory
Parameter layanan sistem untuk NtNotifyChangeDirectoryFile.
Parameters.NotifyDirectory.Length
Parameters.NotifyDirectory.CompletionFilter
Parameters.NotifyDirectoryEx
Parameter layanan sistem untuk NtNotifyChangeDirectoryFileEx.
Parameters.NotifyDirectoryEx.Length
Parameters.NotifyDirectoryEx.CompletionFilter
Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass
Parameters.QueryFile
Parameter layanan sistem untuk
Parameters.QueryFile.Length
Parameters.QueryFile.FileInformationClass
Parameters.SetFile
Parameter layanan sistem untuk
Parameters.SetFile.Length
Parameters.SetFile.FileInformationClass
Parameters.SetFile.FileObject
Parameters.SetFile.ReplaceIfExists
Parameters.SetFile.AdvanceOnly
Parameters.SetFile.ClusterCount
Parameters.SetFile.DeleteHandle
Parameters.QueryEa
Parameter layanan sistem untuk NtQueryEaFile.
Parameters.QueryEa.Length
Parameters.QueryEa.EaList
Parameters.QueryEa.EaListLength
Parameters.QueryEa.EaIndex
Parameters.SetEa
Parameter layanan sistem untuk NtSetEaFile.
Parameters.SetEa.Length
Parameters.QueryVolume
Parameter layanan sistem untuk NtQueryVolumeInformationFile.
Parameters.QueryVolume.Length
Parameters.QueryVolume.FsInformationClass
Parameters.SetVolume
Parameter layanan sistem untuk NtSetVolumeInformationFile.
Parameters.SetVolume.Length
Parameters.SetVolume.FsInformationClass
Parameters.FileSystemControl
Parameter layanan sistem untuk NtFsControlFile.
Parameters.FileSystemControl.OutputBufferLength
Parameters.FileSystemControl.InputBufferLength
Parameters.FileSystemControl.FsControlCode
Parameters.FileSystemControl.Type3InputBuffer
Parameters.LockControl
Parameter layanan sistem untuk
Parameters.LockControl.Length
Parameters.LockControl.Key
Parameters.LockControl.ByteOffset
Parameters.DeviceIoControl
Parameter layanan sistem untuk NtDeviceIoControlFile.
Parameters.DeviceIoControl.OutputBufferLength
Parameters.DeviceIoControl.InputBufferLength
Parameters.DeviceIoControl.IoControlCode
Parameters.DeviceIoControl.Type3InputBuffer
Parameters.QuerySecurity
Parameter layanan sistem untuk NtQuerySecurityObject.
Parameters.QuerySecurity.SecurityInformation
Parameters.QuerySecurity.Length
Parameters.SetSecurity
Parameter layanan sistem untuk NtSetSecurityObject.
Parameters.SetSecurity.SecurityInformation
Parameters.SetSecurity.SecurityDescriptor
Parameters.MountVolume
Parameter layanan sistem untuk MountVolume.
Parameters.MountVolume.Vpb
Parameters.MountVolume.DeviceObject
Parameters.MountVolume.OutputBufferLength
Parameters.VerifyVolume
Parameter layanan sistem untuk VerifyVolume.
Parameters.VerifyVolume.Vpb
Parameters.VerifyVolume.DeviceObject
Parameters.Scsi
Parameter untuk Scsi dengan kontrol perangkat internal.
Parameters.Scsi.Srb
Parameters.QueryQuota
Parameter layanan sistem untuk NtQueryQuotaInformationFile.
Parameters.QueryQuota.Length
Parameters.QueryQuota.StartSid
Parameters.QueryQuota.SidList
Parameters.QueryQuota.SidListLength
Parameters.SetQuota
Parameter layanan sistem untuk NtSetQuotaInformationFile.
Parameters.SetQuota.Length
Parameters.QueryDeviceRelations
Parameter untuk IRP_MN_QUERY_DEVICE_RELATIONS.
Parameters.QueryDeviceRelations.Type
Parameters.QueryInterface
Parameter untuk IRP_MN_QUERY_INTERFACE.
Parameters.QueryInterface.InterfaceType
Parameters.QueryInterface.Size
Parameters.QueryInterface.Version
Parameters.QueryInterface.Interface
Parameters.QueryInterface.InterfaceSpecificData
Parameters.DeviceCapabilities
Parameter untuk IRP_MN_QUERY_CAPABILITIES.
Parameters.DeviceCapabilities.Capabilities
Parameters.FilterResourceRequirements
Parameter untuk IRP_MN_FILTER_RESOURCE_REQUIREMENTS.
Parameters.FilterResourceRequirements.IoResourceRequirementList
Parameters.ReadWriteConfig
Parameter untuk IRP_MN_READ_CONFIG dan IRP_MN_WRITE_CONFIG.
Parameters.ReadWriteConfig.WhichSpace
Parameters.ReadWriteConfig.Buffer
Parameters.ReadWriteConfig.Offset
Parameters.ReadWriteConfig.Length
Parameters.SetLock
Parameter untuk IRP_MN_SET_LOCK.
Parameters.SetLock.Lock
Parameters.QueryId
Parameter untuk IRP_MN_QUERY_ID.
Parameters.QueryId.IdType
Parameters.QueryDeviceText
Parameter untuk IRP_MN_QUERY_DEVICE_TEXT.
Parameters.QueryDeviceText.DeviceTextType
Parameters.QueryDeviceText.LocaleId
Parameters.UsageNotification
Parameter untuk IRP_MN_DEVICE_USAGE_NOTIFICATION.
Parameters.UsageNotification.InPath
Parameters.UsageNotification.Reserved[3]
Parameters.UsageNotification.Type
Parameters.WaitWake
Parameter untuk IRP_MN_WAIT_WAKE.
Parameters.WaitWake.PowerState
Parameters.PowerSequence
Parameter untuk IRP_MN_POWER_SEQUENCE.
Parameters.PowerSequence.PowerSequence
Parameters.Power
Parameter untuk IRP_MN_SET_POWER dan IRP_MN_QUERY_POWER.
Parameters.Power.SystemContext
Parameters.Power.SystemPowerStateContext
Parameters.Power.Type
Parameters.Power.State
Parameters.Power.ShutdownType
Parameters.StartDevice
Parameter untuk StartDevice.
Parameters.StartDevice.AllocatedResources
Parameters.StartDevice.AllocatedResourcesTranslated
Parameters.WMI
Parameter untuk IRP WMI.
Parameters.WMI.ProviderId
Parameters.WMI.DataPath
Parameters.WMI.BufferSize
Parameters.WMI.Buffer
Parameters.Others
Parameter untuk operasi khusus driver lainnya.
Parameters.Others.Argument1
Parameters.Others.Argument2
Parameters.Others.Argument3
Parameters.Others.Argument4
DeviceObject
Penunjuk ke struktur DEVICE_OBJECT yang dibuat driver yang mewakili perangkat fisik, logis, atau virtual target tempat driver ini menangani IRP.
FileObject
Penunjuk ke struktur FILE_OBJECT yang mewakili objek file, jika ada, yang terkait dengan DeviceObject pointer.
CompletionRoutine
Rutinitas penyelesaian yang dipanggil tergantung pada bendera di bidang Kontrol
Context
Konteks yang ditentukan driver yang digunakan untuk menyimpan alamat parameter konteks yang diteruskan ke CompletionRoutine.
Komentar
Untuk setiap IRP, ada satu struktur IO_STACK_LOCATION untuk setiap driver dalam tumpukan driver . Setiap set lokasi tumpukan I/O IRP ditambahkan ke IRP, mengikuti struktur IRP
Setiap driver tingkat yang lebih tinggi bertanggung jawab untuk menyiapkan lokasi tumpukan I/O untuk driver berikutnya yang lebih rendah di setiap IRP. Driver harus memanggil IoGetCurrentIrpStackLocation untuk mendapatkan pointer ke lokasi tumpukannya sendiri untuk setiap IRP. Driver tingkat yang lebih tinggi dapat memanggil IoGetNextIrpStackLocation untuk mendapatkan penunjuk ke lokasi tumpukan driver yang lebih rendah berikutnya.
Driver tingkat yang lebih tinggi harus menyiapkan konten lokasi tumpukan sebelum memanggil IoCallDriver untuk meneruskan IRP ke driver tingkat bawah. Jika driver akan meneruskan IRP input ke driver tingkat bawah berikutnya, rutinitas pengiriman harus memanggil IoSkipCurrentIrpStackLocation atau IoCopyCurrentIrpStackLocationToNext untuk mengatur lokasi tumpukan I/O driver berikutnya yang lebih rendah.
Panggilan driver tingkat yang lebih tinggi ke
Jika driver tingkat yang lebih tinggi mengalokasikan RUN untuk membuat permintaan sendiri, rutinitas IoCompletion
Dalam beberapa kasus, driver tingkat lebih tinggi yang berlapis di atas driver perangkat penyimpanan massal bertanggung jawab untuk memisahkan permintaan transfer besar untuk driver perangkat yang mendasar. Secara khusus, driver kelas SCSI harus memeriksa parameter
Persyaratan
Syarat | Nilai |
---|---|
Header |
wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h) |
Lihat juga
IRP