IRP 취소 동기화

드라이버의 관점에서 IRP는 언제든지 취소할 수 있습니다. IRP 취소는 비동기적으로 발생합니다. 따라서 드라이버는 IRP가 다음 지점 중 하나라도 취소될 경우 생성되는 여러 가지 잠재적인 경합 조건을 처리할 수 있어야 합니다.

  • 드라이버 루틴이 호출된 후 IRP를 큐에 넣기 전에.

  • 드라이버 루틴이 호출된 후 IRP를 처리하려고 시도하기 전입니다. 예를 들어 드라이버의 StartIo 루틴이 호출된 후 StartIo 루틴이 디바이스 큐에서 IRP를 제거하기 전에 IRP가 취소될 수 있습니다.

  • 드라이버 루틴이 IRP를 큐에서 제거한 후 요청된 I/O를 시작하기 전에 제거합니다.

드라이버가 IRP를 큐에 대기하고 큐를 보호하는 스핀 잠금을 해제하면 다른 스레드가 IRP에 액세스하고 변경할 수 있습니다. 다음 코드 줄이라도 원래 스레드가 다시 시작되면 IRP가 이미 취소되었거나 변경되었을 수 있습니다.

드라이버는 취소 안전 IRP 큐 프레임워크를 사용하여 IRP 큐를 구현할 수 있습니다. 그런 다음 시스템은 IAP를 안전하게 취소 하기 위해 동기화를 자동으로 처리하는 드라이버에 대한 Cancel 루틴을 등록합니다. 자세한 내용은 Cancel-Safe IRP 큐 를 참조하세요. 그렇지 않으면 드라이버가 자체 동기화를 구현해야 합니다.

IRP의 다음 멤버에는 취소에 대한 정보가 포함되어 있습니다.

  • Irp-> 취소 는 IRP가 취소되고 있는지 또는 취소해야 하는지를 나타냅니다.

  • Irp-> CancelRoutine 은 IRP를 취소할 수 있는지 여부를 나타냅니다. 이 멤버에 취소 루틴에 대한 포인터가 포함되어 있으면 IRP를 취소할 수 있습니다. 이 멤버가 NULL이면 IRP를 취소할 수 없습니다. 이 멤버가 NULL이지만 Irp-Cancel>이 설정된 경우 취소 루틴이 실행 중이고 IRP가 취소되는 중임을 나타냅니다.

드라이버가 취소 가능한 IRP를 처리하는 경우 취소 가능한 상태로 유지되는 각 IRP에서 적절한 취소 루틴을 설정해야 합니다.

이 섹션에는 IRP 취소 동기화에 대한 다음 topics 포함되어 있습니다.

시스템의 스핀 잠금 취소 사용

IRP를 처리하는 드라이버 루틴에서 취소 동기화

취소 루틴 없이 Higher-Level 드라이버에서 취소 동기화

Driver-Supplied 스핀 잠금 사용