Pengantar Kode Kontrol I/O

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

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 "publik" dan beberapa bersifat "privat". IOCTL publik biasanya ditentukan sistem dan didokumenkan oleh Microsoft, baik di Windows Driver Kit (WDK) atau Windows SDK. Mereka mungkin dikirim melalui panggilan komponen mode pengguna ke DeviceIoControl, atau mungkin dikirim dari satu driver mode kernel ke driver lain, menggunakan permintaan IRP_MJ_DEVICE_CONTROL atau IRP_MJ_INTERNAL_DEVICE_CONTROL . Contoh IOCTL publik termasuk Kode Kontrol I/O Port SCSI dan Permintaan Kontrol Perangkat Internal Tetikus I8042prt.

IOCTL privat, di sisi lain, dimaksudkan untuk digunakan secara eksklusif oleh komponen perangkat lunak vendor untuk berkomunikasi satu sama lain. IOCTL privat biasanya didefinisikan dalam file header yang disediakan vendor dan tidak didokumenkan secara publik. Seperti IOCTL publik, mereka mungkin dikirim melalui panggilan komponen mode pengguna ke DeviceIoControl, atau mungkin dikirim dari satu driver mode kernel ke driver lain, menggunakan 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.