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.