Partager via


Objets récepteur de service et groupe de services

Le pilote système PortCls implémente les interfaces IServiceSink et IServiceGroup pour l’avantage des pilotes de port et de miniport. Le pilote de port utilise ces interfaces pour distribuer des notifications d’interruption à ses propres routines de service, et un pilote miniport a la possibilité d’utiliser ces interfaces à des fins similaires. Un objet IServiceSink encapsule une routine de service, et un objet IServiceGroup représente un groupe d’objets IServiceSink. Lorsqu’un groupe de services reçoit une demande de service, il la distribue à chacun de ses récepteurs de service.

IServiceGroup hérite d’IServiceSink. Étant donné qu’un groupe de services est également un récepteur de services, un groupe de services est capable de contenir d’autres groupes de services, bien que les pilotes audio n’utilisent généralement pas cette fonctionnalité. Les pilotes de port utilisent actuellement des groupes de services pour démultiplexer les demandes d’interruption de service, bien que les fonctionnalités d’un groupe de services soient suffisamment générales pour le rendre potentiellement utile à d’autres fins.

La routine de service d’interruption (ISR) du pilote miniport appelle l’une des méthodes de notification suivantes dans le pilote de port :

IPortDMus::Notify

IPortMidi::Notify

IPortWaveCyclique::Notify

IPortWavePci::Notify

La méthode de notification prend un pointeur vers le groupe de services comme paramètre d’appel. Pendant cet appel, le pilote de port appelle la méthode IServiceSink::RequestService du groupe de services, qui met en file d’attente un appel de procédure différée (DPC). Lorsque le DPC s’exécute, il transfère la demande de service à tous les objets membres du groupe de services.

Le code du pilote miniport n’a généralement pas besoin d’appeler des méthodes d’interface IServiceGroup . Toutefois, le pilote de port appelle ces méthodes pour ajouter ses propres objets IServiceSink aux groupes de services qu’il obtient à partir du pilote miniport. Les pilotes miniport créent des objets de groupe de services en fonction des besoins et associent ces groupes de services à des objets de miniport et de flux qui nécessitent une maintenance périodique. Par exemple, un pilote miniport WaveCyclique associe un objet de flux au groupe de services qu’il spécifie comme paramètre de sortie à la méthode IMiniportWaveCyclique::NewStream .

Dans le contexte des pilotes miniport WaveCycliques, l’association de tous les flux à un groupe de services entraîne la maintenance de tous les flux par le pilote de port en fonction d’une seule notification. L’association de chaque flux à son propre groupe de services permet à la routine de service d’interruption de sélectionner le flux qui sera utilisé par le pilote de port pendant l’exécution de la DPC.

Un pilote miniport génère une référence à son groupe de services lorsque le pilote de port appelle l’une des méthodes d’initialisation suivantes :

IMiniportdMus::init

IMiniportmidi::init

IMiniportWavePci::init

Le pilote de port ajoute son propre objet IServiceSink au groupe de services qu’il obtient à partir de l’appel Init . Lorsque l’ISR du pilote miniport appelle ultérieurement Notify pour envoyer une notification à ce groupe de services, le groupe de services met en file d’attente un DPC qui transfère la notification à l’objet IServiceSink du pilote de port, qui à son tour transfère la notification au pilote miniport en appelant l’une des méthodes de service suivantes :

IMiniportDMus::Service (non utilisé)

IMiniportMidi::Service

IMiniportWavePci::Service

Un pilote miniport génère également une référence à son groupe de services lorsque le pilote de port appelle l’une des méthodes de création de flux suivantes :

IMiniportDMus::NewStream

IMiniportMidi::NewStream

IMiniportWaveCyclique::NewStream

IMiniportWavePci::NewStream

Comme indiqué précédemment, le pilote miniport a la possibilité de créer un groupe de services différent pour chaque flux ou de partager un seul groupe de services entre tous les flux.

Les méthodes suivantes permettent aux pilotes de port MIDI et DMus d’éviter de supprimer les interruptions matérielles :

IPortMidi::RegisterServiceGroup

IPortDMus::RegisterServiceGroup

Pendant l’exécution de sa méthode Init , un pilote de miniport MIDI ou DMus appelle généralement la méthode RegisterServiceGroup du pilote de port avant de démarrer le synthétiseur. L’objectif de cet appel est de permettre au pilote de port d’insérer son objet récepteur de service (contenant son gestionnaire d’interruptions) dans le groupe de services avant que le matériel commence à générer des interruptions. Bien que la méthode Init génère un pointeur de groupe de services vers le pilote de port, le pilote de port peut utiliser ce pointeur uniquement après le retour d’Init.

Dans le cas d’un pilote de port WavePci, l’objet port ajoute son propre objet IServiceSink au groupe de services qu’il obtient à partir de l’appel IMiniportWavePci::NewStream . Lorsque l’ISR du pilote miniport appelle ultérieurement Notify pour envoyer une notification à ce groupe de services, le groupe de services met en file d’attente un DPC qui transfère la notification à l’objet IServiceSink du pilote de port, qui à son tour effectue les opérations suivantes :

  • Transfère la notification au flux de miniport en appelant la méthode de service IMiniportWavePciStream::Service.

  • Déclenche les événements de position et/ou d’horloge sur la broche qui sont prêts à être déclenchés.

L’interface IServiceSink prend en charge une seule méthode :

IServiceSink::RequestService

L’interface IServiceGroup prend en charge les méthodes suivantes :

IServiceGroup::AddMember

IServiceGroup::CancelDelayedService

IServiceGroup::RequestDelayedService

IServiceGroup::RemoveMember

IServiceGroup::SupportDelayedService

En outre, le pilote système PortCls fournit une fonction PcNewServiceGroup pour créer un objet de groupe de services. Toutefois, il n’existe aucune fonction similaire pour la création d’un objet récepteur de service. Le pilote de port ajoute simplement une interface IServiceSink à l’implémentation de son objet de port main- lorsque l’objet est créé, de même que le récepteur de service. Le pilote de port peut ajouter l’interface IServiceSink de l’objet port au groupe de services qu’il reçoit de la méthode Init ou NewStream du pilote miniport. Pour des raisons pratiques, le fichier d’en-tête Portcls.h définit des constantes IMP_IServiceSink et IMP_IServiceGroup pour l’ajout d’interfaces IServiceSink et IServiceGroup aux objets de pilote.