Bagikan melalui


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 Bendera objek perangkat diatur dengan DO_VERIFY_VOLUME. Driver perantara yang berlapis melalui driver perangkat media yang dapat dilepas harus menyalin anggota ini ke lokasi tumpukan I/O driver berikutnya yang lebih rendah di semua permintaan IRP_MJ_READ yang masuk.

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 objek perangkat diatur dengan DO_VERIFY_VOLUME.
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 dipanggil. Driver memiliki akses baca-saja ke anggota ini. Driver memanggil IoSetCompletionRoutine atau IoSetCompletionRoutineEx untuk menentukan kondisi ini.

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
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 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 untukNtCreateFile .

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 untukNtCreateMailslotFile .

Parameters.CreateMailslot.SecurityContext

Parameters.CreateMailslot.Options

Parameters.CreateMailslot.Reserved

Parameters.CreateMailslot.ShareAccess

Parameters.CreateMailslot.Parameters

Parameters.Read

Parameter layanan sistem untukNtReadFile .

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 untukNtQueryInformationFile .

Parameters.QueryFile.Length

Parameters.QueryFile.FileInformationClass

Parameters.SetFile

Parameter layanan sistem untukNtSetInformationFile .

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 untukLockFile/NtUnlockFile .

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 struktur ini.

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 IoCallDriver mengatur anggota DeviceObject ke objek perangkat target driver tingkat bawah berikutnya, di lokasi tumpukan I/O driver yang lebih rendah. Manajer I/O meneruskan setiap IoCompletion driver tingkat lebih tinggi rutin penunjuk ke objek perangkatnya sendiri ketika IoCompletion rutin dipanggil pada penyelesaian IRP.

Jika driver tingkat yang lebih tinggi mengalokasikan RUN untuk membuat permintaan sendiri, rutinitas IoCompletion diteruskan NULLDeviceObject pointer jika driver tersebut tidak mengalokasikan lokasi tumpukan untuk dirinya sendiri atau mengatur DeviceObject pointer di lokasi tumpukan sendiri dari IRP yang baru dialokasikan.

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 .Read.Length dan Parameters.Write.Length, menentukan apakah ukuran transfer yang diminta melebihi kemampuan transfer HBA yang mendasar, dan, jika demikian, bagi Panjang dari permintaan asli menjadi urutan transfer parsial untuk memenuhi IRP asli.

Persyaratan

Syarat Nilai
Header wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h)

Lihat juga

IO_STATUS_BLOCK

IRP

IoCallDriver

IoCopyCurrentIrpStackLocationToNext

IoGetCurrentIrpStackLocation

IoGetNextIrpStackLocation

IoSetCompletionRoutine

IoSetNextIrpStackLocation

IoSkipCurrentIrpStackLocation