Pengantar kode kontrol I/O

Kode kontrol I/O (IOCTL) digunakan untuk komunikasi antara aplikasi dalam mode pengguna dan driver, atau untuk komunikasi secara internal di antara driver-driver dalam stack. Kode kontrol I/O dikirim menggunakan IRP.

Aplikasi mode pengguna mengirim IOCTL ke driver dengan memanggil DeviceIoControl, yang dijelaskan dalam dokumentasi Microsoft Windows SDK. Panggilan ke DeviceIoControl menyebabkan manajer I/O membuat permintaan IRP_MJ_DEVICE_CONTROL dan mengirimkannya ke driver paling atas.

Selain itu, driver tingkat atas dapat mengirim IOCTL ke driver tingkat bawah dengan membuat dan mengirim permintaan IRP_MJ_DEVICE_CONTROL atau IRP_MJ_INTERNAL_DEVICE_CONTROL . Driver memproses permintaan ini dalam rutinitas DispatchDeviceControl dan DispatchInternalDeviceControl . (Aplikasi mode pengguna tidak dapat mengirim permintaan IRP_MJ_INTERNAL_DEVICE_CONTROL.)

Beberapa IOCTL bersifat publik dan beberapa bersifat pribadi. IOCTL publik biasanya ditentukan sistem dan didokumenkan oleh Microsoft, baik di Windows Driver Kit (WDK) atau Windows SDK. Mereka mungkin dikirim dengan panggilan dari komponen mode pengguna ke DeviceIoControl, atau mereka mungkin dikirim dari satu driver mode kernel ke yang lain, menggunakan permintaan IRP_MJ_DEVICE_CONTROL atau IRP_MJ_INTERNAL_DEVICE_CONTROL.

IOCTL pribadi, di lain pihak, dimaksudkan untuk digunakan secara eksklusif oleh komponen perangkat lunak vendor untuk berkomunikasi satu dengan yang lain. IOCTL privat biasanya didefinisikan dalam file header yang disediakan vendor dan tidak didokumenkan secara publik. Seperti IOCTL publik, mereka dapat dikirim melalui panggilan komponen user-mode ke dalam fungsi DeviceIoControl, atau dapat dikirim dari satu driver kernel-mode ke driver kernel-mode lainnya, dengan permintaan IRP_MJ_DEVICE_CONTROL atau IRP_MJ_INTERNAL_DEVICE_CONTROL.

Tidak ada perbedaan antara pengodean IOCTL publik dan privat. Namun, ada perbedaan dalam kode internal yang dapat digunakan dalam IOCTL yang ditentukan vendor, dibandingkan dengan yang digunakan untuk IOCTL yang ditentukan sistem. Jika IOCTL publik yang tersedia tidak sesuai dengan kebutuhan Anda, Anda dapat menentukan IOCTL privat baru yang dapat digunakan komponen perangkat lunak Anda untuk berkomunikasi satu sama lain. Untuk informasi selengkapnya, lihat Menentukan Kode Kontrol I/O.