고유한 디바이스 ID System-Wide
일반적인 오디오 어댑터용 드라이버는 시스템에서 동일한 오디오 어댑터 카드 여러 인스턴스를 쉽게 지원할 수 있어야 합니다. 드라이버가 유지 관리하는 거의 모든 데이터 구조는 디바이스 확장 버퍼에 저장됩니다( DEVICE_OBJECT 구조체의 DeviceExtension 필드에 대한 설명 참조). 그러나 드라이버의 여러 인스턴스가 전역 데이터를 공유하는 경우 해당 인스턴스는 이 데이터에 대한 액세스를 동기화해야 합니다.
한 가지 추가 요구 사항은 어댑터 카드 특정 instance 각 하위 서비스에는 시스템의 동일한 어댑터 카드 모든 인스턴스에서 하위 서비스를 고유하게 식별하는 디바이스 ID 문자열이 있어야 한다는 것입니다.
이를 수행하는 가장 간단한 방법은 어댑터 카드 각 하위 서비스를 논리적으로 고유한 디바이스로 플러그 앤 플레이 관리자에게 노출하는 것입니다. 이는 다기능 오디오 디바이스에서 옵션(1)으로 표시됩니다.
두 번째 방법은 시스템 제공 다기능 버스 드라이버를 사용하여 어댑터 카드 하위 서비스를 관리하는 것입니다. MF 버스 드라이버는 시스템에 동일한 어댑터 카드 여러 인스턴스가 포함되어 있더라도 시스템 전체에서 고유하도록 보장되는 디바이스 ID를 각 하위 서비스에 할당합니다. MF 버스 드라이버는 하위 서비스가 공통 구성 레지스터 집합을 공유하지만 각 하위 서비스에는 자체 PCI 기본 주소 레지스터 집합이 있는 디자인을 수용합니다. 하위 서비스에는 서로에 대한 숨겨진 종속성이 없어야 하며, 서로 또는 시스템의 다른 디바이스를 방해하지 않고 동시에 작동할 수 있어야 합니다. 다기능 오디오 디바이스의 옵션(2)입니다.
세 번째 방법은 전용 버스 드라이버를 사용하여 어댑터 카드 하위 서비스를 관리하는 것입니다. 하위 서비스에 중앙에서 관리해야 하는 상호 종속성이 있는 경우 이 작업이 자주 필요합니다. 이러한 종속성은 다음과 같은 몇 가지 방법으로 발생할 수 있습니다.
하위 서비스가 일부 카드 리소스를 공유할 수 있습니다. 예를 들어 하위 서비스가 DSP(디지털 신호 프로세서)를 공유하는 경우 버스 드라이버는 첫 번째 하위 서비스를 시작하기 전에 DSP에서 실행되는 독점 운영 체제를 다운로드해야 할 수 있습니다.
디자인 결함으로 인해 하위 서비스 간에 종속성이 발생할 수 있습니다. 예를 들어 디자인 결함으로 하위 서비스가 특정 시퀀스에서 위 또는 아래로 전원을 공급해야 할 수 있습니다.
두 종속성 유형이 모두 있는 경우 독점 버스 드라이버는 하위 서비스를 플러그 앤 플레이 관리자에게 직접 제공하고 종속성을 숨기는 것보다 거의 항상 더 나은 솔루션입니다.
어댑터 카드 사용자 고유의 버스 드라이버를 제공하는 경우 버스 드라이버가 할당하는 디바이스 ID가 시스템 전체에서 고유한지 확인해야 합니다.
버스 드라이버는 플러그 앤 플레이 관리자의 IRP_MN_QUERY_ID 쿼리에 대한 응답으로 자식 중 하나에 대한 디바이스 ID를 제공합니다. ID는 버스 드라이버가 DEVICE_CAPABILITIES 구조체의 UniqueID 필드를 TRUE 또는 FALSE로 설정하여 IRP_MN_QUERY_CAPABILITIES 쿼리에 대한 응답에서 나타내는 두 가지 방법 중 하나로 지정할 수 있습니다.
Uniqueid = 사실
즉, 자식 이름이 시스템 전체에서 고유하도록 보장됩니다. 디바이스 ID 문자열에는 디바이스 ID와 하드웨어 instance 고유하게 식별하는 일련 번호인 instance ID가 포함되어 있습니다.
Uniqueid = False
즉, 자식의 이름은 부모에 대해서만 고유합니다. 대부분의 디바이스는 이 식별 수단을 사용합니다. 이 경우 플러그 앤 플레이 관리자는 수신하는 디바이스 ID 문자열을 확장하여 시스템을 통해 고유하게 만듭니다. 확장 문자열은 부모 디바이스의 고유 ID 함수입니다.
모든 오디오 버스 드라이버는 자식에 대해 UniqueID = FALSE 를 설정해야 합니다. 이렇게 하면 플러그 앤 플레이 관리자가 디바이스의 부모에 대한 정보를 추가하여 컴퓨터에서 ID를 고유하게 만들어 자식의 디바이스 ID 문자열을 확장합니다.