老程序员做新方向,老树发新芽,作为菜鸟的我,写点心得,用以记录并与同行交流
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. Canny检测算法与实现

    1.原理 图象边缘就是图像颜色快速变化的位置,对于灰度图像来说,也就是灰度值有明显变化的位置.图像边缘信息主要集中在高频段,图像锐化或检测边缘实质就是高通滤波.数值微分可以求变化率,在图像上离散值求梯 ...

  2. Openwrt 路由器上 安装 svn server

    Openwrt 上也可以搭建 svn 服务了,这样就不用开着 ubuntu 了,省电. 在后台打开 ssh 服务,或者使用 telnet 服务,使用 putty 登录路由器. 如下图所示,这里刷的是 ...

  3. Notepad++远程连接Linux

    为方便编辑Linux上的文件,我们可以用Notepad++的NppFTP插件 工具:Notepad++.CentOS 1.通过ifconfig命令找到主机ip 2.打开Notepad++插件NppFT ...

  4. Elasticsearch数据建模笔记

    数据建模 数据建模是创建数据模型的过程 数据模型是对真实世界进行抽象描述的一种工具和方法,实现对现实世界的映射 三个过程:概念模型=>逻辑模型=>数据模型 数据模型:结合具体的数据库,在满 ...

  5. 如何使用Kibana

    目录 前言 一.安装 二.加载自定义索引 三.如何搜索数据 四.如何切换中文 五.如何使用控制台 六.可视化图表 七.使用仪表盘 前言 Kibana 是为 Elasticsearch设计的开源分析和可 ...

  6. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  7. openstack的yum源出错,配置openstack-ocata版的在线yum源,openstack的yum源配置

    真的是几经周折,终于配置好了!我做好了一键配置yum的代码,地址:https://www.cnblogs.com/guarding/p/12321702.html 首先看一下配置前的报错信息把: 需要 ...

  8. $props, $attrs,$listeners的具体使用例子

    我在这使用属性重新render饿了么ui的tree: <el-tree ref="tree" icon-class="fa fa-caret-right" ...

  9. Java 并发同步工具(转)

    转自:https://www.jianshu.com/p/e80043ac4115 在 java 1.5 中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如 CountDownLatch,Cy ...

  10. .Net Framework 工具Mpgo.exe与Ngen.exe

    首先放出官方MSDN的文档地址 Mpgo.exe 主要用于分析程序集启动时需要哪些东西,然后将信息反馈给NGen.exe 来更好的优化本机映像,使得应用程序启动更快,工作集缩小.准备发布时,用MPGO ...