老程序员做新方向,老树发新芽,作为菜鸟的我,写点心得,用以记录并与同行交流
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. 机器学习基础——简单易懂的K邻近算法,根据邻居“找自己”

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天的文章给大家分享机器学习领域非常简单的模型--KNN,也就是K Nearest Neighbours算法,翻译过来很简单,就是K最近邻居 ...

  2. iview 踩坑之旅

    公司重构管理系统,框架定了vue,UI在element和iview之间选,element样式被吐槽丑,于是选了iview,但是,,这个坑多啊... 废话少说,罗列了iview中容易出错或者懵逼的一些地 ...

  3. seo搜索优化技巧02-seo问答推广怎么做?

    问答推广就是以用户的​‌‌角度去提问,这些问题内容就是用户搜索想要知道的.简单来说通过第三方平台站在用户的角度去帮助客户解答问题,同时附带自身的品牌和产品信息就是问答推广. 常见的问答平台有百度知道. ...

  4. 【colab pytorch】使用tensorboardcolab可视化

    import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from ...

  5. 基于 HTML + WebGL 结合 23D 的疫情地图实时大屏 PC 版

    前言 2019年12月以来,湖北省武汉市陆续发现了多例肺炎病例,现已证实为一种新型冠状病毒感染引起的急性呼吸道传染病并蔓延全国,肺炎疫情牵动人心,人们每天起来第一件事变成了关注疫情进展,期望这场天灾早 ...

  6. SpringBoot+AOP构建多数据源的切换实践

    针对微服务架构中常用的设计模块,通常我们都会需要使用到druid作为我们的数据连接池,当架构发生扩展的时候 ,通常面对的数据存储服务器也会渐渐增加,从原本的单库架构逐渐扩展为复杂的多库架构. 当在业务 ...

  7. selenium 爬boss

    # 有问题 from selenium import webdriver import time from lxml import etree class LagouSpider(object): d ...

  8. vscode C++ 程序 windows

    vscode 1.42.1 OS: windows 7 x64 1. vscode, cpp extension 本文直接跳过 vscode 安装, Cpp tools 安装 2. MinGw 安装及 ...

  9. js 实现图片的放大和缩小

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. [code]poj3349 Snowflake Snow Snowflakes

    哈希+挂链.可以用next数组挂链. ; type arr=..]of longint; var a,b:Array[..]of arr; next:Array[..]of longint; i,j, ...