Sürücü Durumunu Denetleme Hatası

Aşağıdaki örnekte, sürücü, bir sürücü görüntüsünün hata ayıklama sürümünde doğru cihaz durumunu denetlemek için ASSERT makrosunu kullanır, ancak aynı sürücü kaynağının perakende derlemesinde cihaz durumunu denetlemez:

   case IOCTL_WAIT_FOR_EVENT:

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

Hata ayıklama sürücüsü görüntüsünde, sürücü IRP'yi zaten bekliyorsa sistem onaylar. Ancak perakende derlemesinde sürücü bu hatayı kontrol etmez. Aynı IOCTL'ye yapılan iki çağrı, sürücünün IRP'yi kaybetmesine neden olur.

Çok işlemcili bir sistemde bu kod parçası ek sorunlara neden olabilir. Rutin çalıştırıldığında, bu yordamın bu IRP'nin sahipliğine (manevra hakkı) sahip olduğu varsayılmaktadır. Yordam, Irp işaretçisini Extension-WaitEventIrp> konumunda genel yapıya kaydettiğinde, başka bir iş parçacığı bu genel yapıdan IRP adresini alabilir ve IRP üzerinde işlemler gerçekleştirebilir. Bu sorunu önlemek için, sürücü IRP'yi kaydetmeden önce IRP'yi beklemekte olarak işaretlemeli ve hem IoMarkIrpPending çağrısını hem de atamayı birbirine bağlı bir sırayla gerçekleştirmelidir. IRP için İptal yordamı da gerekebilir.