Menangani Pengecualian
Sistem operasi menggunakan penanganan pengecualian terstruktur untuk menandakan jenis kesalahan tertentu. Rutinitas yang dipanggil oleh pengemudi dapat menimbulkan pengecualian yang harus ditangani driver.
Sistem menjebak jenis pengecualian umum berikut:
Kesalahan atau perangkap yang ditentukan perangkat keras, seperti,
- Pelanggaran akses (lihat di bawah)
- Ketidakselarasan jenis data (seperti entitas 16-bit yang diratakan pada batas byte ganjil)
- Instruksi ilegal dan istimewa
- Urutan kunci tidak valid (mencoba menjalankan urutan instruksi yang tidak valid dalam bagian kode yang saling dikunci)
- Bilangan bulat dibagi dengan nol dan luapan
- Floating-point dibagi dengan nol, luapan, underflow, dan operand yang dipesan
- Titik henti dan eksekusi langkah tunggal (untuk mendukung debugger)
Pengecualian yang ditentukan perangkat lunak sistem, seperti,
- Pelanggaran halaman penjaga (mencoba memuat atau menyimpan data dari atau ke lokasi dalam halaman penjaga)
- Kesalahan baca halaman (mencoba membaca halaman ke dalam memori dan mengalami kesalahan I/O bersamaan)
Pelanggaran akses adalah upaya untuk melakukan operasi pada halaman yang tidak diizinkan di bawah pengaturan perlindungan halaman saat ini. Pelanggaran akses terjadi dalam situasi berikut:
Operasi baca atau tulis tidak valid, seperti menulis ke halaman baca-saja.
Untuk mengakses memori di luar batas ruang alamat program saat ini (dikenal sebagai pelanggaran panjang).
Untuk mengakses halaman yang saat ini bersifat residen tetapi didedikasikan untuk penggunaan komponen sistem. Misalnya, kode mode pengguna tidak diizinkan mengakses halaman yang digunakan kernel.
Jika operasi dapat menyebabkan pengecualian, driver harus mengapit operasi dalam blok coba/kecuali . Akses lokasi dalam mode pengguna adalah penyebab umum pengecualian. Misalnya, ProbeForWrite memeriksa rutinitas bahwa driver benar-benar dapat menulis ke buffer mode pengguna. Jika tidak bisa, rutinitas akan menimbulkan pengecualian STATUS_ACCESS_VIOLATION. Dalam contoh kode berikut, driver memanggil ProbeForWrite dalam percobaan/kecuali sehingga dapat menangani pengecualian yang dihasilkan, jika harus terjadi.
try {
...
ProbeForWrite(Buffer, BufferSize, BufferAlignment);
/* Note that any access (not just the probe, which must come first,
* by the way) to Buffer must also be within a try-except.
*/
...
} except (EXCEPTION_EXECUTE_HANDLER) {
/* Error handling code */
...
}
Driver harus menangani pengecualian yang dinaikkan. Pengecualian yang tidak ditangani menyebabkan sistem memeriksa bug. Driver yang menyebabkan pengecualian dinaikkan harus menanganinya: driver tingkat bawah tidak dapat mengandalkan driver tingkat yang lebih tinggi untuk menangani pengecualian.
Driver dapat langsung meningkatkan pengecualian, dengan menggunakan rutinitas ExRaiseAccessViolation, ExRaiseDatatypeMisalignment, atau ExRaiseStatus . Driver harus menangani pengecualian apa pun yang dinaikkan rutinitas ini.
Berikut ini adalah daftar sebagian rutinitas yang, setidaknya dalam situasi tertentu, dapat menimbulkan pengecualian:
Akses memori ke buffer mode pengguna juga dapat menyebabkan pelanggaran akses. Untuk informasi selengkapnya, lihat Kesalahan dalam Mereferensikan Alamat User-Space.
Perhatikan bahwa penanganan pengecualian terstruktur berbeda dari pengecualian C++. Kernel tidak mendukung pengecualian C++.
Untuk informasi selengkapnya tentang penanganan pengecualian terstruktur, lihat Microsoft Windows SDK, dan dokumentasi Visual Studio.