Criando 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), em que o cliente não sabe como a memória necessária para o objeto é alocada. No modo kernel, no entanto, em que a alocação de memória tende a ser fortemente controlada, um método diferente de criação de objeto é necessário.

O modelo de driver de áudio usa o conceito da interface COM, conforme definido pela interface IUnknown . Os drivers de áudio, no entanto, não são necessários para acessar o registro ou usar mecanismos como servidores em processo. Drivers de miniporta não são necessários para dar suporte à 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 de classe, que é passado por referência. Esse parâmetro será usado somente se a função criar objetos de várias classes. Caso contrário, ele será definido como NULL.

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

PoolType
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 COCreateInstance COM. 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 WDK (Microsoft Windows Driver Kit).

Outra convenção é fornecer uma nova funçãoXxx para uma classe. Essas funções fornecem uma maneira fácil de instanciar (criar e inicializar) um objeto, conforme 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 função NewXxx também é. A função NewXxx fornece acesso conveniente ao construtor para o objeto .

Para obter um exemplo de uma função NewXxx desse tipo, consulte PcNewDmaChannel.