PortClass音频
+ -

PortClass中的COM

2021-07-01 156 0

一般的Windows驱动我们采用的是WDM驱动架构,最近的Windows驱动架构WDF也是建立在WDM基础上的。这些基于WDM的一般设备驱动可以应付大部分的设备驱动,如串口,PCI,USB等通用设备驱动。但是微软的关于流的处理的一些服务及驱动采用的面向对象的设计方法,是基于COM进行开发的,典型的像ks.sys,portcls.sys等。

通过WINDOWS驱动的概念可知,mini端口驱动一般是向其端口提供一组回调函数,并通过端口驱动提供的特定的函数向端口驱动进行注册。同样在注册期间,mini端口会告诉端口驱动程序微型端口将需要的上下文结构的大小。端口驱动程序将函数表复制到某个私有位置,分配上下文结构并调用函数表中的初始化函数,将指针传递给上下文结构。

音频mini端口驱动使用和常见的mini端口驱动类似的方法,不过由mini端口驱动提供的函数表不再进行程序复制,再不再承承担上下文的责任,而是以COM的形式创建。COM形式的创建像C++的类一样,其以函数表以COM类的成员函数在编译时静态创建。

采用COM开发的原因是因为COM为创建抽象对象提供了一种可靠、高效、广为理解的形式主义。音频MiniPort模型利用了COM的行业经验。此外,COM通过将不安全的强制转换隔离到一些函数来增强代码安全性。对象可以在C或C++中实现和使用。也可以使用汇编,但这会妨碍可移植性。

在用户模式下,COM对象是使用函数CoCreateInstance()或类似函数创建的。使用这样的函数意味着对象所需的内存是以客户机不知道的方式分配的。在内核模式下,需要严格控制内存的分配。因此,使用了不同的对象创建方法。

在音频驱动程序模型中使用的COM方面包括接口的概念和IUnknown接口的定义。尽管有一种类似于进程内服务器的机制,但驱动程序开发人员不需要构建这样的服务器或访问注册表。Mini端口也被正式排除在支持聚合之外,尽管示例代码演示了一种支持聚合的简单方法。

COM创建

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

前三个参数与COM的CoCreateInstance()的参数相同。指向对象的IUnknown接口的指针通过Unknown传回,类GUID作为ClassId传递(仅在create函数创建多个类的对象时使用),OuterUnknown为聚合新对象的对象提供未知接口(通常为NULL)。最后一个参数指定要从中分配对象的池的类型。

另一个约定是为类提供一个新函数,该函数创建一个对象,初始化它,并传回一个指向调用者可能想要的接口的指针。因为初始化参数是类特定的,所以新函数的原型也是类特定的。

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

这些函数提供了实例化(创建和初始化)对象的简单方法。

示例代码通过提供支持引用计数和聚合的类简化了COM对象实现。对象的作者提供获取对象接口所需的函数。辅助类(CUness)是用C++编写的。

0 篇笔记 写笔记

