创建音频驱动程序对象

在用户模式下,COM 对象是使用 CoCreateInstance(在 Microsoft Windows SDK 文档中介绍)等函数创建的,其中客户端不知道如何分配对象所需的内存。 但是,在内核模式下,内存分配往往受到严格控制,因此需要使用不同的对象创建方法。

音频驱动程序模型使用 COM 接口的概念,由 IUnknown 接口定义。 但是,访问注册表或使用进程内服务器等机制不需要音频驱动程序。 不需要微型端口驱动程序即可支持聚合。

按照约定,用于创建特定对象类的函数始终采用相同的形式:

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

参数

未知
指向 IUnknown 接口指针的指针。 该函数通过 Unknown 输出对新创建对象的引用。

ClassId
指定按引用传递的类 GUID。 仅当该函数创建多个类的对象时,才使用此参数。 否则,它设置为 NULL

OuterUnknown
指定用于聚合新对象的 IUnknown 接口。 可以将此参数设置为 NULL,以指示不需要聚合。

PoolType
指定要从中分配对象的内存池的类型(请参阅 POOL_TYPE)。

前三个参数与 COM CoCreateInstance 函数的参数相同。 有关此类型的创建函数示例,请参阅 Microsoft Windows 驱动程序工具包 (WDK) 中 Fmsynth 示例音频驱动程序中的 CreateMiniportMidiFM 函数。

另一个约定是为类提供 NewXxx 函数。 此类函数提供了实例化(创建和初始化)对象的简单方法,如以下示例所示:

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

NewMyObject 函数会创建并初始化对象,然后将指针传递回接口。 由于初始化参数特定于类,因此 NewXxx 函数的原型也是如此。 NewXxx 函数提供对对象对构造函数的便捷访问。

有关此类型的 NewXxx 函数的示例,请参阅 PcNewDmaChannel