Persyaratan Rutin ControllerControl
Seperti namanya, rutinitas ControllerControl dikaitkan dengan objek pengontrol. Ketika rutinitas ControllerControl dijalankan, perangkat keras yang diwakili oleh objek pengontrol bebas dan ekstensi pengontrol umumnya tidak diakses oleh rutinitas driver lain kecuali ekstensi pengontrol berisi konteks yang dibagikan dengan ISR driver.
Biasanya, rutinitas ControllerControl melakukan setidaknya hal berikut:
Updates atau menginisialisasi konteks apa pun yang dipertahankan driver dalam ekstensi perangkat objek perangkat target dan di ekstensi pengontrol
Jika driver menggunakan DMA, rutinitas ControllerControl-nya biasanya bertanggung jawab untuk menentukan apakah permintaan transfer tertentu harus dibagi menjadi transfer parsial karena keterbatasan yang diberlakukan sistem atau perangkat pada ukuran setiap transfer DMA. Dalam keadaan ini, rutinitas ControllerControl juga bertanggung jawab untuk memanggil AllocateAdapterChannel jika driver memiliki rutinitas AdapterControl .
Jika driver menggunakan PIO, rutinitas ControllerControl-nya juga bertanggung jawab untuk memisahkan permintaan transfer, jika perangkat kerasnya memerlukannya, ke dalam rentang transfer parsial dan untuk memanggil MmGetSystemAddressForMdlSafe dengan MDL di Irp-MdlAddress>.
Program perangkat kerasnya untuk operasi I/O yang diminta
Jika ekstensi perangkat atau pengontrol dapat diakses dari ISR, rutinitas ControllerControl harus menggunakan rutinitas SynchCritSection yang dipanggil dengan memanggil KeSynchronizeExecution. Untuk informasi selengkapnya, lihat Menggunakan Bagian Penting.
Jika driver memiliki rutinitas Batal, rutinitas ControllerControl-nya juga harus memeriksa bidang Irp-Cancel> untuk menentukan apakah IRP saat ini harus dibatalkan, dan melakukan salah satu hal berikut:
Jika Irp-Cancel> diatur ke TRUE, rutinitas ControllerControl harus melakukan hal berikut:
Atur STATUS_CANCELLED untuk Status dan nol untuk Informasi di blok status I/O IRP.
Panggil IoFreeController untuk merilis objek pengontrol sehingga operasi perangkat berikutnya dapat segera dimulai.
Panggil IoStartNextPacket atau hapus antrean IRP berikutnya jika driver mengelola antreannya sendiri.
Selesaikan IRP yang dibatalkan dengan IoCompleteRequest dan kontrol pengembalian.
Jika Irp-Cancel> tidak diatur ke TRUE, rutinitas ControllerControl harus melakukan hal berikut:
Panggil IoSetCancelRoutine untuk mengatur ulang titik masuk rutin Batal untuk IRP ke NULL. Dapatkan kunci putar batal untuk panggilan ini jika driver menggunakan antrean perangkat yang disediakan manajer I/O di objek perangkat.
Program perangkat keras untuk operasi I/O yang diminta, menggunakan rutinitas SynchCritSection yang dipanggil dengan memanggil KeSynchronizeExecution. Untuk informasi selengkapnya, lihat Menggunakan Bagian Penting
Untuk informasi selengkapnya tentang menangani RUNP yang dapat dibatalkan, lihat Membatalkan RUNP.
Untuk sebagian besar operasi I/O berbasis interupsi kecuali operasi yang tumpang tindih pada perangkat yang berbeda yang melekat pada pengontrol/adaptor fisik, rutinitas ControllerControl harus mengembalikan KeepObject karena rutinitas DpcForIsr atau CustomDpc menyelesaikan operasi dan IRP.
Segera setelah operasi I/O untuk memenuhi permintaan saat ini dilakukan, rutinitas yang akan menyelesaikan IRP harus memanggil IoFreeController dan IoStartNextPacket sehingga permintaan berikutnya dapat diproses secepat mungkin.
Jika rutinitas ControllerControl itu sendiri menyelesaikan IRP atau jika dapat mengatur operasi, seperti pencarian disk, untuk satu objek perangkat target (disk) yang dapat tumpang tindih dengan operasi untuk objek perangkat lain, rutinitas ControllerControl harus mengembalikan DeallocateObject.