老程序员做新方向,老树发新芽,作为菜鸟的我,写点心得,用以记录并与同行交流
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. C# 存储相同键多个值的Dictionary

    涉及到两个问题: 一.访问磁盘中文件夹.文件夹下面的文件夹 先看一下磁盘文件夹结构 C盘下面有个根文件夹SaveFile,SaveFIle下面有两个子文件夹分别为,2018.2019, 子文件下201 ...

  2. 微信小程序注册和简单配置

    微信小程序注册 1.直接搜索微信小程序,按照流程进行注册 2.如果有微信公众号,可以在公众号内部点小程序,进入注册流程 小程序中的概念 开发设置 在开发设置中获取AppID和AppSecret App ...

  3. linux 安装Mosquitto

    这篇博客讲的很好:https://www.cnblogs.com/chen1-kerr/p/7258487.html 此处简单摘抄部分内容 1.下载mosquitto安装包 源码地址:http://m ...

  4. 小白学 Python 数据分析(15):数据可视化概述

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  5. css3 scale 缩放出现 1px 问题

    问题描述 先来一段html代码 <div class="container"> <div class="parent"> <div ...

  6. 网络工程师和Linux运维工程师有什么区别?学哪个比较好?

    网络工程师和Linux运维工程师有什么区别?学哪个比较好? 机缘巧合下,我进入了一家从事vpn与系统集成的公司,很感谢公司能留下我这个非网络工程专业的毕业生,从对网络一窍不通,慢慢可以自己独立完成工作 ...

  7. Simulink仿真入门到精通(十八) TLC语言

    TLC(Target Language Compiler)是一种为转换为目标语言而存在的额解释性语言,其目的就是将模型中编译出来的rtw文件转换为目标代码(C/C++等).与M语言类似,既可以写成脚本 ...

  8. 搭建私有 Nuget 服务器教程(1)

    对于 .NET 开发者来说,nuget 是必不可少的程序包管理工具.相应地,大部分开发团队都需要在内部搭建 Nuget 服务器,以管理私有 nupkg 包.本教程所使用的 Nuget 服务器,不是微软 ...

  9. WEB应用之http协议和httpd闲聊

    什么是web?在日常生活中我们常常听到web这个词,它到底是什么呢?今天我们来聊一聊web应用http协议:相信生活在如今互联网时代的我们,http这个协议应该对我们不是很陌生吧!比如双十一双十二我们 ...

  10. react 新创建项目

    1,先创建一个文件夹用于存放项目 2,运行cmd,路径选择到你创建的文件夹内 3,  npm install -g create-react-app         create-react-app ...