Share via


드라이버 상태를 확인하지 못했습니다.

다음 예제에서 드라이버는 ASSERT 매크로를 사용하여 드라이버 이미지의 디버그 버전에서 올바른 디바이스 상태를 검사 동일한 드라이버 원본의 소매 빌드에서 디바이스 상태를 검사 않습니다.

   case IOCTL_WAIT_FOR_EVENT:

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

디버그 드라이버 이미지에서 드라이버가 이미 보류 중인 IRP를 보유하는 경우 시스템이 어설션됩니다. 그러나 소매 빌드에서는 드라이버가 이 오류에 대해 검사 않습니다. 동일한 IOCTL에 대한 두 번의 호출로 인해 드라이버가 IRP를 추적하지 않습니다.

다중 프로세서 시스템에서 이 코드 조각은 추가 문제를 일으킬 수 있습니다. 항목에서 이 루틴에 이 IRP의 소유권(조작 권한)이 있다고 가정합니다. 루틴이 Extension-WaitEventIrp>의 전역 구조에 Irp 포인터를 저장하면 다른 스레드가 해당 전역 구조에서 IRP 주소를 가져와 IRP에 대한 작업을 수행할 수 있습니다. 이 문제를 방지하려면 드라이버가 IRP를 저장하기 전에 보류 중인 IRP를 표시해야 하며 IoMarkIrpPending 에 대한 호출과 할당을 상호 잠긴 시퀀스에 모두 포함해야 합니다. IRP에 대한 취소 루틴도 필요할 수 있습니다.