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)
上一篇 2022年10月21日 下午1:16
下一篇 2022年10月21日 下午1:36


相关推荐

  • 手机版mt4平台下载下载手机版mt4_手机mt4平台下载安卓

    手机版mt4平台下载下载手机版mt4_手机mt4平台下载安卓MetaTrader4(缩写MT4)是由俄罗斯迈达克软件公司(英文名称MetaQuotesSoftwareCorp)发布的一款交易软件,可同时在电脑端和手机端使用。但是,正版手机端mt4一般要从谷歌商店下载,而GooglePlay的下载地址经常打不开。本人使用mtr软件多年,在使用方面有一些经验,现将2020年版手机mt4下载地址分享给各位网友,愿您交易如索罗斯一般行如流水!mt4下载地址:https://t00y.com/file/29212124-458672692提取码:pj265(

    2022年8月15日
    6
  • WOE信用评分卡–R语言实现

    WOE信用评分卡–R语言实现title 信用评分模型 author junjun date 2016 年 10 月 3 日 output html document nbsp nbsp 一 数据的获取与整合 nbsp 数据来源 数据来自 Kaggle cs training csv 是有 15 万条的样本数据 下图可以看到这份数据的大致情况 下载地址为 https www kaggle com c G

    2026年3月18日
    2
  • Midjourney v7的Omni-Reference:两步策略解析

    Midjourney v7的Omni-Reference:两步策略解析

    2026年3月15日
    2
  • 令牌桶算法

    令牌桶算法一 什么是令牌桶算法令牌桶算法是比较常见的限流算法之一 要点如下 所有的请求在处理之前都需要拿到一个可用的令牌才会被处理 根据限流大小 设置按照一定的速率往桶里面添加令牌 桶设置最大的放置令牌限制 当桶满时 新添加的令牌就被丢弃或者拒绝 请求到达后首先要获取令牌桶中的令牌 拿着令牌才可以进行其他的业务逻辑 处理完业务逻辑之后 将令牌直接删除 令牌有最低限额 当桶中的令牌达到最低限额的时候 请求处理完之后不会删除令牌 以此保证足够的限流

    2026年3月26日
    3
  • 数据仓库与数据挖掘的一些基本概念是_数据挖掘的实例

    数据仓库与数据挖掘的一些基本概念是_数据挖掘的实例下面内容摘自互联网并作了整理。名词:BI(BusinessIntelligence):商业智能,DW(DataWarehouse):数据仓库,详见正文Q1部分。OLTP(On-LineTrans

    2022年8月4日
    13
  • GoogLeNet 神经网络结构

    GoogLeNet 神经网络结构GoogLeNet是2014年ILSVRC冠军模型,top-5错误率6.7%,GoogLeNet做了更大胆的网络上的尝试而不像vgg继承了lenet以及alexnet的一些框架,该模型虽然有22层,但参数量只有AlexNet的1/12。GoogLeNet论文指出获得高质量模型最保险的做法就是增加模型的深度(层数)或者是其宽度(层核或者神经元数),但是一般情况下更深或更宽的网络

    2022年8月14日
    12

发表回复

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

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