创建音频驱动程序对象
在用户模式下,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。