Poin yang Perlu Dipertimbangkan untuk Rutinitas StartIo

Ingatlah poin-poin berikut saat menerapkan rutinitas StartIo :

  • Rutinitas StartIo harus menyinkronkan aksesnya ke perangkat fisik dan ke informasi status bersama atau sumber daya apa pun yang dikelola driver dalam ekstensi perangkat dengan rutinitas lain driver yang mengakses perangkat, lokasi memori, atau sumber daya yang sama.

    Jika rutin StartIo berbagi perangkat atau status dengan ISR, startIo harus menggunakan KeSynchronizeExecution untuk memanggil rutinitas SynchCritSection yang disediakan driver untuk memprogram perangkat atau untuk mengakses status bersama. Untuk informasi selengkapnya, lihat Menggunakan Bagian Penting.

    Jika rutin StartIo berbagi status atau sumber daya dengan rutinitas selain ISR, startIo harus melindungi status bersama atau sumber daya dengan kunci spin eksekutif yang diinisialisasi driver yang drivernya menyediakan penyimpanan. Untuk informasi selengkapnya, lihat Kunci Putar.

  • Jika driver perangkat non-WDM monolitik menyiapkan objek pengontrol, rutinitas StartIo-nya dapat menggunakan objek pengontrol untuk menyinkronkan operasi melalui perangkat fisik bersama dengan perangkat yang terpasang (serupa).

    Lihat Objek Pengontrol untuk informasi selengkapnya.

  • Kecuali driver tingkat yang lebih tinggi yang digabungkan erat memisahkan permintaan transfer DMA besar untuk driver perangkat yang mendasarinya, rutinitas StartIo driver perangkat yang mendasarinya harus membagi permintaan transfer besar menjadi rentang transfer parsial dan driver harus melakukan urutan operasi perangkat transfer parsial. Setiap transfer parsial harus berukuran sesuai dengan kemampuan perangkat keras: baik kemampuan perangkat driver atau, untuk perangkat DMA bawahan, kemampuan pengontrol DMA sistem, mana pun yang memiliki batasan yang lebih ketat.

    Lihat Objek Adapter dan DMA untuk informasi selengkapnya tentang menggunakan DMA master sistem atau bus.

  • Rutinitas StartIo driver yang menggunakan DMA harus menyinkronkan transfer menggunakan objek adaptor.

  • Rutinitas StartIo dijalankan di IRQL = DISPATCH_LEVEL, yang membatasi serangkaian rutinitas dukungan yang dapat dipanggilnya.

    Misalnya, rutinitas StartIo tidak dapat mengakses atau mengalokasikan memori yang dapat di-pageable, dan tidak dapat menunggu objek dispatcher diatur ke status yang disinyalir. Di sisi lain, rutinitas StartIo dapat memperoleh dan melepaskan kunci putar eksekutif yang dialokasikan driver dengan KeAcquireSpinLockAtDpcLevel dan KeReleaseSpinLockFromDpcLevel, yang berjalan lebih cepat daripada KeAcquireSpinLock dan KeReleaseSpinLock.

    Lihat Mengelola Prioritas Perangkat Keras dan Kunci Putar untuk informasi selengkapnya.

  • Jika driver memegang IRP dalam keadaan dapat dibatalkan, rutinitas StartIo-nya harus memeriksa apakah IRP input telah dibatalkan sebelum memulai pemrosesan apa pun untuk permintaan tersebut di perangkatnya. Untuk informasi selengkapnya, lihat Membatalkan RUNTIME.