Stream Minidriver 작성

스트림 클래스 드라이버의 기본 디자인 목표는 다중 프로세서 컴퓨터 지원의 복잡성과 커널 스트리밍 의미 체계를 지원하는 운영 체제를 처리하는 작업을 모두 처리하는 것입니다. 미니드라이버가 수행해야 하는 작업의 디바이스별 부분만 처리해야 합니다. 클래스 드라이버는 미니드라이버에 대한 메모리를 할당하고, 미니드라이버에 필요할 수 있는 모든 NT 커널 리소스에 대해 부기 작업을 수행하며,(선택적으로) 모든 동기화 문제를 처리합니다.

클래스 드라이버는 미니 드라이버 제공 콜백 세트를 통해 미니 드라이버와 통신합니다. 스트리밍 미니드라이버를 작성하는 대부분의 작업은 이러한 콜백을 작성할 때 발생합니다.

이 설명서에서는 각 유형의 미니드라이버 제공 루틴을 StrMiniXxx라고 합니다. 미니 드라이버는 기본 하드웨어에서 수행할 수 있는 다양한 함수 수에 따라 각 루틴의 버전을 하나 이상 제공해야 할 수 있습니다.

스트리밍 드라이버는 일반적으로 여러 가지 데이터 스트림을 지원할 수 있습니다. 예를 들어 DVD 플레이어는 오디오와 비디오 스트림을 모두 생성합니다. 커널 스트리밍의 컨텍스트 내에서 각 데이터 스트림은 으로 표시됩니다.

스트림 클래스 드라이버는 미니 드라이버의 각 핀을 추적합니다. 클래스 드라이버의 용어에서 각 핀 유형은 스트림입니다. 핀 유형과 같은 스트림에는 여러 인스턴스가 있을 수 있습니다. 스트림은 I/O 요청을 받을 수 있으므로 드라이버는 각 스트림에 대한 콜백을 제공해야 합니다.

다음은 미니드라이버가 제공해야 하는 루틴입니다. 참조 가이드와 아래에 자세히 설명되어 있습니다.

모든 미니드라이버에서 제공하는 루틴

StrMiniCancelPacket

StrMiniReceiveDevicePacket

StrMiniRequestTimeout

StrMiniEvent

StrMiniInterrupt

미니드라이버가 각 개별 스트림에 대해 제공하는 루틴

StrMiniReceiveStreamDataPacket

StrMiniReceiveStreamControlPacket

StrMiniEvent

StrMiniClock

미니드라이버에서 여러 스트림에 대해 동일한 콜백을 사용할 수 있습니다. 콜백은 해당 매개 변수에서 호출된 스트림을 확인할 수 있습니다.

미니 드라이버는 모든 WDM 드라이버와 마찬가지로 DriverEntry 루틴도 제공해야 합니다. 미니 드라이버의 DriverEntry 루틴의 기본 작업은 클래스 드라이버에 미니 드라이버를 등록하는 것입니다.

클래스 드라이버는 미니드라이버를 대신하여 모든 I/O 요청을 받습니다. 요청을 완료하는 데 필요한 정보를 얻기 위해 클래스 드라이버는 SRB(스트림 요청 블록)를 빌드하고 StrMiniXXX패킷 루틴 중 하나에 전달합니다. 클래스 드라이버는 I/O 요청을 디바이스 전체에 StrMiniReceiveDevicePacket 루틴으로 디스패치합니다. 개별 스트림에 대한 요청을 StrMiniReceiveStreamDataPacket (커널 스트리밍 읽기 및 쓰기 요청의 경우) 또는 StrMiniReceiveStreamControlPacket (다른 요청의 경우)에 전달합니다.

일반적으로 클래스 드라이버는 요청을 큐에 대기하고 미니드라이버에 한 번에 하나씩 전달합니다. 미니 드라이버는 필요에 따라 자체 동기화를 수행할 수 있습니다. 그러면 미니드라이버가 즉시 처리할 수 없는 큐 요청을 담당합니다. 자세한 내용은 미니드라이버 동기화 를 참조하세요.

미니 드라이버는 스트림 요청 블록을 조작하기 위한 두 가지 추가 루틴을 제공해야 합니다. 클래스 드라이버는 취소 IRP를 받으면 StrMiniCancelPacket 을 호출하고 미니드라이버에 특정 패킷을 취소하도록 지시해야 합니다. 또한 클래스 드라이버는 미니드라이버가 스트림 요청 블록의 처리를 완료하는 데 걸리는 시간을 추적합니다. 미니 드라이버가 너무 오래 걸리면 클래스 드라이버가 요청을 시간 초과하고 미니 드라이버의 StrMiniRequestTimeout 루틴을 호출합니다.

하드웨어 인터럽트가 발생하면 운영 체제는 클래스 드라이버에 신호를 보냅니다. 그러면 미니드라이버의 StrMiniInterrupt 루틴을 호출하여 인터럽트를 처리합니다.