WDM是英文Windows Driver Model(WDM)的缩写,中文意思是“视窗驱动程序模块”,多使用在一些声卡的驱动程序上。
Windows驱动程序模型
WDM是WINDOWS2000认证的驱动程序,WIN2000由NT发展而来,所以对于设备的支持功能有限,同时为了最大限度的保障稳定性,所以推崇WDM驱动,但同时WDM驱动也就是功能最少的。因为设备厂商开发进度以及微软的态度,可能会禁止某些功能,所以像8738和PCI128D这类声卡在WIN2000中都是不能驱动四声道的。
Windows驱动程序模型(Windows Driver Model,WDM)是Windows98和Windows2000使用的新的驱动程序设计规范。使用WDM使得硬件驱动程序更加稳定,让操作系统对硬件更加有效地控制硬件。除了定义一个驱动程序与操作系统连接的标准接口以外,WDM也指明了驱动程序应该采用的更加模块化的设计。
WDM特性
动态构造WDM驱动程序堆栈是实现即插即用设备支持的关键
模块化的WDM体系结构中灵活统一的接口,使操作系统可以动态地配置不同的驱动程序模块来支持特定的设备。一个典型的驱动程序堆栈由通用设备、协议及特定协议和特定总线的微型驱动程序联接的总线类驱动程序构成。动态构造WDM驱动程序堆栈是实现即插即用设备支持的关键。
WDM 流媒体应用程序
对于流媒体应用程序,WDM在核心态提供了快速反应的接口来处理I/O流。WDM的流接口是通过标准的WDM类接口提供出的。
WDM支持USB、IEEE 1394、ACPI等全新的硬件标准
WDM支持USB、IEEE 1394、ACPI等全新的硬件标准。而且以往在两个平台上同时运行时需要编写两个截然不同的驱动程序,现在只需要编写一个WDM驱动程序就可以了。
类驱动
类驱动是设计来控制一个硬件类别的常用、通用和基本的功能和能力的驱动程序。硬件类别有很多,例如键盘,鼠标,显示器,控制卡,视频设备,CDROM,软驱,硬盘等等。总线驱动程序
总线驱动程序是用来连接设备和计算机的控制器的驱动程序。 总线类型有周边元件扩展接口(Peripheral Component Interconnect, PCI),通用串行总线(Universal Serial Bus,USB),IEEE(Instituteof Electricaland Electronics Engineers,国际电子电气工程师协会)1394,小型计算机系统接口(Small Computer Systems Interface,SCSI),PC卡(PCMCIA)工业标准体系(Industrial Standard Architecture,ISA),扩展工业标准体系(Extended Industrial Standard Architecture,EISA),增强型集成设备电子接口(Enhanced Integrated Device Electronics,EIDE),扩展能力端口(Extended Capabilities Port,ECP)和COM端口等等。迷你驱动程序
Windows2000包括控制这些控制器连接的驱动程序。总线设备的驱动程序既有标准类驱动程序,也有迷你驱动程序和过滤器驱动程序的厂商特定实现。 迷你驱动程序与类驱动和总线驱动相接口,提供操作系统对硬件的控制和存取,它定义了硬件和类驱动间的接口,并提供对类驱动不提供的特定或专有的功能和能力的控制机制。过滤器驱动程序
过滤器驱动程序用于对设备能力限制或授予更广泛的存取,通过安装在类驱动程序的上层或下层实现。过滤器经常用来防止给设备发送不支持的命令或者用来将命令由类驱动程序的语法翻译为硬件设备要求的语法。 Windows Driver Model(WDM)架构有利于提升音效处理的效能:原来需要在影像、音效设备上的程序代码,现在可以直接包含在操作系统中,因此能更快地与硬件同步更新。Windows2000支持三种类驱动程序
数据流类驱动程序
支持数据流的高带宽传输,得到更快的数据处理速度。这个类驱动程序经常与音频端口类驱动程序结合使用,以支持实时的视频和音频。该类驱动也负责多任务时序,直接内存存取(DMA),内存优化,即插即用和I/O缓冲区管理。输入设备类驱动程序
管理多种总线(如USB)间的数据与指令语法翻译。大多数时候,本类驱动控制由用户交互接口传来的数据,如键盘,鼠标和游戏杆等。音频端口类驱动程序
支持多媒体的实时流式回放。它依靠数据流类驱动程序,直接控制硬件,该驱动程序主要使用COM1(I/O地址03F8-03FF)COM2(I/O地址02F8-02FF)</PWin32 Driver Model Win32驱动程序模型
WDM(Win32 Driver Model),即Win32驱动程序模型,是Microsoft力推的全新驱动程序模式,旨在通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性。
微型驱动程序结构
除了通用的平台服务和扩展外,WDM还实现了一个模块化的、分层次类型的微型驱动程序结构。类型驱动程序实现了支持通用总线、协议或设备类所需的功能性接口。类型驱动程序的一般特性是为逻辑设备的命令设置、协议和代码重用所需的总线接口实现标准化提供必要的条件。
基本上,WDM规范依靠一个标准化的类驱动程序来控制一类硬件的最常用和基本的功能。Windows2000为每一类硬件包括一个本地类驱动程序,然后,对应于某个特定厂商或者硬件型号的迷你驱动程序加入在类驱动中未包括的特殊或定制功能。厂商还可以更进一步地加入过滤器驱动程序来提供在类驱动的上层或底层进行的微调特性,以此来提供驱动程序本身和由硬件设备执行的任务最大的效率。在绝大多数情况下,这种设计将得到各方面均兼容于Windows2000的驱动程序,提供更好的性能,消耗更少的系统资源,并且对驱动程序大小的缩减经常达到90%。注意此处大小指的只是厂商/型号特定驱动程序,而不包括本地类驱动程序。
Win32 Driver Model Win32驱动程序模型 WDM(Win32 Driver Model),即Win32驱动程序模型,是Microsoft力推的全新驱动程序模式,旨在通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性。
微型驱动程序结构
除了通用的平台服务和扩展外,WDM还实现了一个模块化的、分层次类型的微型驱动程序结构。类型驱动程序实现了支持通用总线、协议或设备类所需的功能性接口。类型驱动程序的一般特性是为逻辑设备的命令设置、协议和代码重用所需的总线接口实现标准化提供必要的条件。
基本上,WDM规范依靠一个标准化的类驱动程序来控制一类硬件的最常用和基本的功能。Windows2000为每一类硬件包括一个本地类驱动程序,然后,对应于某个特定厂商或者硬件型号的迷你驱动程序加入在类驱动中未包括的特殊或定制功能。厂商还可以更进一步地加入过滤器驱动程序来提供在类驱动的上层或底层进行的微调特性,以此来提供驱动程序本身和由硬件设备执行的任务最大的效率。在绝大多数情况下,这种设计将得到各方面均兼容于Windows2000的驱动程序,提供更好的性能,消耗更少的系统资源,并且对驱动程序大小的缩减经常达到90%。注意此处大小指的只是厂商/型号特定驱动程序,而不包括本地类驱动程序。
下面我们来亲自实践基于Windows8与Visual Studio11的开发
Visual studio11与Windows8带来格外不同的新体验
1.启动Vs11
2.看见满目的驱动开发模板
3.选择Wdm驱动
4.创建成功以后
看见驱动开发模式的两种
5.编译Wdm驱动,并查看inf文件
;
; MyDriverMVP.inf
;
[Version]
Signature="$WINDOWS NT$"
Class=
ClassGuid=
Provider=
DriverVer=
CatalogFile=
[DestinationDirs]
DefaultDestDir = 12
[SourceDisksNames]
1 = %DiskName%,,,""
[SourceDisksFiles]
[Manufacturer]
%ManufacturerName%=Standard,NT$ARCH$
[Standard.NT$ARCH$]
[Strings]
ManufacturerName=""
ClassName=""
DiskName="MyDriverMVP Source Disk"
插入下列代码,执行WdmIo查询
#include "wdmIo.h"
#include "Ioctl.h"
/
NTSTATUS StoreCmds( PUCHAR* pCmds, ULONG* pCmdsLen, ULONG len, PVOID Buffer);
NTSTATUS RetrieveResources(IN PWDMIO_DEVICE_EXTENSION dx,
IN PCM_RESOURCE_LIST AllocatedResourcesTranslated);
void WriteByte( IN PWDMIO_DEVICE_EXTENSION dx, IN ULONG offset, IN UCHAR byte);
UCHAR ReadByte( IN PWDMIO_DEVICE_EXTENSION dx, IN ULONG offset);
BOOLEAN InterruptHandler(IN PKINTERRUPT Interrupt, IN PWDMIO_DEVICE_EXTENSION dx);
BOOLEAN RunCmdsSynch( IN PDEVICE_OBJECT fdo);
BOOLEAN RunCmds( IN PDEVICE_OBJECT fdo, IN bool CanTrace);
bool ProcessCmds( IN PWDMIO_DEVICE_EXTENSION dx,
IN PUCHAR Buffer, IN ULONG len,
OUT PUCHAR OutBuffer, IN ULONG outlen,
IN bool CanTrace
);
BOOLEAN RunWriteCmdsSynch( IN PWDMIO_DEVICE_EXTE