IRP的完成IoCompleteRequest
每当一个IRP在下层设备层完成时,是需要调用IoCompleteRequest来实现IRP的完成,这个完成其实是实现对执行的IRP的善后操作,这个操作其实是一个宏,真实函数数是IofCompleteRequest。#define IoCompleteRequest IofCompleteReque......
IoCopyCurrentIrpStackLocationToNext和IoSkipCurrentIrpStackLocation操作的IO_STACK_LOCATION有什么区别
在Windows驱动中,传递IPR一般有两种操作:一种是调用IoSkipCurrentIrpStackLocation,表示跳过本层驱动的操作,直接转发至下层: IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(FDODeviceEx......
IRP完成APC执行函数IopCompleteRequest
IRP在完成时调用IoCompleteRequest,其最终会执行一个APC调用,该调用的函数名为IopCompleteRequest。其调用APC调用时的代码如下:KeInitializeApc(&Irp->Tail.Apc, &......
WDDM 显卡及显卡驱动的分类
随着显卡的技术的发展,对于三维图形处理的功能越来越强,所以直接导致的一个结果就是显卡的数学处理能力(浮点计算)的功能越来越强。所以对于一些需要进行大量数学计算的模块,将这些功能交由显卡来进行处理相比较CPU更能大幅度提高效率。如现在的人功智能AI,还有前几年火热的挖矿…这些都是需要复杂的数学计算......
PortClass中的COM
一般的Windows驱动我们采用的是WDM驱动架构,最近的Windows驱动架构WDF也是建立在WDM基础上的。这些基于WDM的一般设备驱动可以应付大部分的设备驱动,如串口,PCI,USB等通用设备驱动。但是微软的关于流的处理的一些服务及驱动采用的面向对象的设计方法,是基于COM进行开发的,典型的像......
IRP完成例程IoSetCompletionRoutine的设计和实现原理
在进行IRP下层传递时,通过上一节可知道,一种中使用IoCopyCurrentIrpStackLocationToNext,另一种是IoSkipCurrentIrpStackLocation。其中在使用IoCopyCurrentIrpStackLocationToNext表示的是对当前的IRP当留当......
COM的QueryInterface与NonDelegatingQueryInterface关系
COM类的实现如下:class CMyComponent : public CUnknown, public ISomeInterface{public: DECLARE_IUNKNOWN; STDMETHODIMP NonDelegatingQueryInterface(RE......
COM的QueryInterface与NonDelegatingQueryInterface的测试用例
COM中,函数的调用实际是汇编 call 函数地址.对于一个类里定义的函数实际是一个一个的地址偏移.如果地址偏移是一样而且参数个数与排列都一样,函数叫什么名字是没有关系的。这里关于这句话做一个测试用例,用于测试COMM的妙用:#include #include......
COM简介
COM是什么COM是由Microsoft提出的组件标准,它不仅定义了组件程序之间进行交互的标准,并且也提供了组件程序运行所需的环境。在COM标准中,一个组件程序也被称为一个模块,它可以是一个动态链接库,被称为进程内组件;也可以是一个可执行程序(即EXE程序),被称作进程外组件。一个组件程序可包含一......
COM的应用
当给组件增加函数时,无需修改已发表的接口,而是提供一个新的接口来完成功能扩展。组件A有2个自定义接口,组件B是A的升级,接口结构如下:假设设计了组件A,它有2个自定义接口。IMathe有Add方法完成整数加法,IStr有Cat方法完成字符串连接。升级组件A到B,欲增加一个Mul方法完成整数乘法。由于......
COM全局唯一标识符GUID
COM规范采用了128位全局唯一标识符GUID来标识对象和接口,这是一个随机数,并不需要专门机构进行分配和管理。因为GUID是个随机数,所以并不绝对保证唯一性,但发生标识符相重的可能性非常小。从理论上讲,如果一台机器每秒产生10000000个GUID,则可保证(概率意义上)的3240年不重复)。GU......
COM 接口描述语言IDL
COM规范在IDL接口描述语言(OSF的DCE规范)的基础上,通过扩展形成了COM接口的描述语言。接口描述语言提供了一种不依赖于任何语言的接口的描述方法,因此,可成为组件程序和客户程序之间的共同语言。COM规范使用的IDL不仅可用于定义COM接口,同时还定义了一些常用数据类型,也可描述自定义的数据......
COM进程模型及可用性特性
COM进程模型COM有两种进程模型:进程内对象和进程外对象。如果是进程内对象,则它在客户进程空间上运行;如果是进程外对象,则它运行在本机上的另一个进程空间或远程机上。进程内服务器:服务程序被加载到客户的进程空间,在Win32环境下,通常服务程序代码以动态连接库(DLL)的形式实现;本地服务器:服......
COM组件注册信息
根据COM规范,客户程序通过COM库完成COM对象的创建,COM库则通过注册表所提供的信息进行组件的创建。注册表中包含了所有COM组件的必要信息。组件程序和客户程序都可访问注册表。组件程序把它所实现的COM对象的信息及接口信息保存到注册表中,称之为组件的注册。COM组件在HKEY_CLASSES_......
COM 类厂和DllGetObjectClass函数
类厂是COM对象的生产基地,COM库通过类厂创建COM对象;对应每一个COM类,都有一个类厂,用于该COM类的对象创建操作。类厂本身也是一个COM对象,它支持一个特殊接口(IClassFactory):class IClassFactory:public IUnknown{ virtua......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!