老程序员做新方向,老树发新芽,作为菜鸟的我,写点心得,用以记录并与同行交流
1对一些概念的理解:
KMDF与UMDF。两者的框架,及使用VS生成的初始代码基本相同,只有所包含的头文件不同,链接的系统库不同,最终生成的文件分别为.sys和.dll。因为框架完全相同,相互移植应该比较容易。
UMDF驱动运行在用户空间,调试相对容易,程序崩溃时也不至于对系统影响太大。所以只要能实现,应该首选使用UMDF框架。
虽说UMDF框架运行在用户空间,但也不是说所有WIN32应用程序可以使用的API都能正常工作。本人遇到过调用WMI组件在UMDF驱动中编译失败的问题,比较有趣的是使用C++调用时编译失败,但使用C文件调用时就正常。
 
上手
无论什么时候,微软提供的例子都是最好的学习材料,而且某些例子本身就已经能够工作的非常出色。本人曾经使用其中提供的键盘过滤驱动,只修改了安装文件中的设备路径,就可以正常安装,稳定工作。所以当要开发一个驱动时,最快捷的方法是找到最接近其功能的例子,拿它来修改。以下所记录的内容都基于一个例子,或者使用WDK的模板创建的驱动框架。
 
INF文件及安装
INF文件中最重要的是硬件编号,即[Standard.NT$ARCH$]所指定的内容。这里设定的硬件编号与实际安装时使用的硬件编号一定要相同。否则安装会失败。
如果是设备管理器能直接看到的设备,如果一个ACPI设备,在设备管理器中安装就可以。如果我们开发的设备驱动没有对应的硬件设备结点,就需要使用devcon来安装,该程序会创建硬件设备结点,并安装驱动。devcon可以在WDK的安装目录中找到。使用方法:
devcon.exe inf文件名称   硬件设备结点(即inf文件中设置的结点)
例如,如果设备驱动的INF文件中有如下片段:
[Standard.NT$ARCH$]
%mydriver.DeviceDesc%=mydriver_Device, Root\MyDriver
则devcon的用法为:devcon.exe install  xxx.inf   Root\MyDriver
 
在测试阶段,因为我们的驱动没有获得微软提供的签名,需要在系统中开启测试签名才能正常安装,某些驱动甚至需要将驱动文件中的测试签名证书安装到系统信任的证书目录中。开启测试签名的方法:bcdedit /set testsigining on
 
WHCK测试
如果只是单纯的学习WDK驱动开发,可以不做WHCK测试,但如果是做产品,WHCK是必须要做的,需要注意的几点:
1)server必须是 server2008 R2, server2012, server2016等的英文版。其它更新的server版本是否可用不清楚,但英文版本是必须的。
2)安装server时注意不要安装标准版,它没有桌面,只有命令行,使用不便,至于基于它能否运行WHCK server,还真没有试过。
3)如果一时找不到英文版本也没有关系,安装完,将界面改成英文资源。
并修改注册表以将系统默认语言改为英文。
将HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language
下面InstallLanguage的值改为0409。如果还有问题,可以把同级的跟Language相关的注册表值都改为:0409
4)最好使用真实机器安装server,来运行WHCK服务器端。因为WHCK运行时间很长,可能需要几天。放在开发机上一不小心关掉,就麻烦了。我试过在vmware中运行server, WHCK客户端连不上。在服务端看不到测试机。
5)WHCK测试环境bug很多,需要问题不要心急,要多试。不行就重启测试机,服务一般不需要重启,实在没办法重启它也是一种方法。
6)可以在开发机上安装whck的studio,用来连接到服务器,执行测试用例,而不需要登录到服务器,比较方便。
 
指定驱动的类型
在调用WdfDeviceCreate之前调用:WdfDeviceInitSetDeviceType来设置驱动自身的类型,如:
WdfDeviceInitSetDeviceType(DeviceInit, FILE_DEVICE_ACPI); 将其设置为一个基于ACPI的驱动。
如果我们不依赖于其它总线,就可以不调用这个函数。如果设置的类型不对就不能正常安装。如果是过滤驱动,在调用它之前还需要调用WdfFdoInitSetFilter来申明自己是过滤驱动。
驱动中使用事件
UMDF驱动中可以直接使用CreateEvent等用户空间的API,这里不再赘述。KMDF中需要使用KeInitializeEvent来初始化一个Event,  KeWaitForSingleObject来等待。KePulseEvent来释放等待中的事件。
 
驱动中使用延时
KMDF驱动中使用KeDelayExecutionThread来做延时,需要注意的是:其时间单位是100纳秒。如果延时1毫秒需要使用的值为:10000。而且有一个变态的设计:我们传入的值如果为负数,即表示需要等待的时间,如果为正数,则表示需要等待到的时间,即如果使用正数,就需要读出当前时间,加上要等待的时间以后再传给KeDelayExecutionThread。相信还是使用负数比较方便。
驱动相互调用
两个KMDF驱动调用比较方便,在A驱动中WdfDeviceCreate之前调用WdfDeviceInitAssignName函数来为自己申明一个名字。如:
    DECLARE_CONST_UNICODE_STRING(devName, L"\\Device\\MyTestDevice");
    status = WdfDeviceInitAssignName(DeviceInit, &devName);
这样在B驱动中就可以使用IoGetDeviceObjectPointer来获取驱动A的相关信息,进而调用IoCallDriver来发送Iocontrol进行数据交互。
 
