스토리지 클래스 드라이버의 IoCompletion 루틴
스토리지 클래스 드라이버에는 드라이버가 포트 드라이버에 보내는 모든 IRP가 완료될 때까지 동기적으로 대기하고 필요에 따라 요청을 다시 시도한 다음 디스패치 또는 BuildRequest 루틴 내에서 SRB에 대한 메모리를 해제하지 않는 한 하나 이상의 IoCompletion 루틴이 있어야 합니다. 모든 IRP를 동기적으로 처리하면 클래스 드라이버의 성능이 저하됩니다. 또한 시스템 페이지 파일을 보유할 수 있는 디바이스의 스토리지 클래스 드라이버는 모든 전송 요청을 비동기적으로 처리해야 하므로 읽기/쓰기 요청에 대한 IoCompletion 루틴이 있어야 합니다.
스토리지 클래스 드라이버의 BuildRequest 루틴에 설명된 대로 스토리지 클래스 드라이버는 lookaside 목록 또는 비페이지 풀로 돌아가든 SRB에 할당하는 메모리를 해제해야 합니다. 다른 상위 수준의 커널 모드 드라이버와 마찬가지로 스토리지 클래스 드라이버의 SplitTransferRequest 루틴에 설명된 대로 전송 요청을 분할하는 IRP와 같이 할당하는 모든 IRP를 해제할 책임이 있습니다.
클래스 드라이버의 IoCompletion 루틴은 궁극적으로 I/O 상태 블록이 설정되어 있는지 확인하고 원래 IRP를 완료해야 합니다. IRP를 완료하려면 디스패치 루틴에서 IRP 완료에 설명된 대로 SRB의 ScsiStatus 멤버 또는 SenseInfoBuffer 멤버에서 반환된 오류를 NTSTATUS 형식 값으로 변환하거나 오류를 로깅하는 것이 포함될 수 있습니다.
요청을 처리할 때 특정 종류의 오류가 발생하면 스토리지 포트 드라이버는 LU(대상 논리 단위)에 대한 내부 큐를 중지하고 요청 완료 시 SRB_STATUS_QUEUE_FROZEN 설정합니다. 따라서 클래스 드라이버에는 일반적으로 디바이스 I/O 요청에 대한 큐의 상태 변경하는 내부 루틴이 있습니다. 자세한 내용은 스토리지 클래스 드라이버의 ReleaseQueue 루틴을 참조하세요.
드라이버의 BuildRequest 루틴이 포트 드라이버가 요청에 대한 요청 감지 정보를 반환할 것을 요청한 경우 IoCompletion 루틴은 내부 InterpretRequestSense 루틴을 호출하거나 동일한 기능을 인라인으로 구현합니다. 자세한 내용은 스토리지 클래스 드라이버의 InterpretRequestSense 루틴을 참조하세요.
스토리지 클래스 드라이버는 대상 컨트롤러 오류, 버스 재설정 또는 요청 시간 제한으로 인해 실패한 요청을 다시 시도해야 합니다. 포트 드라이버가 해당 SrbStatus가 이러한 오류를 나타내도록 설정된 특정 요청을 반환하는 경우 클래스 드라이버는 IoCompletion 루틴 또는 InterpretRequestSense 루틴에서 RetryRequest 루틴을 호출할 수 있습니다. 자세한 내용은 스토리지 클래스 드라이버의 RetryRequest 루틴을 참조하세요.
IoCompletion 루틴에 대한 일반적인 내용은 IRP 완료를 참조하세요.