Criação de objetos de driver de áudio

No modo de usuário, os objetos COM são criados usando uma função como CoCreateInstance (descrita na documentação do SDK do Microsoft Windows), onde o cliente não está ciente de como a memória necessária para o objeto é alocada. No modo kernel, no entanto, onde a alocação de memória tende a ser rigidamente controlada, um método diferente de criação de objetos é necessário.

O modelo de driver de áudio usa o conceito da interface COM, conforme definido pela interface IUnknown . Controladores de áudio, no entanto, não são necessários para aceder ao registo ou para usar mecanismos como servidores em processo. Os drivers de miniporta não são necessários para suportar a agregação.

Por convenção, a função usada para criar uma classe específica de objetos sempre assume a mesma forma:

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

Parâmetros

Desconhecido
Ponteiro para um ponteiro para uma interface IUnknown . A função gera uma referência ao objeto recém-criado por meio de Unknown.

ClassId
Especifica o GUID da classe, que é passado por referência. Este parâmetro é usado somente se a função cria objetos de várias classes. Caso contrário, ele será definido como NULL.

OuterUnknown
Especifica a interface IUnknown para agregar o novo objeto. Este parâmetro pode ser definido como NULL para indicar que nenhuma agregação é necessária.

Tipo de Piscina
Especifica o tipo de pool de memória do qual o objeto deve ser alocado (consulte POOL_TYPE).

Os três primeiros parâmetros são idênticos aos parâmetros da função COM CoCreateInstance . Para obter um exemplo de uma função de criação desse tipo, consulte a função CreateMiniportMidiFM no driver de áudio de exemplo Fmsynth no Microsoft Windows Driver Kit (WDK).

Outra convenção é fornecer uma função NewXxx para uma classe. Essas funções fornecem uma maneira fácil de instanciar (criar e inicializar) um objeto, como mostrado no exemplo a seguir:

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

A função NewMyObject cria e inicializa um objeto e, em seguida, passa um ponteiro de volta para a interface. Como os parâmetros de inicialização são específicos da classe, o protótipo de uma nova funçãoXxx também é. A função NewXxx fornece fácil acesso ao construtor do objeto.

Para obter um exemplo de uma nova funçãoXxx desse tipo, consulte PcNewDmaChannel.