Bagikan melalui


Kegagalan Memeriksa Status Driver

Dalam contoh berikut, driver menggunakan makro ASSERT untuk memeriksa status perangkat yang benar dalam versi debug gambar driver, tetapi tidak memeriksa status perangkat di build ritel sumber driver yang sama:

   case IOCTL_WAIT_FOR_EVENT:

      ASSERT((!Extension->WaitEventIrp));
      Extension->WaitEventIrp = Irp;
      IoMarkIrpPending(Irp);
      status = STATUS_PENDING;

Dalam gambar driver debug, jika driver sudah menahan IRP tertunda, sistem akan menegaskan. Namun, dalam build ritel, driver tidak memeriksa kesalahan ini. Dua panggilan ke IOCTL yang sama menyebabkan driver kehilangan jejak IRP.

Pada sistem multiprosektor, fragmen kode ini dapat menyebabkan masalah tambahan. Asumsikan bahwa pada entri rutinitas ini memiliki kepemilikan (hak untuk memanipulasi) IRP ini. Ketika rutin menyimpan pointer Irp dalam struktur global di Extension-WaitEventIrp>, utas lain bisa mendapatkan alamat IRP dari struktur global tersebut dan melakukan operasi pada IRP. Untuk mencegah masalah ini, driver harus menandai IRP yang tertunda sebelum menyimpan IRP dan harus menyertakan panggilan ke IoMarkIrpPending dan penugasan dalam urutan yang saling bertautan. Rutinitas Batal untuk IRP mungkin juga diperlukan.