다음을 통해 공유


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

다음 예제에서 드라이버는 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에 대한 취소 루틴도 필요할 수 있습니다.