다음을 통해 공유


Higher-Level 드라이버의 DispatchReadWrite

파일 시스템 드라이버를 제외하고 상위 수준 드라이버에는 일반적으로 IRP에 대한 내부 드라이버 큐가 없습니다. 이러한 드라이버의 DispatchReadWrite 루틴은 드라이버 스택 아래로 IRP 전달에 설명된 대로 IoCompletion 루틴을 설정한 후 유효한 매개 변수가 있는 IRP를 낮은 드라이버에 전달할 수 있습니다.

그러나 SCSI 클래스 드라이버의 DispatchReadWrite 루틴은 주 함수 코드가 IRP_MJ_READ IRP를 보내거나 IRP_MJ_WRITE SCSI 포트/미니포트 드라이버 쌍으로 보내기 전에 필요한 경우 대용량 전송 요청을 분할하는 작업을 담당합니다. 자세한 내용은 Storage 클래스 드라이버의 SplitTransferRequest 루틴을 참조하세요.

상위 수준 드라이버가 DispatchReadWrite 루틴에서 다음 하위 드라이버에 대해 설정하는 하나 이상의 IRP를 할당하여 일부 부분 전송을 요청하는 경우 DispatchReadWrite 루틴은 드라이버 할당 IRP마다 IoSetCompletionRoutine 을 호출해야 합니다. 드라이버는 IoCompletion 루틴을 등록하여 각 부분 전송 작업에서 전송되는 데이터의 양을 추적하여 IoCompletion 루틴이 드라이버 할당 IRP를 모두 해제하고 결국 원래 요청을 완료할 수 있도록 해야 합니다.

기본 드라이버가 이동식 미디어 디바이스를 제어하는 경우 상위 수준 드라이버에서 할당한 모든 IRP에는 스레드 컨텍스트가 있어야 합니다. 스레드 컨텍스트를 설정하려면 할당 드라이버가 Irp-Tail.Overlay>를 설정해야 합니다. 들어오는 전송 IRP의 동일한 값에서 새로 할당된 각 IRP의 스레드입니다. 자세한 내용은 이동식 미디어 지원을 참조하세요.

기본 디바이스 드라이버가 오류가 있는 부분 전송을 위해 IRP를 반환하는 경우 IoCompletion 루틴은 IRP와 메모리를 해제한 후 반환된 오류로 설정된 I/O 상태 블록으로 부분 전송 요청을 다시 시도하거나 원래 IRP를 완료할 수 있습니다.

상위 수준 드라이버의 DispatchReadWrite 루틴이 부분 전송 작업에 대한 메모리를 할당하고 해당 할당이 드라이버의 IoCompletion 루틴(또는 기본 디바이스 드라이버)에 의해 액세스되는 경우 DispatchReadWrite 루틴은 페이지가 없는 풀에서 해당 메모리를 할당해야 합니다.