1.概述  引入了全新的WDM (Win32 Driver Model)的驱动程序架构,说是新技术,其实早在1997年Microsoft就提出了该项技术并在Windows 98中得到了充分的应用,换句话说,Windows 98也支持WDM。这样WDM就成为了一个跨平台的驱动程序模型不仅如此WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行。 2.WDM设备驱动程序的特点和原理2.1通用驱动程序对基本上一样的硬件,因为他们共享一个总线或完成类似的任务,设备驱动程序可以使用这些标准的驱动程序功能,使公共总线的共享容易,且更容易写出新的驱动程序,总线驱动程序,如USB、1394,和类驱动程序。(1)Win32程序接口: 可以使用Win32函数像访问文件那样访问设备CreateFile() 、Closehandle()、ReadFile()、WriteFile()、DeviceIoControl()用于发出特殊请求,可发送数据给驱动和从驱动得到数据,IOCTL代码可以是预先定义的也可是自己定义的。(2)创建设备 大多数WDM设备对象都是在PnP管理器中调用AddDevice入口时创建,这个PnP 例程在插入新设备和安装Inf文件时被调用,此后一系列的PnP IRP被发送到驱动程序,指示设备应如何启动和查询它的功能2.2WDM-的工作原理WDM是在NT 4.0驱动程序结构上发展起来的,所以它与NT 4.0驱动程序极为相似 ,但是它却有了本质上的提高,比如它支持USB、IEEE 1394、ACPI等全新的硬件标准。 虽然Windows 98与Windows 2000都支持WDM,可是并不意味着Windows 98下的VxD可以在 Windows 2000下运行,而NT下的WDM却可以在Windows 98下运行。不过原先准备在两个平台上同时运行需要编写两个截然不同的驱动程序,而现在只需要编写一个WDM驱动程序就 可以了。同NT 4.0驱动程序一样,WDM驱动程序也是分层的,即不同层上的驱动程序有着不同的优先权,而Windows 9x下的VxD则没有此结构。另外,WDM还引入了功能设备对象 FDO(functional device object)与物理设备对象PDO(physical device object)两 个新概念来描述硬件,一个PDO代表一个真实硬件,在驱动程序看来则是一个FDO 。    另外值得注意的是,一个硬件只允许有一个PDO,但却可以拥有多个FDO,而在驱动程序中我们不是直接操作硬件而是操作相应的PDO与FDO。在Ring-3与Ring-0通讯方面,操作系统为每一个用户请求打包成一个IRP(IO Request Packet)结构,将其发送至驱动程序并通过识别IRP中的PDO来识别是发送给哪一个设备的。另外,在驱动程序的加载方面WDM既不靠驱动程序名称也不靠一个具有某种特殊意义的ID,而是依靠一个128位的GUID来识别驱动程序(Windows下许多东西都是靠此进行识别的)。 2.3 IRP处理   I/O请求包IRP是驱动程序操作的中心,IRP是一个内核对象,它是预先定义好的数据结构,带有一组对它进行操作的I/O管理器例程,I/O管理器接受一个I/O请求,然后将它传送到合适的驱动程序栈中的最高驱动程序之前,分配并处始化一个IRP,每个I/O请求有主功能代码 2.4 IRP参数比如一个写的I/O请求转换成一个IRP时,I/O管理器填写主要的IRP首部,并构造第一个个栈单元,对写请求来讲,首部包含用户缓冲区信息,而栈单元则包含写的具体参数。如果调用另一个驱动则必须创建下一个栈单元。一个IRP到栈顶时,使用PIO_STACK_LOCATION    IoGetCurrentIrpStackLocation(       IN PIRP Irp       );IoGetCurrentIrpStackLocation returns a pointer to the caller's stack location in the given IRP。如决定需要把这个IRP沿设备栈向下传递,使用IoCopyCurrentIrpStackLocationToNext or IoSkipCurrentIrpStackLocation简单的将内容复制到下一个单元,如果要更改下一个栈单元,要使用LOCATION    IoGetNextIrpStackLocation(IN PIRP Irp );IoGetNextIrpStackLocation gives a higher level driver access to the next-lower driver's I/O stack location in an IRP so the caller can set it up for the lower driver.可使用IoCallDriver调用下一个驱动程序,当最低一层的驱动处理玩后调用IoCompleteRequest,IRP再向上传递返回用户,当IRP向上传递时也可以每个驱动有机会再处理它,每个驱动要设置IoSetCompletionRoutine挂接一个例程 ,一个驱动不一定要沿着设备栈向下传递IRP,如果自己能处理就就使用IoCompleteRequest完成IrP2.5 设备接口用户态使用Win32 CreateFile访问驱动程序,dwShareMode为0时来请求独占内核对象在设备对象DEVICE_OBJECT结构中存储设备的信息,对于与设备的每个交互,相关的DEVICE_OBJECT被传递给驱动的回调例程。,但是开发者可以扩展设备结构,称为设备扩展在PnP IRP中我们加载设备NTSTATUS Wdm1AddDevice(      IN PDRIVER_OBJECT DriverObject,指向驱动程序的指针      IN PDEVICE_OBJECT pdo指向物理设备的指针){      DebugPrint("AddDevice"); status = IoCreateDevice (DriverObject,创建设备           sizeof(WDM1_DEVICE_EXTENSION),           NULL,      // No Name           FILE_DEVICE_UNKNOWN,           0,           FALSE,      // Not exclusive,TRUE为独占           &fdo返回的新设备对象);     if( !NT_SUCCESS(status)           return status;IoAttachDeviceToDeviceStack(fdo,pdo);与设备栈挂接2.6 删除设备  NTSTATUS Wdm1Pnp(      IN PDEVICE_OBJECT fdo,                             IN PIRP Irp)PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);     ULONG MinorFunction = IrpStack->MinorFunction;     if( MinorFunction==IRP_MN_REMOVE_DEVICE)     {           DebugPrint("PnP RemoveDevice");            // disable device interface           IoSetDeviceInterfaceState(&dx->ifSymLinkName, FALSE);           RtlFreeUnicodeString(&dx->ifSymLinkName);           // unattach from stack从设备栈脱离           if (dx->NextStackDevice)                 IoDetachDevice(dx->NextStackDevice);           // delete our fdo删除设备           IoDeleteDevice(fdo);      }CreateFile  IRP_MJ_Create   WriteFile  MJ_WRITECloseHandle  MJ_CLOSE      DeviceIoControl MJ_DEVICEIOCONTROLReadFile MJ_CLOSE所有的分发例程都有相同的函数原型,均需传递一个设备对象的指针和IRP,IRP由IRP首部和一系列的栈单元组成,每个栈单元是一个IO_STACK_LOCATION结构,首部和栈单元指出要作的动作 ,栈中有主要的重要参数如MajorFunction和MinorFunction,每个驱动只认识一个栈单元。2.7 即插即用驱动必须有AddDevice例程并处理各种PnP IRP:IRP_MN_START_DEVICE分配资源并启动一个设备。IRP_MN_STOP_DEVICE 停止设备进行资源重新分配。

DriverStudio3.2安装方法。把我成功安装的方法介绍给大家

我使用的是WinXP SP1+DS3.2+XP DDK+VC6.0英文版,以下为DS3.2版本的安装过程:

1.安装英文原版Visual studio 6.0,同时要记住注册环境变量。

2.安装XPDDK,安装时候注意需要将所有的组件、工具、例子等都安装(避免出现hidport.h找不到的问题);

3.安装DS3.2;

4.通过DriverStudio菜单下的DDK Build Settings子菜单启动VC,

5.用Open Workspace打开位于DS安装目录的
……/DriverWorks/Source/vdwlibs.dsw。
6. 选择VC的Build菜单,选择batch Build,在之后的对话框中选择"Select x86",然后点击Rebuld all.等待编译成功

7.打开位于……/DriverWorks/Examples/wdm/hellowdm.dsw,然后编译(用VC的编译和用DS增加的编译钮都可以)。如果你可以在其目录中找到hellowdm.sys你就成功了。

8.使用Driver wizard生成用VC编译的项目后,修改项目属性中的Link,删除ntstrsafe.lib库的包含.
重新编译驱动程序即可成功.(避免出现找不到ntstrsafe.lib库的错误)

其他环境如WIN2000下的如何安装成功等我就不太清楚了。

我把hidport.h文件和free版本的vdw_wdm.lib上传了一下。

描述:附件
附件: rar.rar (185 K) 下载次数:28 [删除]

ntstrsafe.lib每回从makefile里删掉很麻烦,用2003的DDK就有这个文件,就是说不要用XP的DDK,用2003的就可以了,2003的DDK里有XP的.

WDM 驱动程序开发相关推荐

  1. wdm设备驱动程序开发pdf_世界顶级Linux技术大师力作1000页Linux开发实战

    20世纪90年代初,Linux操作系统诞生,随着虚拟化.云计算.大数据.容器技术的出现和人工智能时代的来临,Linux 以迅雷不及掩耳之势飞速发展,占据着整个服务器行业的半壁江山,但同时也面临着巨大的 ...

  2. WDM驱动程序介绍(引)

    http://zhidao.baidu.com/question/56715021.html WDM(Windows driver model)是微软为开发人员提供的一种编写运行在Windows平台下 ...

  3. windows驱动程序开发(普及)

    1.用户态驱动驱动程序和核心态驱动程序 下图描绘出了操作系统驱动程序的相关组成部分的概貌: Windows驱动程序既可以运行在用户态也可以运行在核心模态. l         用户态的驱动程序运行在非 ...

  4. WDF模型驱动程序开发

    WDF驱动程序开发  1. 引言  设备驱动程序是硬件设备连接到计算机系统的软件接口,任何设备都必须有相应的驱动程序才能在计算机系统上正常工作.设备驱动程序的优劣直接关系到整个系统的性能和稳定性,因此 ...

  5. WinXP下虚拟摄像头驱动程序开发

    摄像头驱动程序的主要目的是通过硬件捕捉视频信号.微软公司提供了一套视频驱动的接口,可以满足这个接口的视频驱动程序.第三方厂商开发的软件,如QQ和MSN等软件,都可以通过这个接口读取视频摄像头采集的数据 ...

  6. 《Win7设备驱动程序开发》学习笔记

    <Windows 7 设备驱动程序开发>是美国Ronald D. Reeves著的一本关于WDF模型的Windows 驱动程序开发教程,适用于Win7和Win10.本文我学习该书的一些笔记 ...

  7. WinXP下虚拟摄像头驱动程序开发 1

    WinXP下虚拟摄像头驱动程序开发 摄像头驱动程序的主要目的是通过硬件捕捉视频信号.微软公司提供了一套视频驱动的接口,可以满足这个接口的视频驱动程序.第三方厂商开发的软件,如QQ和MSN等软件,都可以 ...

  8. VxWorks设备驱动程序开发指南---驱动程序的分类

    8D Spaces Reliability & Stability & Efficiency 目录视图 摘要视图 订阅 VxWorks设备驱动程序开发指南(三)---驱动程序的分类 2 ...

  9. WINDOWS下PCI接口卡WDM驱动程序的DMA编程技术1

    摘要:     本文主要讨论了在Windows环境下开发PCI接口卡DMA应用的WDM编程技术,并给出了一个应用DriverWorks和VC++开发的实例程序代码. 关键词:Windows.PCI总线 ...

最新文章

  1. 2018年下半年网络公式考试案例分析真题
  2. Jdbc创建表 利用循环添加数据 ,更新数据
  3. String | 263. Ugly Number
  4. 无线路由与无线AP有什么不同
  5. mac远程redis_Linux:使用Mac远程(局域网内)访问Ubuntu主机上的Redis服务
  6. 主元排序法c语言程序,C语言算法竞赛入门(二)---数组元素移动 、排序问题 、猴子选大王问题...
  7. C语言爬楼梯问题(递推)
  8. 计算机二级c语言改错,国家计算机二级C语言机试改错试题及答案.doc
  9. MacOS下SVN的使用
  10. 网络通信框架 HP-Socket v5.5.1,支持可靠 UDP
  11. [转]MapX 操作总结
  12. 数据库面试题---原理
  13. 玩客云pc端_玩客云下载-玩客云电脑版下载-华军软件园
  14. vue实时显示当前时间
  15. C++ 学生信息管理系统课程设计报告
  16. 苹果6电池价格_苹果8plus电池不耐用,苹果8p换电池价格
  17. 与新晋图灵奖得主的虚拟对话
  18. Python 800 道习题 (°ー°〃) 测试你学废了嘛
  19. Python scrapy环境搭建
  20. 一步一步学ActionScript 2.0(六)

热门文章

  1. iocomp ActiveX/VCL各版本大比拼之Crack
  2. 整理并记录几种运算放大器
  3. DFS深度优先搜索算法(适合初学者)
  4. 谷歌优化效果怎么样?外贸如何做好谷歌SEO优化排名?
  5. element组件树形控件el-tree点击展开节点,节点重影
  6. 2017西安网络赛B_Coin
  7. SQL注入攻击的原理、分类和防御方法
  8. Centos7.2部署HOR2.2(基于K8S集群的容器应用整合)
  9. 【机器学习|数学基础】Mathematics for Machine Learning系列之矩阵理论(14):向量范数及其性质
  10. 怎么查忘仙服务器信息,忘仙怎么跨服战斗 跨服玩法介绍[多图]