Struktur IRP (wdm.h)
Struktur IRP adalah struktur buram sebagian yang mewakili paket permintaan I/O. Anggota struktur IRP yang tidak terdokumentasi dicadangkan, hanya digunakan oleh manajer I/O atau dalam beberapa kasus, oleh driver sistem file (FSD).
Sintaks
typedef struct _IRP {
CSHORT Type;
USHORT Size;
PMDL MdlAddress;
ULONG Flags;
union {
struct _IRP *MasterIrp;
__volatile LONG IrpCount;
PVOID SystemBuffer;
} AssociatedIrp;
LIST_ENTRY ThreadListEntry;
IO_STATUS_BLOCK IoStatus;
KPROCESSOR_MODE RequestorMode;
BOOLEAN PendingReturned;
CHAR StackCount;
CHAR CurrentLocation;
BOOLEAN Cancel;
KIRQL CancelIrql;
CCHAR ApcEnvironment;
UCHAR AllocationFlags;
union {
PIO_STATUS_BLOCK UserIosb;
PVOID IoRingContext;
};
PKEVENT UserEvent;
union {
struct {
union {
PIO_APC_ROUTINE UserApcRoutine;
PVOID IssuingProcess;
};
union {
PVOID UserApcContext;
#if ...
_IORING_OBJECT *IoRing;
#else
struct _IORING_OBJECT *IoRing;
#endif
};
} AsynchronousParameters;
LARGE_INTEGER AllocationSize;
} Overlay;
__volatile PDRIVER_CANCEL CancelRoutine;
PVOID UserBuffer;
union {
struct {
union {
KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
struct {
PVOID DriverContext[4];
};
};
PETHREAD Thread;
PCHAR AuxiliaryBuffer;
struct {
LIST_ENTRY ListEntry;
union {
struct _IO_STACK_LOCATION *CurrentStackLocation;
ULONG PacketType;
};
};
PFILE_OBJECT OriginalFileObject;
} Overlay;
KAPC Apc;
PVOID CompletionKey;
} Tail;
} IRP;
Anggota
Type
Dicadangkan untuk penggunaan sistem internal.
Size
Dicadangkan untuk penggunaan sistem internal.
MdlAddress
Penunjuk ke MDL yang menjelaskan buffer pengguna, jika driver menggunakan I/O langsung, dan kode fungsi utama IRP adalah salah satu hal berikut:
IRP_MJ_READ
MDL menjelaskan buffer kosong yang diisi perangkat atau driver.
IRP_MJ_WRITE
MDL menjelaskan buffer yang berisi data untuk perangkat atau driver.
IRP_MJ_DEVICE_CONTROL atau IRP_MJ_INTERNAL_DEVICE_CONTROL
Jika kode IOCTL menentukan jenis transfer METHOD_IN_DIRECT, MDL menjelaskan buffer yang berisi data untuk perangkat atau driver.
Jika kode IOCTL menentukan jenis transfer METHOD_OUT_DIRECT, MDL menjelaskan buffer kosong yang diisi perangkat atau driver.
Untuk informasi selengkapnya tentang buffer yang terkait dengan jenis transfer METHOD_IN_DIRECT dan METHOD_OUT_DIRECT dalam kode IOCTL, lihat Deskripsi Buffer untuk Kode Kontrol I/O.
Jika driver tidak menggunakan I/O langsung, pointer ini adalah NULL.
Flags
Driver sistem file menggunakan bidang ini, yang bersifat baca-saja untuk semua driver. Jaringan dan, mungkin, driver perangkat tingkat tertinggi juga dapat membaca bidang ini. Bidang ini diatur ke nol atau ke bitwise-OR dari satu atau beberapa bit bendera yang ditentukan sistem berikut:
- IRP_NOCACHE
- IRP_PAGING_IO
- IRP_MOUNT_COMPLETION
- IRP_SYNCHRONOUS_API
- IRP_ASSOCIATED_IRP
- IRP_BUFFERED_IO
- IRP_DEALLOCATE_BUFFER
- IRP_INPUT_OPERATION
- IRP_SYNCHRONOUS_PAGING_IO
- IRP_CREATE_OPERATION
- IRP_READ_OPERATION
- IRP_WRITE_OPERATION
- IRP_CLOSE_OPERATION
- IRP_DEFER_IO_COMPLETION
- IRP_OB_QUERY_NAME
- IRP_HOLD_DEVICE_QUEUE
- IRP_UM_DRIVER_INITIATED_IO
AssociatedIrp
Dicadangkan untuk penggunaan sistem internal.
AssociatedIrp.MasterIrp
Arahkan ke IRP master dalam IRP yang dibuat oleh panggilan driver tingkat tertinggi ke IoMakeAssociatedIrp.
AssociatedIrp.IrpCount
Dicadangkan untuk penggunaan sistem internal.
AssociatedIrp.SystemBuffer
Penunjuk ke buffer ruang sistem.
Jika driver menggunakan I/O buffer, tujuan buffer ditentukan oleh kode fungsi utama IRP, sebagai berikut:
SystemBuffer.IRP_MJ_READ
Buffer menerima data dari perangkat atau driver. Panjang buffer ditentukan oleh Parameters.Read.Length dalam struktur IO_STACK_LOCATION driver.
SystemBuffer.IRP_MJ_WRITE
Buffer memasok data untuk perangkat atau driver. Panjang buffer ditentukan oleh Parameters.Write.Length dalam struktur IO_STACK_LOCATION driver.
SystemBuffer.IRP_MJ_DEVICE_CONTROL atau IRP_MJ_INTERNAL_DEVICE_CONTROL
Buffer mewakili buffer input dan output yang disediakan ke DeviceIoControl dan IoBuildDeviceIoControlRequest. Data output menimpa data input.
Untuk input, panjang buffer ditentukan oleh Parameters.DeviceIoControl.InputBufferLength dalam struktur IO_STACK_LOCATION driver.
Untuk output, panjang buffer ditentukan oleh Parameters.DeviceIoControl.OutputBufferLength dalam struktur IO_STACK_LOCATION driver.
Untuk informasi selengkapnya, lihat Deskripsi Buffer untuk Kode Kontrol I/O.
Buffer mewakili buffer input yang disediakan untuk DeviceIoControl dan IoBuildDeviceIoControlRequest.
Panjang buffer ditentukan oleh Parameters.DeviceIoControl.InputBufferLength dalam struktur IO_STACK_LOCATION driver.
Untuk informasi selengkapnya, lihat Deskripsi Buffer untuk Kode Kontrol I/O.
Jika driver menggunakan I/O langsung, tujuan buffer ditentukan oleh kode fungsi utama IRP, sebagai berikut:
ThreadListEntry
Dicadangkan untuk penggunaan sistem internal.
IoStatus
Berisi struktur IO_STATUS_BLOCK tempat driver menyimpan status dan informasi sebelum memanggil IoCompleteRequest.
RequestorMode
Menunjukkan mode eksekusi pemohon asli operasi, salah satu UserMode atau KernelMode.
PendingReturned
Jika diatur ke TRUE, driver telah menandai IRP yang tertunda. Setiap rutinitas IoCompletion harus memeriksa nilai bendera ini. Jika bendera TRUE, dan jika rutinitas IoCompletion tidak akan mengembalikan STATUS_MORE_PROCESSING_REQUIRED, rutinitas harus memanggil IoMarkIrpPending untuk menyebarkan status tertunda ke driver di atasnya di tumpukan perangkat.
StackCount
Dicadangkan untuk penggunaan sistem internal.
CurrentLocation
Dicadangkan untuk penggunaan sistem internal.
Cancel
Jika diatur ke TRUE, IRP adalah atau harus dibatalkan.
CancelIrql
Berisi IRQL tempat driver berjalan ketika IoAcquireCancelSpinLock dipanggil.
ApcEnvironment
Dicadangkan untuk penggunaan sistem internal.
AllocationFlags
Dicadangkan untuk penggunaan sistem internal.
UserIosb
Dicadangkan untuk penggunaan sistem internal.
IoRingContext
Dicadangkan untuk penggunaan sistem internal.
UserEvent
Dicadangkan untuk penggunaan sistem internal.
Overlay
Dicadangkan untuk penggunaan sistem internal.
Overlay.AsynchronousParameters
Dicadangkan untuk penggunaan sistem internal.
Overlay.AsynchronousParameters.UserApcRoutine
Dicadangkan untuk penggunaan sistem internal.
Overlay.AsynchronousParameters.IssuingProcess
Dicadangkan untuk penggunaan sistem internal.
Overlay.AsynchronousParameters.UserApcContext
Dicadangkan untuk penggunaan sistem internal.
Overlay.AsynchronousParameters.IoRing
Dicadangkan untuk penggunaan sistem internal.
Overlay.AllocationSize
Dicadangkan untuk penggunaan sistem internal.
CancelRoutine
Berisi titik masuk untuk rutinitas Batal yang disediakan pengemudi untuk dipanggil jika IRP dibatalkan. NULL menunjukkan bahwa IRP saat ini tidak dapat dibatalkan.
UserBuffer
Berisi alamat buffer output jika kedua kondisi berikut berlaku:
Kode fungsi utama di lokasi tumpukan I/O adalah IRP_MJ_DEVICE_CONTROL atau IRP_MJ_INTERNAL_DEVICE_CONTROL.
Kode kontrol I/O didefinisikan dengan METHOD_NEITHER atau METHOD_BUFFERED.
Untuk METHOD_BUFFERED, driver harus menggunakan buffer yang ditujukkan oleh Irp-AssociatedIrp.SystemBuffer> sebagai buffer output. Ketika driver menyelesaikan permintaan, manajer I/O menyalin konten buffer ini ke buffer output yang ditunjukkan oleh Irp-UserBuffer>. Driver tidak boleh menulis langsung ke buffer yang ditujukkan oleh Irp-UserBuffer>. Untuk informasi selengkapnya, lihat Deskripsi Buffer untuk Kode Kontrol I/O.
Tail
Dicadangkan untuk penggunaan sistem internal.
Tail.Overlay
Dicadangkan untuk penggunaan sistem internal.
Tail.Overlay.DeviceQueueEntry
Jika IRP diantrekan dalam antrean perangkat yang terkait dengan objek perangkat driver, bidang ini menautkan RUNP dalam antrean perangkat. Tautan ini hanya dapat digunakan saat driver sedang memproses IRP.
Tail.Overlay.DriverContext[4]
Jika IRP tidak diantrekan dalam antrean perangkat yang terkait dengan objek perangkat driver, bidang ini dapat digunakan oleh driver untuk menyimpan hingga empat pointer. Bidang ini hanya dapat digunakan saat driver memiliki IRP.
Tail.Overlay.Thread
Penunjuk ke blok kontrol utas pemanggil (TCB). Untuk permintaan yang berasal dari mode pengguna, manajer I/O selalu mengatur bidang ini untuk menunjuk ke TCB utas yang mengeluarkan permintaan.
Tail.Overlay.AuxiliaryBuffer
Dicadangkan untuk penggunaan sistem internal.
Tail.Overlay.ListEntry
Jika driver mengelola antrean IRP internalnya sendiri, driver menggunakan bidang ini untuk menautkan satu IRP ke IRP berikutnya. Tautan ini hanya dapat digunakan saat driver memegang IRP dalam antreannya atau sedang memproses IRP.
Tail.Overlay.CurrentStackLocation
Dicadangkan untuk penggunaan sistem internal.
Tail.Overlay.PacketType
Dicadangkan untuk penggunaan sistem internal.
Tail.Overlay.OriginalFileObject
Dicadangkan untuk penggunaan sistem internal.
Tail.Apc
Dicadangkan untuk penggunaan sistem internal.
Tail.CompletionKey
Dicadangkan untuk penggunaan sistem internal.
Keterangan
Anggota struktur IRP yang tidak terdokumentasi dicadangkan, hanya digunakan oleh manajer I/O atau dalam beberapa kasus, oleh driver sistem file (FSD).
IRP adalah struktur manajer I/O dasar yang digunakan untuk berkomunikasi dengan driver dan memungkinkan driver berkomunikasi satu sama lain. Paket terdiri dari dua bagian yang berbeda:
Header, atau bagian paket tetap— Ini digunakan oleh manajer I/O untuk menyimpan informasi tentang permintaan asli, seperti parameter independen perangkat pemanggil, alamat objek perangkat tempat file terbuka, dan sebagainya. Ini juga digunakan oleh driver untuk menyimpan informasi seperti status akhir permintaan.
Lokasi tumpukan I/O — Mengikuti header adalah sekumpulan lokasi tumpukan I/O, satu per driver dalam rantai driver berlapis yang permintaannya terikat. Setiap lokasi tumpukan berisi parameter, kode fungsi, dan konteks yang digunakan oleh driver yang sesuai untuk menentukan apa yang seharusnya dilakukan. Untuk informasi selengkapnya, lihat struktur IO_STACK_LOCATION .
Meskipun driver tingkat yang lebih tinggi mungkin memeriksa nilai Batalkan Boolean dalam IRP, driver tersebut tidak dapat mengasumsikan IRP akan diselesaikan dengan STATUS_CANCELLED oleh driver tingkat bawah meskipun nilainya TRUE.
Persyaratan
Persyaratan | Nilai |
---|---|
Header | wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h) |