中断级别(IRQ LEVEL)
相比应用开发,KMDF驱动开发有一个比较麻烦的问题是中断级别。同样的函数在不同的地方调用效果不一定相同。当函数报错,发生崩溃等问题时查看微软的帮助文档,了解中断级别对该函数的影响,及当前代码运行在什么样的中断级别上。
 

WDK驱动开发点滴的更多相关文章

  1. wdk驱动开发的特点

    本文介绍WDK开发的一些特点.与应用层开发的差异性,不能混为一谈. 一.函数的调用点 在内核编程中,一个函数往往有多个调用点,而应用层中一个函数一般只在main里面有调用点.内核函数调用点一般在: 1 ...

  2. 9030PCI CAN驱动开发点滴

    1.配置EEPROM. 使用PlxMon打开9030,基本修改Spacex(0,1,2,3), Chip selectx(0,1,2,3), 中断状态INTCSR(0x74), 其他(0x78),详细 ...

  3. VS2013+WDK8.1 驱动开发环境配置

    Windows Driver Kit 是一种完全集成的驱动程序开发工具包,它包含 WinDDK 用于测试 Windows 驱动器的可靠性和稳定性,本次实验使用的是 WDK8.1 驱动开发工具包,该工具 ...

  4. 驱动开发 - WDK 调试及 SVN 环境搭建

    由于从公司辞职了,所以以前在公司里搭建的驱动开发环境也就 Game Over 了, 同样由于那环境是很久以前搭建的,自己也有很多记不清楚的地方了, 而且其中还是有很多需要注意的地方的,所以在这里顺便做 ...

  5. Windows驱动开发工具 WDK 学习笔记(1)

    目标:能够把电脑当作一个集成有高性能处理器的开发板用起来,当然,还自带了一个高级的操作系统Windows(必须的).总之,就是在一个带了操作系统的高性能开发板上的驱动程序开发. 性质:纯属业余爱好 1 ...

  6. VS2017搭建驱动开发环境WDK

    先安装VS2017,然后在安装WDK,WDK会自动关联到VS2017中,不用你任何操作,自动在新建项目中可以找到驱动开发. 如果以上安装完成后,在VS2017中新建项目中没有发现WDK,那么需要进行修 ...

  7. Windows驱动开发VS2012 DDK/WDK的环境配置

    [开发Windows驱动的配置是很必要的,下文将详细介绍VS2012如何配置驱动开发环境] [转载] 以下部分内容是转载博客:http://blog.csdn.net/huangxy10/articl ...

  8. 【hyddd驱动开发学习】DDK与WDK

    最近尝试去了解WINDOWS下的驱动开发,现在总结一下最近看到的资料. 1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK ...

  9. 2013-6-2 [转载自CSDN]如何入门Windows系统下驱动开发

    [序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概 ...

随机推荐

  1. docker 搭建本地私有仓库

    1.使用registry镜像创建私有仓库 安装docker后,可以通过官方提供的 registry 镜像来简单搭建一套本地私有仓库环境: docker run -d -p : registry: 这将 ...

  2. 3DGIS+BIM集成与智慧城市应用

    ZTMap3D是基于网络的三维地理信息系统平台软件,利用 ZTMap3D能够实现三维地理信息和虚拟现实,是数字化地球和数字化城市建设的基础平台. BIM(building information mo ...

  3. Python学习笔记.基础一

    Python 语言:解释型.交互式.面向对象.   Python源代码遵循GPL协议   Python标识符 在python里,标识符有字母.数字.下划线组成. 在python中,所有标识符可以包括英 ...

  4. Ajax的封装,以及利用jquery的ajax获取天气预报

    1.Ajax的封装 function ajax(type,url,param,sync,datetype,callback){//第一个参数是获取数据的类型,第二个参数是传入open的url,第三个是 ...

  5. Vue.js组件嵌套和template外用

    Vue.extend组件的嵌套和template外用 组件嵌套分为全局组件嵌套和局部组件嵌套 组件嵌套需要将子元素写在父元素内 子组件必须在父组件中注册之后才能在父组件的模板中使用 全局组件嵌套 Vu ...

  6. 数字逻辑与EDA设计

    目录 第一章 数字逻辑基础 1.1数制与码制★★★ 数制 码制 1.2基本及常用的逻辑运算★★ 1.2逻辑函数表示方法★★ 1.3逻辑函数的化简★★★ 1.4常用74HC系列门电路芯片★ 第二章 组合 ...

  7. 启动崩盘!IDEA 2020 无法启动的解决办法|赠送 IDEA 2020 新功能

    今天早上看到 IDEA 可以升级新版本,想着体验一下新功能,点击升级,然后全部项目工程无法打开. 报错信息如下: Cannot execute command No project found to ...

  8. JavaScript每日学习日记(0)

    8.10.2019 1.JavaScript能改变HTML内容.属性.样式,能隐藏或显示HTML元素. 2.JavaScript函数可以任意数量被放置在<body>.<head> ...

  9. C++ 人脸识别系统的浅理解

    机器学习 机器学习的目的是把数据转换成信息. 机器学习通过从数据里提取规则或模式来把数据转成信息. 人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸. 每个节点的正确识别率很高,但正确 ...

  10. WTM 3.5发布,VUE来了!

    千呼万唤中,WTM的Vue前后端分离版本终于和大家见面了,我曾经跟群里1000多位用户保证过Vue版本会在春天到来,吹过的牛逼总算是圆上了. WTM一如既往地追求最大程度提高生产效率,所以内置的代码生 ...