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的.

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是模型,什么是模式

    模型(model)与模式(Pattern),英文显然是两个词,但是,在实际使用过程中,却是比较混乱。虽然,我还不清楚厘清这两个词的关系,对基层的数学工作者有怎样的价值,但是至少对理解什么是数学是有益处的,能够帮助我们不止是了解数学的结论,而且了解数学的思考方法。  一、模型与数学模型     (一)模型的定义:     数学辞海第5卷第109页有关于模型的定义:模型

    2022年4月6日
    29
  • 无限弹窗(bat代码 整人恶作剧)

    无限弹窗(bat代码 整人恶作剧)炸弹弹窗,是使用bat制作的一个小程序,效果就是执行程序后会一直不停地弹出窗口,用来恶作剧。下面我们就来看看详细的教程。打开文件,输入以下代码::startstartcmdgotostart点击文件,选择另存为把文件名后面加上.bat保存类型选择所有文件点击保存…

    2022年6月17日
    41
  • DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016 解决方案[通俗易懂]

    DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016 解决方案[通俗易懂]DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016 解决方案

    2022年4月23日
    169
  • 一分钟速算口诀_速算口诀表完整版

    一分钟速算口诀_速算口诀表完整版“一分钟速算口诀”:两位数相乘,在十位数相同、个位数相加等于10的情况下,如62×68=4216计算方法:6×(6+1)=42(前积),2×8=16(后积)。一分钟速算口诀中对特殊题的定理是:任意两位数乘以任意两位数,只要魏式系数为“0”所得的积,一定是两项数中的尾乘尾所得的积为后积,头乘头(其中一项头加1的和)的积为前积,两积相邻所得的积。如(1)33×46=1518(个位数相加小于10,所以十

    2022年10月23日
    0
  • 边缘检测sobel算子

    边缘检测sobel算子sobel算子-sophia_hxw-博客园http://www.cnblogs.com/sophia-hxw/p/6088035.html#1,个人理解网上查了很多资料,都说sobel

    2022年7月2日
    21
  • spring 注解验证@NotNull等使用方法「建议收藏」

    spring 注解验证@NotNull等使用方法「建议收藏」常用标签@Null被注释的元素必须为null@NotNull被注释的元素不能为null@AssertTrue被注释的元素必须为true@AssertFalse被注释的元素必须为false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(

    2022年6月13日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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