오디오 속성 처리기
미니포트 드라이버는 PCPROPERTY_ITEM 구조에서 지원하는 각 속성에 대한 정보를 저장합니다. 이 구조체는 속성에 대한 다음 정보를 포함합니다.
속성 집합 GUID 및 속성 ID(또는 인덱스)
속성의 처리기 루틴에 대한 함수 포인터
처리기가 지원하는 속성 작업을 지정하는 플래그
미니포트 드라이버는 필터에 대한 자동화 테이블( PCAUTOMATION_TABLE 구조로 지정됨)을 제공합니다. 드라이버는 필터의 핀 형식 및 노드 유형에 대한 추가 자동화 테이블을 제공합니다. 각 핀 또는 노드 형식에는 자체 테이블이 있습니다. 각 자동화 테이블에는 PCPROPERTY_ITEM 구조체의 (비어 있는) 배열이 포함되어 있으며, 이러한 각 구조체는 필터, 핀 또는 노드의 하나의 속성을 설명합니다. 클라이언트가 필터, 핀 또는 노드에 속성 요청을 보내면 포트 드라이버는 자동화 테이블을 통해 요청을 적절한 속성 처리기로 라우팅합니다.
미니포트 드라이버는 각 속성에 대해 고유한 속성 처리기 루틴을 지정할 수 있습니다. 그러나 드라이버가 몇 가지 유사한 속성을 처리하는 경우 편의를 위해 이러한 속성을 단일 처리기 루틴으로 통합할 수 있습니다. 각 속성에 대해 고유한 처리기를 제공하거나 여러 속성을 단일 처리기로 통합할지 여부는 드라이버 작성기에서 결정해야 하는 구현 결정이며 속성 요청을 제출하는 클라이언트에 투명해야 합니다.
사용자 모드 클라이언트는 dwIoControlCode 호출 매개 변수가 IOCTL_KS_PROPERTY 설정된 Microsoft Win32 함수 DeviceIoControl을 호출하여 get, set 또는 basic-support 속성 요청을 보낼 수 있습니다. 운영 체제는 이 호출을 클래스 드라이버로 디스패치하는 IRP로 변환합니다. 자세한 내용은 KS 속성을 참조하세요.
클라이언트가 필터 핸들 또는 핀 핸들에 KS 속성 요청(즉, IOCTL_KS_PROPERTY I/O 제어 IRP)을 보내면 KS 시스템 드라이버(Ks.sys)는 필터 개체 또는 핀 개체에 대한 포트 드라이버에 요청을 전달합니다. 미니포트 드라이버가 속성에 대한 처리기를 제공하는 경우 포트 드라이버는 요청을 처리기에 전달합니다. 요청을 전달하기 전에 포트 드라이버는 속성 요청의 정보를 PCPROPERTY_REQUEST 구조에 지정된 형식으로 변환합니다. 포트 드라이버는 이 구조를 미니포트 드라이버의 처리기에 전달합니다.
PCPROPERTY_REQUEST MajorTarget 멤버는 오디오 디바이스의 기본 미니포트 드라이버 인터페이스를 가리킵니다. 예를 들어 WavePci 디바이스의 경우 미니포트 드라이버 개체의 IMiniportWavePci 인터페이스에 대한 포인터입니다.
필터 핸들로 전송된 KS 속성 요청의 경우 PCPROPERTY_REQUEST MinorTarget 멤버는 NULL입니다. 핀 핸들로 전송된 요청의 경우 MinorTarget 은 핀의 스트림 인터페이스를 가리킵니다. 예를 들어 WavePci 디바이스의 경우 스트림 개체의 IMiniportWavePciStream 인터페이스에 대한 포인터입니다.
PCPROPERTY_REQUEST 인스턴스 및 값 멤버는 각각 KS 속성 요청의 입력 및 출력 버퍼를 가리킵니다. (버퍼는 DeviceIoControl 함수의 lpInBuffer 및 lpOutBuffer 매개 변수에 의해 지정됩니다.) 이러한 버퍼에는 오디오 드라이버 속성 집합에 설명된 대로 속성 설명자(instance 데이터) 및 속성 값(작업 데이터)이 각각 포함됩니다. Value 멤버는 출력 버퍼의 시작을 가리키지만 인스턴스 포인터는 입력 버퍼의 시작부터 오프셋됩니다.
입력 버퍼는 KSPROPERTY 또는 KSNODEPROPERTY 구조체로 시작합니다. 포트 드라이버는 이 구조체의 정보를 PCPROPERTY_REQUEST 구조체의 Node, PropertyItem 및 동사 멤버로 복사합니다. 데이터가 버퍼의 KSPROPERTY 또는 KSNODEPROPERTY 구조를 따르는 경우 포트 드라이버는 이 데이터에 대한 포인터를 사용하여 인스턴스 멤버를 로드합니다. 그렇지 않으면 인스턴스 를 NULL로 설정합니다.
입력 버퍼가 노드 정보가 없는 KSPROPERTY 구조체로 시작하는 경우 포트 드라이버는 PCPROPERTY_REQUEST 구조체의 노드 멤버를 ULONG(-1)로 설정합니다. 이 경우 포트 드라이버는 필터 또는 핀에 대한 미니포트 드라이버의 자동화 테이블에서 속성 요청의 대상이 필터 핸들 또는 핀 핸들에 의해 지정되었는지 여부에 따라 적절한 처리기를 호출합니다. 테이블이 속성에 대한 처리기를 지정하지 않으면 포트 드라이버가 대신 요청을 처리합니다.
입력 버퍼가 KSNODEPROPERTY 구조로 시작하는 경우 포트 드라이버는 이 구조체의 노드 ID를 PCPROPERTY_REQUEST 구조체의 노드 멤버로 복사하고 노드에 대한 미니포트 드라이버의 자동화 테이블에서 적절한 처리기를 호출합니다. (다시 말하지만 테이블에서 속성에 대한 처리기를 지정하지 않으면 포트 드라이버가 대신 요청을 처리합니다.)
포트 드라이버는 속성 요청의 작업 플래그에서 KSPROPERTY_TYPE_TOPOLOGY 비트를 확인하여 입력 버퍼의 시작 부분에 있는 KSPROPERTY 또는 KSNODEPROPERTY라는 두 구조 중 어느 것이 있는지 확인합니다.
이 비트가 설정되면 노드 속성에 대한 요청이 되며 입력 버퍼는 KSNODEPROPERTY 구조로 시작됩니다.
그렇지 않으면 입력 버퍼는 KSPROPERTY 구조체로 시작합니다.
KSPROPERTY_TYPE_TOPOLOGY 대한 자세한 내용은 KSPROPERTY를 참조하세요.
PCPROPERTY_REQUEST 구조체의 InstanceSize 및 ValueSize 멤버는 인스턴스 및 값 멤버가 가리키는 버퍼의 크기를 지정합니다. ValueSize 는 속성 요청의 출력 버퍼 크기와 같지만 InstanceSize 는 입력 버퍼의 KSPROPERTY 또는 KSNODEPROPERTY 구조 뒤에 있는 데이터의 크기입니다. 즉, InstanceSize 는 입력 버퍼의 크기에서 KSPROPERTY 또는 KSNODEPROPERTY 구조체의 크기를 뺀 크기입니다. 이 구조를 따르는 추가 데이터가 없는 경우 포트 드라이버는 InstanceSize 를 0으로 설정하고 인스턴스 를 NULL로 설정합니다.
예를 들어 클라이언트가 입력 버퍼의 instance 데이터로 KSNODEPROPERTY_AUDIO_CHANNEL 구조를 지정하는 경우 포트 드라이버는 인스턴스 멤버가 KSNODEPROPERTY_AUDIO_CHANNEL 구조체의 Channel 멤버를 가리키고 InstanceSize 멤버에 값이 포함된 PCPROPERTY_REQUEST 구조체를 처리기에 전달합니다.
sizeof(KSNODEPROPERTY_AUDIO_CHANNEL) - sizeof(KSNODEPROPERTY)
속성 값을 검색하기 위해 get-property 요청을 제출하기 전에 클라이언트는 미니포트 드라이버의 속성 처리기가 속성 값을 쓸 수 있는 출력 버퍼를 할당해야 합니다. 일부 속성의 경우 출력 버퍼의 크기는 디바이스에 따라 다르며 클라이언트는 필요한 버퍼 크기에 대해 속성 처리기를 쿼리해야 합니다. 이러한 경우 클라이언트는 출력 버퍼 포인터가 nullptr이고 출력 버퍼 길이가 0인 초기 속성 요청을 제출합니다. 처리기는 상태 코드 STATUS_BUFFER_OVERFLOW 함께 필요한 버퍼 크기를 반환하여 응답합니다. 그런 다음 클라이언트는 지정된 크기의 출력 버퍼를 할당하고 두 번째 get-property 요청에서 이 버퍼를 전송하여 속성 값을 검색합니다.
지정된 버퍼 크기가 너무 작아서 요청된 정보를 수신할 수 없는 경우 메서드는 STATUS_BUFFER_TOO_SMALL 반환합니다.
경우에 따라 PortCls 포트 드라이버는 출력 버퍼 주소와 크기가 0이 아닌 속성 요청에 대한 응답으로 STATUS_BUFFER_OVERFLOW 대신 STATUS_BUFFER_TOO_SMALL 반환합니다. 이러한 경우 필수 버퍼 크기가 반환되지 않습니다.
자세한 내용은 NTSTATUS 값 사용 및 다음 블로그 게시물을 참조하세요.