서비스 싱크 및 서비스 그룹 개체
PortCls 시스템 드라이버는 포트 및 미니포트 드라이버의 이점을 위해 IServiceSink 및 IServiceGroup 인터페이스를 구현합니다. 포트 드라이버는 이러한 인터페이스를 사용하여 자체 서비스 루틴에 인터럽트 알림을 배포하고 미니포트 드라이버에는 비슷한 용도로 이러한 인터페이스를 사용할 수 있는 옵션이 있습니다. IServiceSink 개체는 서비스 루틴을 캡슐화하고 IServiceGroup 개체는 IServiceSink 개체 그룹을 나타냅니다. 서비스 그룹은 서비스 요청을 받으면 각 서비스 싱크에 요청을 배포합니다.
IServiceGroup 은 IServiceSink에서 상속됩니다. 서비스 그룹은 서비스 싱크이기도 하므로 오디오 드라이버는 일반적으로 이 기능을 사용하지 않지만 서비스 그룹은 다른 서비스 그룹을 포함할 수 있습니다. 포트 드라이버는 현재 서비스 그룹을 사용하여 인터럽트 서비스에 대한 요청을 제거하지만 서비스 그룹의 기능은 다른 용도로도 유용할 수 있을 만큼 일반적입니다.
미니포트 드라이버의 ISR(인터럽트 서비스 루틴)은 포트 드라이버에서 다음 알림 방법 중 하나를 호출합니다.
알림 메서드는 서비스 그룹에 대한 포인터를 호출 매개 변수로 사용합니다. 이 호출 중에 포트 드라이버는 DPC(지연 프로시저 호출)를 큐에 대기하는 서비스 그룹의 IServiceSink::RequestService 메서드를 호출합니다. DPC가 실행되면 서비스 요청을 서비스 그룹의 모든 멤버 개체에 전달합니다.
미니포트 드라이버 코드는 일반적으로 IServiceGroup 인터페이스 메서드를 호출할 필요가 없습니다. 그러나 포트 드라이버는 이러한 메서드를 호출하여 미니포트 드라이버에서 가져오는 서비스 그룹에 자체 IServiceSink 개체를 추가합니다. 미니포트 드라이버는 필요에 따라 서비스 그룹 개체를 만들고 이러한 서비스 그룹을 주기적인 서비스가 필요한 미니포트 및 스트림 개체와 연결합니다. 예를 들어 WaveCyclic 미니포트 드라이버는 스트림 개체를 출력 매개 변수로 지정하는 서비스 그룹과 IMiniportWaveCyclic::NewStream 메서드에 연결합니다.
WaveCyclic 미니포트 드라이버의 컨텍스트에서 모든 스트림을 하나의 서비스 그룹과 연결하면 포트 드라이버가 단일 알림에 따라 모든 스트림을 서비스하게 됩니다. 각 스트림을 자체 서비스 그룹과 연결하면 인터럽트 서비스 루틴이 DPC를 실행하는 동안 포트 드라이버에서 서비스할 스트림을 선택할 수 있습니다.
미니포트 드라이버는 포트 드라이버가 다음 초기화 방법 중 하나를 호출할 때 해당 서비스 그룹에 대한 참조를 출력합니다.
포트 드라이버는 Init 호출에서 가져온 서비스 그룹에 자체 IServiceSink 개체를 추가합니다. 미니포트 드라이버의 ISR이 나중에 알림을 호출하여 해당 서비스 그룹에 알림을 보내면 서비스 그룹은 포트 드라이버의 IServiceSink 개체에 알림을 전달하는 DPC를 큐에 대기합니다. 이 DPC는 다음 서비스 방법 중 하나를 호출하여 알림을 미니포트 드라이버에 전달합니다.
IMiniportDMus::Service (사용되지 않음)
또한 미니포트 드라이버는 포트 드라이버가 다음 스트림 생성 방법 중 하나를 호출할 때 해당 서비스 그룹에 대한 참조를 출력합니다.
IMiniportWaveCyclic::NewStream
앞에서 설명한 것처럼 미니포트 드라이버에는 각 스트림에 대해 다른 서비스 그룹을 만들거나 모든 스트림에서 단일 서비스 그룹을 공유하는 옵션이 있습니다.
다음 방법은 MIDI 및 DMus 포트 드라이버가 하드웨어 인터럽트 삭제를 방지하는 데 도움이 됩니다.
IPortMidi::RegisterServiceGroup
IPortDMus::RegisterServiceGroup
Init 메서드를 실행하는 동안 MIDI 또는 DMus 미니포트 드라이버는 일반적으로 신시사이저를 시작하기 전에 포트 드라이버의 RegisterServiceGroup 메서드를 호출합니다. 이 호출의 목적은 하드웨어가 인터럽트 생성을 시작하기 전에 포트 드라이버가 서비스 싱크 개체(인터럽트 처리기 포함)를 서비스 그룹에 삽입할 수 있도록 하는 것입니다. Init 메서드는 포트 드라이버에 대한 서비스 그룹 포인터를 출력하지만 포트 드라이버는 Init에서 반환된 후에만 이 포인터를 사용할 수 있습니다.
WavePci 포트 드라이버의 경우 포트 개체는 IMiniportWavePci::NewStream 호출에서 가져온 서비스 그룹에 자체 IServiceSink 개체를 추가합니다. 미니포트 드라이버의 ISR이 나중에 알림 을 호출하여 해당 서비스 그룹에 알림을 보내면 서비스 그룹은 포트 드라이버의 IServiceSink 개체에 알림을 전달하는 DPC를 큐에 대기합니다. 이 경우 다음을 수행합니다.
서비스 메서드 IMiniportWavePciStream::Service를 호출하여 미니포트 스트림에 알림을 전달합니다.
실행할 준비가 된 핀의 위치 및/또는 클록 이벤트를 트리거합니다.
IServiceSink 인터페이스는 단일 메서드를 지원합니다.
IServiceGroup 인터페이스는 다음 메서드를 지원합니다.
IServiceGroup::CancelDelayedService
IServiceGroup::RequestDelayedService
IServiceGroup::SupportDelayedService
또한 PortCls 시스템 드라이버는 새 서비스 그룹 개체를 만들기 위한 PcNewServiceGroup 함수를 제공합니다. 그러나 서비스 싱크 개체를 만들기 위한 유사한 함수는 없습니다. 포트 드라이버는 단순히 IServiceSink 인터페이스를 해당 기본 포트 개체의 구현에 추가합니다. 개체가 만들어지면 서비스 싱크도 마찬가지입니다. 포트 드라이버는 미니포트 드라이버의 Init 또는 NewStream 메서드에서 수신하는 서비스 그룹에 포트 개체의 IServiceSink 인터페이스를 추가할 수 있습니다. 편의를 위해 헤더 파일 Portcls.h는 드라이버 개체에 IServiceSink 및 IServiceGroup 인터페이스를 추가하기 위한 IMP_IServiceSink 및 IMP_IServiceGroup 상수를 정의합니다.