루틴 취소 소개

IRP를 무기한 간격으로 보류 중인 상태로 보관할 수 있는 모든 드라이버에는 하나 이상의 취소 루틴이 있어야 합니다. 예를 들어 키보드 드라이버는 사용자가 키를 누를 때까지 무기한 대기할 수 있습니다. 반대로 드라이버가 5분 안에 완료할 수 있는 것보다 더 많은 IRP를 큐에 대기하지 않는 경우 취소 루틴이 필요하지 않을 수 있습니다.

사용자 모드 스레드가 최상위 디바이스 드라이버의 디스패치 루틴에 의해 큐에 대기되고 IRP가 큐에 대기되는 동안 요청 스레드가 종료되는 I/O 요청을 만든다고 가정합니다. 종료된 스레드를 대신하여 대기 중인 IRP는 취소해야 합니다. 따라서 드라이버는 큐에 대기하는 각 IRP에서 드라이버 제공 Cancel 루틴을 설정해야 합니다.

연결된 IRP를 만드는 드라이버는 master IRP가 취소될 때 이를 취소해야 합니다. 연결된 IRP는 요청 스레드와 연결되지 않으므로 master IRP의 취소 루틴은 master IRP가 취소될 때 연결된 모든 IRP를 취소해야 합니다.

드라이버가 가지고 있는 취소 루틴의 수는 드라이버의 디자인에 따라 달라집니다. 일반적으로 드라이버는 IRP가 무기한 동안 보류 중인 상태로 유지될 수 있는 I/O 처리의 각 단계에 대해 취소 루틴이 있어야 합니다. 이러한 보류 중인 IRP는 취소 가능한 상태로 유지되는 것으로 전해집니다.

다음 디자인 지침을 고려합니다.

  • 계층화된 드라이버 체인에서 가장 높은 수준의 드라이버는 IRP를 큐에 대기하거나 취소 가능한 상태로 IRP를 보유하는 경우 하나 이상의 Cancel 루틴이 있어야 합니다. 필요한 경우 취소 루틴이 둘 이상 있을 수 있습니다.

  • IRP가 비교적 긴 간격 동안 취소 가능한 상태로 유지될 수 있는 하위 수준 드라이버에도 하나 이상의 취소 루틴이 있어야 합니다.

  • 드라이버가 자체 IRP의 내부 큐를 관리하는 경우 각 큐에 대해 별도의 취소 루틴이 있어야 합니다.

키보드, 마우스, 소리, 병렬 클래스 및 직렬 드라이버와 같은 대화형 디바이스에 대한 일부 최고 수준의 드라이버에는 취소 루틴이 있어야 합니다. 비교적 긴 간격 동안 일부 상위 수준 클래스 드라이버에 대해 대기 중인 IRP를 보유하는 병렬 포트 드라이버와 같은 일부 하위 수준 드라이버에도 취소 루틴이 있어야 합니다.

대량 스토리지 디바이스 드라이버와 중간 드라이버가 계층화되어 있는 경우 취소 루틴이 있을 가능성이 낮습니다. 파일 I/O 요청의 취소를 처리하는 것은 파일 시스템 드라이버의 책임이며, 하위 수준의 대용량 스토리지 드라이버에 대한 IRP 입력은 일반적으로 취소할 수 없을 정도로 너무 빨리 완료되도록 처리됩니다.