AVStream 是指什么?
AVStream 是指audio and video stream.是声频和视频数据流.
我们什么情况下考虑用AVStream 进行kmdf/wdm开发?
AVStream是微软2003年推出的流驱动开发标准.原来的stream已经不支持了. AVStream简化了的原来stream开发过程,也使stream的开发变得更加简单.对于Pci接口的声音设备,用户应该选择portcls端口驱动程序进行miniport driver开发,如果是usb设备,那么你应该选择ks类驱动进行minidriver 开发.
什么是Miniport driver,port driver,class driver,minidriver呢?
这里我们需要了解wdm驱动的类型.
wdm 驱动总的来说,只有三类驱动.总线驱动,功能驱动,过滤驱动.
总线驱动程序
总线驱动程序为各种总线提供与设备无关的I/O总线服务,比如IEEE 1394,PCI,USB总线驱动.微软已经为Windows操作系统提供了各个总线的驱动程序。总线驱动程序已经包含在操作系统里了,用户不必安装。一个总线驱动程序负责以下的工作:
枚举总线上的设备;
向操作系统报告总线上的动态事件;
响应即插即用和电源管理的I/O请求;
提供总线的多路存取(对于一些总线);
管理总线上的设备;
功能驱动程序
功能驱动程序是物理设备的主要驱动程序,它实现设备的具体功能,一般由设备的生产商来编写。功能驱动程序的主要功能是:
提供对设备的操作接口;
操作对设备的读写;
管理设备的电源策略;
过滤驱动程序
过滤驱动程序是一个可选项,当一个用户需要改变或新添一些功能到一个设备、一类设备或一种总线时,就可以编写一个过滤驱动程序。在设备栈里,过滤驱动程序 安装在一个或几个设备驱动程序的上面或下面。过滤驱动程序拦截对具体设备、类设备、总线的请求,做相应的处理,以改变设备的行为或添加新的功能。但过滤驱 动程序只处理那些它所关心的I/O请求,对于其他的请求可以交给其他的驱动程序来处理,这样可以非常灵活改变设备的行为,至少用户会这样看。比如:
一个USB键盘的上层过滤驱动程序可以强制执行附加的安全检查。
一个鼠标的低层过滤驱动程序,通过对鼠标移动的数据做非线性的转换,可以得到一个有加速效果的鼠标轨迹。
过滤驱动的层次十分灵活,也可在功能驱动的上面或下面.在上面称为上层过滤驱动(upper filter),在下面称为下层过滤驱动(lower filter).
功能驱动程序的组成
功能驱动程序可由driver/minidriver成对 组成.如端口驱动/微端口驱动.(port/miniport),类驱动/微类驱动(class/minicalss) 组成. minidriver指的便是miniport或miniclass 驱动,以dll的方式提供.只处理与硬件设备特殊的操作。通常由用户提供.类驱动和端口驱动由microsoft 提供.系统已经自带.因此我们所说的微驱动(minidriver),要么为微类驱动,要么为微端口驱动.主要的不同在于在上层的驱动是类驱动还是端口驱动.
1. 功能驱动程序由类驱动程序(class driver)和微型驱动程序(minicalss)组成。类驱动程序实现了某一类设备的常用操作,由微软提供,驱动程序的开发者可以只编写 非常小的微型驱动程序,去处理具体设备特殊的操作,而对于其他大量的常规操作,可以调用该类的类驱动程序,这也是WDM驱动程序的优点之一。
微软提供的类驱动程序处理常用的系统任务,比如,即插即用功能和电源管理。类驱动程序保证了操作系统在处理类似的任务时的一致性,从而提高了系统的稳定性。
设备生产商提供微型驱动程序,以实现自己设备的特殊功能,同时调用合适的类驱动程序完成其他的通用工作。将大量的标准操作的代码通过各种类驱动程序来实现,并集成在操作系统中,这样的方式可以有效的减少具体设备的微型驱动程序的大小,也就减小了程序出错的可能。
什么是类驱动和微型驱动?
Class Driver 和 Minidriver 的定义
Class Driver是由微软提供的一种中间驱动(或称媒介驱动),用来在硬件厂商提供的Mini Driver和操作系统之间提供一个简单的接口。
Mini Driver是一个硬件相关的DLL,它通过函数调用的方式,使用微软提供的Class Driver来完成大部分动作,它只提供和设备紧密相关的控制。
微驱动代表了总线驱动层上的硬件功能驱动的一部分.它通过总线驱动和硬件设备进行通信.它通常和总线驱动,一个或多个类驱动绑定在一起. 微驱动通过类驱动提供的设备对象,来代表一种类型的逻辑设备.它接收来自类驱动的IRP,并把它发送给总线驱动.
既然我们已经有了类驱动/微驱动,不就可以很好地进行驱动开发了吗?为什么又多了一个端口驱动(port driver)呢.
其原因为:CASS DRIVER是针对几大类设备的驱动,比如存储设备驱动,就可以通过一个CLASS DRIVER来统一管理,完成一些这类设备共有的操作,主要是与设备无关的操作.但类的下面还有许多细分的子类设备,他们的操作又有很大不同.如存储设备类,包括硬盘,光盘,软盘,U盘.如果只用一个类驱动来完成,那么将非常复杂.于是把每个子类设备的共同操作写到class 类驱动中,再为子类设备做个驱动,提供对子类设备操作的特殊功能,它便是Port driver.
端口驱动通常包括mini port 驱动.它主要的功能如下:
1. 对wdm 数据流进行过滤.
2. 为系统提供公用的接口.
3. 处理系统的IO请求,并通过Mini port 驱动的函数回调表,也让miniport 驱动串行处理.
4. 提供miniport 驱动需要的函数库.
端口驱动掩藏了许多系统的细节.而微端口驱动(miniport) 掩藏了许多硬件的细节.不管系统如何改变, 端口驱动对微端口驱动的接口基本保持不改变.从而使微端口驱动保持了很大的平台自立性.
端口驱动在驱动堆栈中层次:在类驱动的下面.
微端口驱动(miniport):
微端口驱动也代表了总线驱动层上的硬件功能驱动的一部分.它有一个单一的驱动接口,DriverEntry,向端口驱动注册一个函数调用表,这个函数调用表为微端口驱动的上层接口. 微端口驱动在端口驱动的下面,对微端口驱动的全部调用通过端口驱动的下层接口,调用微端口驱动
微端口驱动和端口驱动的关系.
通常我们还会看到有适配器驱动(adapter driver), 端口类驱动(port class driver).
什么是适配器驱动(adapter driver)?
适配器驱动为多个miniport驱动的容器.是一个独立的驱动文件,由多个微驱动组成,其它代码包括一个DriverEntry 入口和初始化操作.
什么是端口类驱动(port class driver)?
端口类驱动为多个port驱动的容器.每个端口驱动实现不同的硬件功能.以下为端口类驱动, 适配器驱动和端口的关系.