Deskripsi Buffer untuk Kode Kontrol I/O

Kode kontrol I/O terkandung dalam permintaan IRP_MJ_DEVICE_CONTROL dan IRP_MJ_INTERNAL_DEVICE_CONTROL . Manajer I/O membuat permintaan ini sebagai akibat dari panggilan ke DeviceIoControl dan IoBuildDeviceIoControlRequest.

Karena DeviceIoControl dan IoBuildDeviceIoControlRequest menerima buffer input dan buffer output sebagai argumen, semua permintaan IRP_MJ_DEVICE_CONTROL dan IRP_MJ_INTERNAL_DEVICE_CONTROL menyediakan buffer input dan buffer output. Cara sistem menjelaskan buffer ini tergantung pada jenis transfer data. Jenis transfer ditentukan oleh nilai TransferType dalam makro CTL_CODE yang membuat nilai kode IOCTL.

Sistem menjelaskan buffer untuk setiap nilai TransferType sebagai berikut.

METHOD_BUFFERED

Untuk jenis transfer ini, RUNTIME menyediakan pointer ke buffer di Irp-AssociatedIrp.SystemBuffer>. Buffer ini mewakili buffer input dan buffer output yang ditentukan dalam panggilan ke DeviceIoControl dan IoBuildDeviceIoControlRequest. Driver mentransfer data dari, dan kemudian ke dalam, buffer ini.

Untuk data input, ukuran buffer ditentukan oleh Parameters.DeviceIoControl.InputBufferLength dalam struktur IO_STACK_LOCATION driver. Untuk data output, ukuran buffer ditentukan oleh Parameters.DeviceIoControl.OutputBufferLength dalam struktur IO_STACK_LOCATION driver.

Ukuran ruang yang dialokasikan sistem untuk buffer input/output tunggal adalah yang lebih besar dari dua nilai panjang.

METHOD_IN_DIRECT atau METHOD_OUT_DIRECT

Untuk jenis transfer ini, RUNTIME menyediakan pointer ke buffer di Irp-AssociatedIrp.SystemBuffer>. Ini mewakili buffer pertama yang ditentukan dalam panggilan ke DeviceIoControl dan IoBuildDeviceIoControlRequest. Ukuran buffer ditentukan oleh Parameters.DeviceIoControl.InputBufferLength dalam struktur IO_STACK_LOCATION driver.

Untuk jenis transfer ini, IRP juga menyediakan pointer ke MDL di Irp-MdlAddress>. Ini mewakili buffer kedua yang ditentukan dalam panggilan ke DeviceIoControl dan IoBuildDeviceIoControlRequest. Buffer ini dapat digunakan sebagai buffer input atau buffer output, sebagai berikut:

  • METHOD_IN_DIRECT ditentukan jika driver yang menangani IRP menerima data dalam buffer saat dipanggil. MDL menjelaskan buffer input, dan menentukan METHOD_IN_DIRECT memastikan bahwa utas yang dieksekusi memiliki akses baca ke buffer.

  • METHOD_OUT_DIRECT ditentukan jika driver yang menangani IRP akan menulis data ke dalam buffer sebelum menyelesaikan IRP. MDL menjelaskan buffer output, dan menentukan METHOD_OUT_DIRECT memastikan bahwa utas yang dieksekusi memiliki akses tulis ke buffer.

Untuk kedua jenis transfer ini, Parameters.DeviceIoControl.OutputBufferLength menentukan ukuran buffer yang dijelaskan oleh MDL.

METHOD_NEITHER

Manajer I/O tidak menyediakan buffer sistem atau MDL apa pun. IRP menyediakan alamat virtual mode pengguna dari buffer input dan output yang ditentukan ke DeviceIoControl atau IoBuildDeviceIoControlRequest, tanpa memvalidasi atau memetakannya.

Alamat buffer input disediakan oleh Parameters.DeviceIoControl.Type3InputBuffer dalam struktur IO_STACK_LOCATION driver, dan alamat buffer output ditentukan oleh Irp-UserBuffer>.

Ukuran buffer disediakan oleh Parameters.DeviceIoControl.InputBufferLength dan Parameters.DeviceIoControl.OutputBufferLength dalam struktur IO_STACK_LOCATION driver.

Untuk informasi selengkapnya tentang makro CTL_CODE dan jenis transfer yang tercantum di atas, lihat Menentukan Kode Kontrol I/O.