다음을 통해 공유


스트림 요청 블록 처리

운영 체제는 디바이스의 모든 I/O 요청을 클래스 드라이버로 디스패치합니다. 클래스 드라이버는 SRB를 미니드라이버에 전달하여 미니드라이버에서 하드웨어 관련 정보를 요청합니다. 클래스 드라이버는 스트림 요청 블록의 Command 멤버에서 요청하는 작업을 지정합니다.

미니드라이버 전체와 미니드라이버 내의 각 스트림은 모두 I/O 요청을 받을 수 있습니다. 미니 드라이버는 디바이스 전체 요청을 처리하기 위해 StrMiniReceiveDevicePacket 루틴을 제공해야 합니다. 각 스트림은 I/O 요청을 처리하는 두 가지 루틴을 지원해야 합니다. 하나는 데이터 요청용이고 다른 하나는 제어 요청에 대한 것입니다. 클래스 드라이버는 데이터 요청 콜백인 StrMiniReceiveStreamDataPacket을 호출하여 스트림의 모든 읽기 및 쓰기 요청을 처리합니다. 스트림에 대한 다른 모든 요청은 StrMiniReceiveStreamControlPacket에 전달됩니다.

클래스 드라이버가 미니드라이버에 대한 동기화를 처리하는 경우 스트림 요청을 큐에 대기하고 미니드라이버에 한 번에 하나씩 디스패치합니다. 클래스 드라이버는 디바이스 요청에 대해 하나씩, 스트림 데이터 및 제어 요청에 대해 각각 하나씩 세 개의 별도 큐를 유지 관리합니다. 미니 드라이버는 다음과 같이 이러한 큐 중 하나에서 새 요청에 대한 준비가 되었음을 알릴 수 있습니다.

요청 유형 루틴에서 반환된 값 루틴의 NotificationType 매개 변수

디바이스 요청

StreamClassDeviceNotification

ReadyForNextDeviceRequest

스트림 제어 요청

StreamClassStreamNotification

ReadyForNextStreamControlRequest

스트림 데이터 요청

StreamClassStreamNotification

ReadyForNextStreamDataRequest

클래스 드라이버가 StrMiniReceiveXXX패킷을 호출하면 스트림 요청 블록을 미니드라이버에 연결합니다. 미니 드라이버의 루틴은 요청을 완료한 클래스 드라이버에 신호를 보낼 때까지 스트림 요청 블록에 단독으로 액세스할 수 있습니다.

미니드라이버가 요청 처리를 완료하면 다음과 같이 요청을 완료한 클래스 드라이버에 신호를 보내야 합니다.

  1. 미니 드라이버는 스트림 요청 블록의 상태 필드에 요청의 상태 설정해야 합니다.

  2. 미니 드라이버는 StreamClassDeviceNotification 또는 StreamClassStreamNotification을 호출하여 요청을 완료했음을 신호해야 합니다. 디바이스 요청을 완료하기 위해 미니 드라이버는 DeviceRequestComplete의 NotificationType 매개 변수를 사용하여 StreamClassDeviceNotification을 호출합니다. 스트림 요청을 완료하기 위해 미니드라이버가 StreamRequestComplete의 NotificationType 매개 변수를 사용하여 StreamClassStreamNotification을 호출합니다.

  3. 클래스 드라이버가 동기화를 처리하고 있고 미니드라이버가 이 큐에 대한 다른 요청에 대한 준비가 되었음을 클래스 드라이버에 아직 알리지 않은 경우 지금 이 작업을 수행해야 합니다.

미니 드라이버는 StreamClassCompleteRequestAndMarkQueueReady를 호출하여 2와 3을 결합할 수 있습니다.

미니드라이버가 요청을 비동기적으로 처리하므로 클래스 드라이버는 요청을 취소하거나 시간 초과해야 할 수 있습니다. 이러한 목적을 위해 미니 드라이버는 StrMiniCancelPacketStrMiniRequestTimeout 루틴을 제공해야 합니다. 클래스 드라이버는 요청을 취소하거나 시간 초과할 때 해당 미니 드라이버 루틴을 호출합니다.

클래스 드라이버는 운영 체제에서 기본 I/O 요청을 취소할 때 요청을 취소합니다. 클래스 드라이버는 처리하는 데 너무 오래 걸리는 요청을 시간 초과합니다. 스트림 요청 블록의 TimeoutCounter 멤버에서 요청을 시간 초과할 때까지 카운터의 시간(초)이 감소합니다. 미니드라이버가 오랜 시간 동안 요청에 대한 처리를 연기해야 하는 경우 TimeoutCounter 멤버를 0으로 설정해야 합니다. 그러면 클래스 드라이버가 요청 시간을 초과하지 않습니다. 미니드라이버가 요청 처리를 다시 시작하면 TimeoutCounter 가 스트림 요청 블록의 TimeoutOriginal 멤버와 같도록 다시 설정해야 합니다. 미니 드라이버는 TimeoutOriginal 을 다시 설정하여 요청 시간이 초과되기 전까지의 시간을 변경할 수 있습니다. 자세한 내용은 HW_STREAM_REQUEST_BLOCK 참조하세요.