Création d’objets de pilote audio

En mode utilisateur, les objets COM sont créés à l’aide d’une fonction telle que CoCreateInstance (décrite dans la documentation Microsoft Windows SDK), où le client ignore comment la mémoire requise pour l’objet est allouée. En mode noyau, cependant, où l’allocation de mémoire a tendance à être étroitement contrôlée, une autre méthode de création d’objet est nécessaire.

Le modèle de pilote audio utilise le concept de l’interface COM, tel que défini par l’interface IUnknown . Toutefois, les pilotes audio ne sont pas nécessaires pour accéder au Registre ou utiliser des mécanismes tels que des serveurs en cours de traitement. Les pilotes miniport ne sont pas nécessaires pour prendre en charge l’agrégation.

Par convention, la fonction utilisée pour créer une classe particulière d’objets prend toujours la même forme :

NTSTATUS CreateMyObject(
   OUT PUNKNOWN  *Unknown,
   IN REFGUID ClassId,
   IN PUNKNOWN OuterUnknown OPTIONAL,
   IN POOL_TYPE PoolType
 );

Paramètres

Inconnu
Pointeur vers un pointeur vers une interface IUnknown . La fonction génère une référence à l’objet nouvellement créé via Unknown.

Classid
Spécifie le GUID de classe, qui est passé par référence. Ce paramètre est utilisé uniquement si la fonction crée des objets de plusieurs classes. Sinon, elle est définie sur NULL.

OuterUnknown
Spécifie l’interface IUnknown pour l’agrégation du nouvel objet. Ce paramètre peut être défini sur NULL pour indiquer qu’aucune agrégation n’est requise.

PoolType
Spécifie le type de pool de mémoire à partir duquel l’objet doit être alloué (voir POOL_TYPE).

Les trois premiers paramètres sont identiques aux paramètres de la fonction COM CoCreateInstance . Pour obtenir un exemple de fonction de création de ce type, consultez la fonction CreateMiniportMidiFM dans l’exemple de pilote audio Fmsynth dans microsoft Windows Driver Kit (WDK).

Une autre convention consiste à fournir une fonction NewXxx pour une classe. Ces fonctions offrent un moyen simple d’instancier (créer et initialiser) un objet, comme illustré dans l’exemple suivant :

NTSTATUS NewMyObject(
 OUT PMYINTERFACE  *InterfacePointer,
 IN PUNKNOWN  OuterUnknown OPTIONAL,
 IN POOL_TYPE  PoolType,
  // ...more parameters
 );

La fonction NewMyObject crée et initialise un objet, puis renvoie un pointeur vers l’interface. Étant donné que les paramètres d’initialisation sont spécifiques à la classe, il en va de même pour le prototype d’une fonction NewXxx . La fonction NewXxx fournit un accès pratique au constructeur de l’objet.

Pour obtenir un exemple de fonction NewXxx de ce type, consultez PcNewDmaChannel.