드라이버 상태를 확인하지 못했습니다.
다음 예제에서 드라이버는 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에 대한 취소 루틴도 필요할 수 있습니다.