WDM 驱动程序开发[通俗易懂]

WDM 驱动程序开发[通俗易懂]1.概述 引入了全新的WDM(Win32DriverModel)的驱动程序架构,说是新技术,其实早在1997年Microsoft就提出了该项技术并在Windows98中得到了充分的应用,换句话说,Windows98也支持WDM。这样WDM就成为了一个跨平台的驱动程序模型不仅如此WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行。2.WDM设备驱动程序的特

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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上传了一下。

描述:附件
附件: WDM 驱动程序开发[通俗易懂] rar.rar (185 K) 下载次数:28 [删除]

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179500.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • kettle工具的介绍和使用

    kettle工具的介绍和使用kettle详解(数据抽取、转换、装载)原文地址链接:https://blog.csdn.net/qq_35731570/article/details/71123413文件资源库模式的调度命令:job:$kitchen路径-file=$job路径kitchen.sh-file=/opt/dpbs/kettlefile/pan_quality_indicator….

    2022年10月16日
  • vue父组件操作子组件的方法_vue父组件获取子组件数据

    vue父组件操作子组件的方法_vue父组件获取子组件数据父组件和子组件我们经常分不清什么是父组件,什么是子组件。现在来简单总结下:我们将某段代码封装成一个组件,而这个组件又在另一个组件中引入,而引入该封装的组件的文件叫做父组件,被引入的组件叫做子组件。具

  • 无人驾驶汽车毫米波雷达_无人驾驶雷达

    无人驾驶汽车毫米波雷达_无人驾驶雷达在上一次分享中,我介绍了毫米波雷达的原理、数据特性及优缺点。毫米波雷达的低环境敏感和低成本的特性使得其在ADAS和自动驾驶领域得到了广泛的应用。今天要介绍的是一款极其常见的传感器——超声波雷达。如果你觉得超声波雷达有些陌生,那么它还有一个更通俗的名字——倒车雷达。在倒车入库,慢慢挪动车子的过程中,在驾驶室内能听到”滴滴滴“的声音,这些声音就是根据超声波雷达的检测距离给司机…

  • Qt 之自定义搜索框

    Qt 之自定义搜索框简述关于搜索框,大家都经常接触。例如:浏览器搜索、Windows资源管理器搜索等。当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定。方案一:调用QLineEdit现有接口voidaddAction(QAction*action,ActionPositionposition)在QLineEdit的前/后添加部件,ActionPosition表示部件所在方位。QAction

  • 数据挖掘在电子商务中的应用

    数据挖掘在电子商务中的应用如何对大量信息进行有效组织利用,使用户能够从大量繁杂的信息中找出真正有价值的信息和知识,帮助企业制定更好的营销策略。信息处理技术有了新的应用研究课题——数据挖掘。 1.数据挖掘在电子商务中的作用  数据挖掘技术之所以可以服务电子商务,是因为它能够挖掘出活动过程中的潜在信息以指导电子商务营销活动。在电子商务中其作用有4个方面:  (1)挖掘客户活动规律,针对性的在电子商务平台下以提供…

  • java中scanner语句的意思,在java中这句语言“import java.util.Scanner;”是什么意思

    java中scanner语句的意思,在java中这句语言“import java.util.Scanner;”是什么意思在java中这句语言“importjava.util.Scanner;”是什么意思关注:135答案:2手机版解决时间2021-02-0109:07提问者葃日懙妳2021-01-3121:34在java中这句语言“importjava.util.Scanner;”是什么意思最佳答案二级知识专家白胡子大佬2021-01-3122:43一个可以使用正则表达式来解析基本类型和字符串的简…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号