搞Windows驱动开发是一件苦楚的作业,特别是初学Windows驱动开发。有的人觉得Windows驱动开发便是把开发包WDK下载下来,然后只需把握了C/C++言语,接下来无非便是类库调来调去,像调用MFC、QT之类的库那样,看着书和MSDN上的文档来就行了。等真实触摸今后才发现底子不是那么一回事,苦楚源于以下几点:
苦楚一:中文材料太少
讲Windows驱动开发的,无论是中文书本仍是网上的中文材料,都很少,手把手从零到通晓的更是不必说了。仅有的少量中文材料,有的还比较旧,讲的是DDK、NT式驱动,新手拿着WDK8.1、WDK10面临Win8、Win10体系很难跟着学习,并且现在的WDK,在WDM上又呈现了了WDF,而WDF又分KMDF(内核形式驱动)和UMDF(用户形式驱动),关于UMDF(用户形式驱动)中文材料就更少了。并且驱动开发不像运用开发,需求先对操作体系原理有必定了解,否则遇到“I/O管理器”、“输入输出恳求包”、“软件中止”、“符号链接”、”差遣函数“等名词和概念都不知所云,是步履维艰的。
解决方法:
①其实MSDN上现已供给了许多的文档和示例程序,对KMDF、UMDF等进行了详细的解说,乃至还供给了手把手教你来的视频教程,惋惜它们都是英文的,关于我等英语欠好的程序员来说真是坐车不买票——白费。最近越来越觉得英语欠好是阻止一个程序员前进最大的拦路虎,咱们不谈什么算法,不谈什么数学功底了,首先要成为一个合格的码农,需求娴熟运用各种编程言语和对应的各种东西库,而大部分的库都只需英文文档,不能流通阅览这些文档的话,步履维艰。在成为了合格的码农,能娴熟运用各种现成的东西库搭积木般的开宣布运用程序后,才干去谈各种算法,各种数学知识的代入,才干去谈怎么从一个码农晋级为软件工程师。明显,当时摆在我面前最火急的问题是怎么成为一个合格的码农,先养活自己,再去考虑怎么为社会主义做奉献,怎么推进人类科技前进。学习英语的确应该从速提上日程并当即履行、坚持履行了。英语好的人真的是把WDK拿来就像用MFC那样轻松,看着文档和示例程序,那些个API调来调去,一个完好的驱动程序就出来了。这不是吹嘘,我之前在一家公司作业的时分,公司有个项目的一个模块需求在Ring0上完成,需求编写Windows内核驱动,可是公司里没有一个人会,所以老大将这个模块交给了他的一个朋友去做。他的这个朋友是中国人,在美国微软总部作业,英语水平怎么样就不必说了,总归人家曾经从来没搞过驱动开发,看了文档和示例代码后,运用3天的业余时间就完成了这个模块,拿到了15K RMB的酬劳,着实让人敬服,让人仰慕。真的,学好英语,不说“传闻写”,只需能流通阅览各种英文技能材料,完全是另一个国际,学什么、做什么都称心如意。
MSDN上的驱动开发材料进口:https://msdn.microsoft.com/zh-cn/windows/hardware
MSDN上手把手教你来的视频教程:https://msdn.microsoft.com/zh-cn/windows/hardware/gg454522
②捉住仅有的几本中文书本,细细研读。关于Windows驱动开发的中文书本大概有那么几本:
《Windows驱动开发技能详解》(强烈推荐先看这本)
《WindowsWDM设备驱动程序开发攻略》(比较老了,2000年出书的,以win98、win2000为方针体系)
《Windows设备驱动程序WDF开发》(为数不多讲WDF的)
《Windows 7设备驱动程序开发》(为数不多讲WDF的,且比较新,这本书的英文版是2010年出书的,中文译版是2012年出书的)
《竹林蹊径:浅显易懂windows驱动开发》
《寒江独钓:Windows内核安全编程》
《天书夜读:从汇编言语到Windows内核编程》
《Windows内核安全与驱动开发》(是《天书夜读》和《寒江独钓》的合订本以及晋级版)
后边的这四本其实不太合适作为入门书本,而合适作为进阶书本,对一些根底的概念和原理的解说没有《Windows驱动开发技能详解》那么多
苦楚二:开发东西链欠好用
关于我等刚学编程时用的便是VisualStudio以及各种智能提示智能感知的插件,乃至还有代码生成器的辅佐的程序员来说,习惯了VisualStudio傻瓜化的全部,代码能够主动生成,窗体运用程序能够拖控件,乃至连网页都能拖控件。很难承受只需文本编辑器和命令行东西的开发环境,许多时分连代码编辑器不能智能提示都无法忍受,更不说手动调用cl.exe link.exe,写起代码来就像有一万只蚂蚁在身上爬。
在之前很长的一段时间里,VC6.0和VisualStudio里是没有创立驱动项目的选项的,更没有直接由IDE生成的HelloWorld,假如不想手动cl.exe link.exe,假如想在IDE中写代码,需求自己建一个空项目,然后手动装备编译器指令、链接器指令、包含目录、库目录等等,然后把书上的HelloWorld仿制过来,然后或许还会遇到各种问题。生成好驱动程序文件后,还要手动拷贝到虚拟机中,凭借东西或inf文件手动装置,然后要改体系装备,进入内核调试形式,然后要设置调试接口,比方运用COM串口调试的话要在虚拟机上设置,把COM串口映射到主机的命名管道,然后还不能在VC中调试,只能用Windbg来调试。总归每修正一下代码,需求手艺进行许多过程才干开端调试,十分费事。并且即使照着网上或书上的过程来装备,在不同的环境下也会遇到各种古怪的问题,搞起来较为头疼。
解决方法:
①有个名为VisualDDK的第三方软件,使得这个作业方便了许多。VisualDDK装好后会给VisualStudio装置一个插件,使得在VisualStudio中能够经过这个插件新建驱动项目,并且自带HelloWorld,然后把VisualDDK Monitor装到虚拟机中,两头装备一下,接下来只需在VisualStudio这边生成驱动文件,VisualDDK会主动传给虚拟机中的体系进行装置,并且能够直接在VisualStudio中下断点调试了。不过这个软件在装置和装备过程中,也需求不少过程,有时分也会呈现一些装备不对的问题,偶然也略感头疼,且稳定性和兼容性不是十分好。此方法适用于VisualStudio2010及以下版别,WDK7.1及以下版别。关于更高的版别,不主张用VisualDDK,由于能够持续往下看,下面有更激动人心的方法。
VisualDDK官网:http://visualddk.sysprogs.org/
VS2010+VMWare8+VisualDDK1.5.6装备教程:http://techird.blog.163.com/blog/static/1215640362011112385241568/
②激动人心的便是,从VisualStudio2012开端,从WDK8.0开端,微软在里面整合了一套类似VisualDDK但比VisualDDK好用许多的东西。从那今后,开发Windows驱动程序就和开发Windows运用程序相同方便了,只需在虚拟机中装置一个EXE,然后在VisualStudio中输入它的IP、用户名、暗码就OK了,接下来你只需新建一个WDK项目,点生成,VisualStudio会主动把驱动文件传给虚拟机中的体系并主动装置,然后点调试,就能在VisualStudio中单步调试了。是不是爽爆了,并且装备和设置都不杂乱,MSDN上还有手把手教你装备的高清视频教程!
详细能够看我写的另一篇文章:
《Win8.1+VS2013+WDK8.1+VirtualBox or VMware驱动开发环境装备》:http://blog.csdn.net/charlessimonyi/article/details/50904956
苦楚三:没有库可用
假如有一天老板叫你开发一个软件,答应你运用你拿手的恣意一门言语,C/C++/C#/JAVA/Python等。可是附加了一个条件:不能运用任何第三方库,不能运用规范库!你有什么感触。What!规范库都不能用?那还写个毛。是的,没错,开发Windows驱动程序,简直什么库都用不了,包含规范库。由于咱们平常常用的第三方库或规范库,它的完成其实都是调用体系API,在Windows上调用的是Window API,即uer32.dll、kernel32.dll、gdi32.dll等等供给的API函数。可是这些API函数归于运用层API,无法在驱动程序中运用,由于驱动程序跑在内核层。所以只需一个库的完成上调用了体系API,就无法在驱动程序中运用。少量库仍是能够运用的,比方math.h中的各种数值核算函数。不过仅剩的可用的库太少了,许多时分你都需求重新创造轮子。乃至连C言语中的malloc、free,C++中的new、delete,你都需求自己去完成。
解决方法:
①自己创造轮子就自己创造轮子,尽管没有现成库可用,但有内核层下的体系API可用,许多和运用层的API很类似,你想要的功用根本都能够经过这些API完成。
②咬咬牙,把苦水往肚子里咽。搞驱动开发的人很少,苦尽甘(qian)来