Membuat Driver Kernel-Mode yang Andal
Driver membentuk persentase signifikan dari total kode yang dijalankan dalam mode kernel. Driver mode kernel, berlaku, komponen sistem operasi. Oleh karena itu, pendorong yang andal dan aman berkontribusi secara signifikan terhadap kepercayaan keseluruhan sistem operasi. Untuk membuat driver mode kernel yang andal, ikuti panduan berikut:
Mengamankan objek perangkat dengan benar.
Akses pengguna ke driver dan perangkat sistem dikendalikan oleh deskriptor keamanan yang ditetapkan sistem ke objek perangkat. Paling sering, sistem mengatur parameter keamanan perangkat saat perangkat diinstal. Untuk informasi selengkapnya, lihat Membuat Penginstalan Perangkat Aman. Kadang-kadang tepat bagi driver untuk memainkan peran dalam mengontrol akses ke perangkatnya. Untuk informasi selengkapnya, lihat Mengamankan Objek Perangkat.
Validasi objek perangkat dengan benar.
Jika driver membuat beberapa jenis objek perangkat, driver harus memeriksa jenis mana yang diterimanya di setiap IRP. Untuk informasi selengkapnya, lihat Kegagalan memvalidasi Objek Perangkat.
Gunakan fungsi "string aman".
Saat memanipulasi string, driver harus menggunakan fungsi string aman alih-alih fungsi string yang disediakan dengan pustaka runtime bahasa C/C++. Untuk informasi selengkapnya, lihat Menggunakan Fungsi String Aman.
Memvalidasi handel objek.
Driver yang menerima handel objek sebagai input harus memverifikasi bahwa handel valid, dapat diakses, dan merupakan jenis yang diharapkan. Untuk informasi selengkapnya tentang menggunakan handel objek, lihat topik berikut ini:
Dukung multiproscessor dengan benar.
Jangan pernah berasumsi bahwa driver Anda hanya akan berjalan pada sistem prosesor tunggal. Untuk informasi tentang teknik pemrograman yang dapat Anda gunakan untuk memastikan bahwa driver Anda akan berfungsi dengan baik pada sistem multiprosesor, lihat topik berikut:
Tangani status driver dengan benar.
Penting untuk selalu memverifikasi bahwa driver Anda dalam keadaan Anda menganggapnya berada di. Misalnya, jika driver menerima IRP, apakah sudah melayani IRP dengan jenis yang sama? Jika driver tidak memeriksa situasi ini, IRP pertama dapat hilang. Untuk informasi selengkapnya, lihat Kegagalan untuk Memeriksa Status Driver.
Memvalidasi nilai input IRP.
Sangat penting, dari perspektif keandalan dan keamanan, untuk memvalidasi semua nilai yang terkait dengan IRP, seperti alamat dan panjang buffer. Topik berikut memberikan informasi tentang memvalidasi nilai input IRP:
DispatchReadWrite Menggunakan I/O Buffered
DispatchReadWrite Menggunakan I/O Langsung
Tangani tumpukan I/O dengan benar.
Saat melewati IRP ke tumpukan driver, penting bagi driver untuk memanggil IoSkipCurrentIrpStackLocation atau IoCopyCurrentIrpStackLocationToNext untuk mengatur lokasi tumpukan I/O driver berikutnya. Jangan menulis kode yang langsung menyalin satu lokasi tumpukan I/O ke lokasi berikutnya.
Menangani operasi penyelesaian IRP dengan benar.
Driver tidak boleh menyelesaikan IRP dengan nilai status STATUS_SUCCESS kecuali benar-benar mendukung dan memproses IRP. Untuk informasi tentang cara yang benar untuk menangani operasi penyelesaian IRP, lihat Menyelesaikan RUNPS.
Tangani operasi pembatalan IRP dengan benar.
Operasi pembatalan mungkin sulit dikodekan dengan benar karena biasanya dijalankan secara asinkron. Masalah dalam kode yang menangani operasi pembatalan dapat lumpuh untuk waktu yang lama, karena kode ini biasanya tidak sering dijalankan dalam sistem yang sedang berjalan.
Pastikan untuk membaca dan memahami semua informasi yang diberikan di bawah IRP Pembatalan. Beri perhatian khusus pada Sinkronisasi Pembatalan IRP dan Poin yang Perlu Dipertimbangkan Saat Membatalkan RUNPS.
Salah satu cara untuk menghindari masalah sinkronisasi yang terkait dengan operasi pembatalan adalah dengan menerapkan antrean IRP yang batal aman. Antrean IRP yang batal aman adalah antrean yang dikelola driver yang diperkenalkan untuk Windows XP dan versi sistem operasi yang lebih baru, tetapi juga kompatibel dengan versi sebelumnya.
Tangani pembersihan IRP dan tutup operasi dengan benar.
Pastikan Anda memahami perbedaan antara permintaan IRP_MJ_CLEANUP dan IRP_MJ_CLOSE . Permintaan pembersihan tiba setelah aplikasi menutup semua handel pada objek file, tetapi terkadang sebelum semua permintaan I/O selesai. Permintaan penutupan tiba setelah semua permintaan I/O untuk objek file telah selesai atau dibatalkan. Untuk informasi selengkapnya, lihat topik berikut:
DispatchCreate, DispatchClose, dan DispatchCreateClose Routines
Untuk informasi selengkapnya tentang menangani RUNP dengan benar, lihat Kesalahan Tambahan dalam Menangani RUNPS.
Menggunakan Pemverifikasi Driver
Driver Verifier adalah alat terpenting yang dapat Anda gunakan untuk memastikan keandalan driver Anda. Driver Verifier dapat memeriksa berbagai masalah umum driver, termasuk beberapa dari yang dibahas di bagian ini. Namun, penggunaan Driver Verifier tidak menggantikan desain perangkat lunak yang cermat dan bijaksana.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk