一、源代码编译
在微软官网上下载 WDK 开发包,里面有 WDK 编译器,链接器,配置工具,如NMAKE。然后,用记事本写 C 或 C++ 文件,编译,链接就 OK 了。
WDK 库是一定要的,否则头文件,导入库都没有,就无法编译了。至于编译器和连接器,其实就是普通的 cl.exe 和 link.exe 两个工具,和 VS 中的 VC 编译链接器是同一个。
编译的方法是:
在自己的目录如 c:\wdkdemo 中有个待编译的 wdkdemo.c ,那么需要在这个目录里加入两个文件,一个是 makefile (无后缀名)的固定文件名,内容也是固定的:
INCLUDE $(NTMAKEENV)\makefile.def
另外一个文件是 sources (无后缀名)的固定文件名,内容为:
targettype=driver
targetname=obj
sources=wdkdemo.c
这两个文件都是让nmake 工具配置用的,最终调用合适的编译器和链接器开关来编译出 sys 。
WDK包有个 build 命令行工具,当配置好了以上两个文件后。双击 build 工具,进入到 c:\wdkdemo 目录,输入命令 build 回车,然后只要 wdkdemo.c 源代码正确,就会生成 sys 文件了。
二、sys 文件安装:
在网上下载个免费的驱动安装工具,这个不难吧,一般调试用的驱动,建议在安装的时候,千万记得要选择手动模式,因为自启动模式,如果驱动有BUG ,会导致蓝屏,重启机器后,驱动因自启动又被加载,导致再次蓝屏。
三、调试
在微软官网下个 windbg ,但 windbg 需要调试机和被调试机模式,因此 windbg 最好配合 vmware 来使用。
我感觉,sys 文件编译是很麻烦的。不如编译应用程序,只要一个 VS 可以搞定大部分的事情。驱动开发需要很多关于其他工具的知识。譬如,用记事本或者NOTEPAD++编辑源代码感觉很吃力,因为 VS 没有驱动开发的项目,因此 VS 不直接支持驱动开发,当然,可以进行配置,但 VS 配置驱动是很麻烦的。另外, windbg 有很多的调试命令,当然常规的命令一般4、5个就够用了。VMWARE 的配置也是很麻烦的,当初,我自己研究了很长时间,网上虽然有教程,但都是讲得不全面,譬如要配置10个地方,网上都是只说7、8个,导致 VMWARE 配置不成功。
驱动开发还有 DRIVER STUDIO 这么一个 IDE 可以使用,另外还有 IRPTRACE ,DEVICE TREE , DEBUG VIEWER 等工具。
我开发驱动的工具是 VMWARE + VS2010 + WDK + WINDBG + WINOBJ + IRPTRACE + DEBUG VIEWER 这几个。
追问
我就是想把WDK和visual studio合在一起开发,在记事本上太吃力了,每一个字都需要自己写,这样的话不就退化到好几年之前了嘛--现在做一个小东西也需要几千的代码,这样会累死的,就像这样我的在visual studio 2008里面已经有这样的了,但是编译不出 .sys文件,我自己写的代码也不行,别人写的(网上下的)也编译不出来 你看看是什么情况,图上的是我自己机子上我搞的(原本没有)
追答
原来是这个呀。
首先,新建一个WIN32控制台工程,选择空项目。然后新建一个.cpp文件。接下去所有的项目属性不要修改,需要修改的地方如下,至于有些修改的含义,就不多说了,一说又一大堆。
VS 中配置 WDK 选项:
(假定 WDK 安装目录为 C:\WinDDK\7600.16385.1,这个是我机器上的配置)
一、C/C++
1.常规
*附加包含目录:编辑添加3个路径,分别对应WDK安装目录\INC子目录中的三个目录:crt,api,ddk。最终在附加包含目录的内容为:C:\WinDDK\7600.16385.1\inc\apiC:\WinDDK\7600.16385.1\inc\ddkC:\WinDDK\7600.16385.1\inc\crt
调试信息格式:C7兼容 /Z7
2.预处理器
*WIN32DBG_X86_WINVER=0x0501
3.代码生成
*启用最小重新生成:否
*基本运行时检查:默认值
运行库:多线程调试(/MTd)
*缓冲区安全检查:否(/GS-)
4.高级
调用约定:__stdcall (/Gz)
二、链接器
1.常规
输出文件:$(OutDir)\$(ProjectName).sys
*启用增量链接:否(/INCREMENTAL:NO)
附加库目录:编辑添加1个路径,对应WDK安装目录\LIB\WXP\I386,最终的附加库目录的内容为:C:\WinDDK\7600.16385.1\lib\wxp\i386。注意,如果是WIN7系统,子目录把 WXP 改成WIN7
2.输入
*附加依赖项:ntoskrnl.lib
*忽略所有默认库:是(/NODEFAULTLIB)
3.清单文件
清单文件:否
4.系统
子系统:本机(/SUBSYSTEM:NATIVE)
*驱动程序:驱动程序(/DRIVER)。注意,如果是WDM类型驱动,改成 WDM (/DRIVER:WDM)。
5.高级
入口点:DriverEntry
随机地址:默认值
数据执行保护(DEP):默认值
以上带 * 的意识为,内容可以根据项目的具体分化,可以有所变动。当然啦,变动,肯定是基于你对该选项的理解基础上进行变更的。譬如附加依赖项一般需要ntoskrnl.lib ,如果使用了第三方库里的函数,那需要再添加其他的 lib 库。譬如想启用缓冲区安全检查,那除了开关设置意外,必须
在附加依赖项开关加上 bufferoverflowU.lib 这个库,因为安全检查函数由 bufferoverflowU.lib 导出。
更正下我第一次的回答:
sources (无后缀名)的固定文件名,内容为:
targettype=driver
targetname=obj
sources=wdkdemo.cpp
更正为:
targettype=driver
targetname=wdkdemo
targetpath=obj
sources=wdkdemo.cpp
一、开发工具1,虚拟机和 *** 作系统
本人使用的win10 *** 作系统,并安装了“VMware Station11”,在虚拟机中暂时只安装了一个“win7 x64” *** 作系统,后续将安装一个win10虚拟机系统。一般情况下,我都是在虚拟机 *** 作进行驱动的安装和调试,这样可以防止将本机的 *** 作系统弄乱。
后续将尝试“通过本机winDbg来调试虚拟机中的驱动”。这是一个比较高级的调试方法,点击打开链接。
2,开发工具
本人主要使用“WDK7600”(点击打开链接)和"VS2015+wdk10"(点击打开链接)。我把前者安装在“win7 X64”虚拟机中安装,把后者安装在本机和实验室电脑上。由于我使用的教材《Windows驱动开发详解》和学习博客都是用wdk7这个版本开发,为了环境一致,故选择了在虚拟机上试验这些教材上的示例代码。
关于wdk7,参考博客:点击打开链接。
关于“VS2015+wdk10”,需要在win10系统下,先安装VS2015,再安装wdk10,此外还要安装VS2015的update。(winDbg集成到了wdk10下,路径:C:\Program Files (x86)\Windows Kits\10\Debuggers\x64)。
注意事项:
1)VS2015默认安装,是不安装c++和sdk的,需要选择自定义安装;
2)如果已经默认安装了,这个时候再安装wdk10,会给出警告;
3)此时,可以选择先用VS2015新建一个c++项目,然后会提示你安装c++部分的模块;
4)安装好后,就可以正常安装wdk10了,如果wdk10安装好后,还有编译问题,也需要先去VS下看看是否却c++相关模块,并按上述3安装完整。
另一个需要注意的是,编译报“Inf2Cat error -2: "Inf2Cat, signability test failed. "Double click to see the tool output”,
参考博客:点击打开链接
是因为inf文件的“DriverVer”的时间不对,VS2015默认的“Inf2cat”中的时间为UTF,需要在工程属性-》“inf2cat”选择中,将local时间打开。
3,调试工具
1)debugview
在驱动程序中,调用KdPrint函数(类似C语言中printf),然后通过debugview查看打印信息。这是最常用的一种调试方法。
需要注意的是:首先要在“capture”菜单中勾选“kernel”相关的选项,表示抓取内核的信息。然后,需要使用“管理员身份”运行该软件。Debugview在win10下经常报错:
需要到“C:\Windows\System32\drivers”中找到“dbgv.sys”,删除它,再使用“管理员身份”运行该软件。
2)
4,调试手段
1)驱动安装阶段,可以到“C:\Windows\System32\drivers”目录下看相应的“sys”文件是否到位。
2)cmd->regedit打开注册表,再在“编辑”菜单下“查找”对应的设备信息。
3)使用KdPrint函数打印log和DebugView软件抓取log(最常用的手段);
4)在驱动代码中写log文件(理论上可行,待探索);
5)存储dump信息。所谓dump信息,就是在系统奔溃之前, *** 作系统会将当前的调用堆栈记录成一个dump文件。(详细设置系统转存dump信息,可以参考《Windows驱动开发技术详解》最后一章,或博客:点击打开链接)。设置好dump文件后,遇到蓝屏,再将dump文件放到WinDbg中查看,这也是一个中常用的调试手段。
6)IRPTrace,这个软件可以跟踪IRP,但是win7及后续版本都不可用,可以尝试自己写程序跟踪。
7)PCITree,查看设备挂载;
8)WinObject,查看驱动中的各种对象信息。
9)WinDbg调试虚拟机,这是一个高级应用。配合VS2015可以查看“内存”、“调用堆栈”、“线程”和“反汇编”。
注:在驱动的开发过程,需要逐渐掌握各种工具和调试手段。
二、开发框架
从我最近的浏览的资料来看,Windows驱动程序大致有三种类型:NT驱动、WDM驱动和WDF驱动。其中,NT驱动是非即插即用(Plug-in-and-Play,PNP)式的,它是一项系统服务,目前的设备类驱动大都不是这种类型,不是我的关注点,后面将不展开介绍。WDM驱动和WDF驱动都是即插即用的驱动,后者是前者的升级版。
1,WDM框架
WDM是早前的Windows驱动开发框架,虽然现在微软推荐用WDF,但是,学习WDM一是能够更对地了解 *** 作系统的内部机制(WDF是对WDM更高层次的封装),二是《Windows驱动开发技术详解》以及网上的很多博文都是用的WDM,从学习角度出发也需要掌握一定的WDM知识。
WDM框架的基本知识,可以参考博文:点击打开链接。后续我也用单独的博文来讲解这方面的内容,主要包括:
1)驱动对象与设备对象(DriverObject vs Device Object);
2)物理设备对象(PDO)和功能设备对象(FDO);
3)驱动的层次结构:水平层次(eg:FDO之间)和垂直层次(FDO到PDO);
4)入口函数(DriverEntry);
5)设备扩展(DRIVER_EXTENSION);
6)重要的例程(routine):AddDevice
7)IRP机制(I/O Request Package):MajorFunction(MJ))和MinorFunction(MN);
2,WDF框架
对于WDF框架,可以参考《Window7设备驱动开发》这本书。WDF框架可以分为KMDF(Kernel Model Driver Frame)和UMDF(User Model Driver Frame),其驱动模型如下:
1)WDF对象(属性、方法和事件);
2)即插即用和电源管理的集成;
3)集成的I/O排队和取消(queue);
4)I/O模型。在Windows中,IRP的功能不仅仅是向驱动程序提供传统的I/O请求(读、写、创建等)。它是 *** 作系统和驱动程序、驱动程序和驱动程序之间一种基于数据包的通信机制。
3,一个典型的KMDF驱动程序
通过VS2015新建一个项目,选择“KMDF”,它会产生如下文件:
1)public.h中定义GUID和CTL_CODE,并提供给应用程序使用;
2)trace.h定义的调试宏和函数,暂不关注;
3)driver.h和driver.c定义了主要的框架代码。包括:入口函数(DriverEntry)、加载设备的例程(KMDFDriver1EvtDeviceAdd)和清理上下文区的函数。该文件都是框架性的代码,在驱动开发的过程中,可以选择一个框架,选定框架后,一般不在该文件中添加功能,而是放到“device.c”和“queue.c”。
4)device.h和device.c,主要处理设备相关的功能,与设备交互的实现放在该文件中。主要包括设备初始化和资源释放;
5)queue.h和queue.c,主要处理IRP,包括KMDFDriver1EvtIoDeviceControl;
设置目标或测试计算机是配置计算机以便进行自动驱动程序部署、测试和调试的过程。一个测试和调试环境具有两台计算机:主计算机和目标计算机。目标计算机也称为逗测试计算机地。使用主机上的 Visual Studio 开发和构建驱动程序。调试程序在主机上运行并且位于 Visual Studio 用户界面中。当测试和调试驱动程序时,驱动程序在目标计算机上运行。主计算机和目标计算机必须能够彼此按名称执行 ping *** 作。如果两台计算机已加入到同一工作组或同一网络域,则此 *** 作可能更容易。如果你的计算机位于工作组中,我们建议你使用路由器(而非集线器或交换机)连接计算机。不支持对虚拟机进行设置。
准备目标计算机以进行设置
在目标计算机上,安装将用于运行和测试驱动程序的 *** 作系统。
如果在 x86 或 x64 目标计算机上启用逗安全启动地,则禁用该功能。
如果目标计算机使用 ARM 处理器,则安装 Windows 调试策略。则无需禁用逗安全启动地。
在目标计算机上,运行与目标计算机平台匹配的 WDK 测试目标安装程序 MSI。可以在 Remote 下的 Windows 驱动程序工具包 (WDK) 安装目录中找到该 MSI。
例如:C:\Program Files (x86)\Windows Kits\10\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi
如果目标计算机运行的是 N 或 KN 版本的 Windows,则安装适用于 N 和 KN 版本的 Windows 的媒体功能包。
如果目标计算机运行的是 Windows Server,请查找刚才通过 WDK 测试目标设置 MSI 创建的 DriverTest 文件夹。(例如:c:\DriverTest)。右键单击逗DriverTest地文件夹,然后选择逗属性地。在逗安全地选项卡上,向逗经过身份验证的用户地组授予逗修改地权限。
验证主机和目标计算机可以彼此执行 ping *** 作。打开命令提示符窗口,并输入 ping 192.186.X.X(ip_adress)。
如果主计算机和目标计算机已加入到一个工作组,但它们位于不同的子网上,你可能必须调整某些防火墙设置,以便主计算机和目标计算机可以通信。请按照下列步骤进行 *** 作:
两种方法(选一即可):
方法一:
在目标计算机上的逗控制面板地中,转到逗网络和 Internet地>逗网络共享中心地。注意你的活动网络。它可能是逗公共网络地、逗私有网络地或逗域地。
在目标计算机上的逗控制面板地中,转到逗系统和安全地>逗Windows 防火墙地>逗高级设置地>逗入站规则地。
在入站规则列表中,查找用于活动网络的所有网络发现规则。(例如,查找所有逗配置文件地为逗专用地的网络发现规则。)双击每个规则,然后打开逗作用域地选项卡。在逗远程 IP 地址地下,选择逗任何 IP 地址地。
在入站规则列表中,查找用于活动网络的所有逗文件和打印机共享地规则。对于每个规则,双击该规则,将打开逗作用域地选项卡。在逗远程 IP 地址地下,选择逗任何 IP 地址地。
方法二:
逗控制面板地->逗系统和安全地->逗Windows防火墙地->"启动或关闭Windows防火墙"->"关闭Windows防火墙"
设置目标计算机
现在,你可以随时在 Visual Studio 中通过主计算机设置目标计算机。
在主计算机上,在 Visual Studio 的逗Driver地菜单中,选择逗Test地>逗Configure Deivce地。
单击逗Add New Device地。
在逗Network host name地中输入目标计算机的名称。选择逗Provision Device and choose debugger setting地。
选择某种调试连接类型,并输入所需的参数。
设置过程将需要几分钟时间,并且可能会自动重新启动目标计算机一到两次。设置完成后,单击逗完成地。
WDK 10 与 Microsoft Visual Studio 完全集成。你可以使用 Visual Studio 开发环境生成驱动程序,也可以使用 Microsoft Build Engine (MSBuild) 直接从命令行生成驱动程序。
从 Windows 驱动程序工具包 (WDK) 8 开始,MSBuild 就已经取代了在早期版本的 WDK 中使用的 Windows 构建实用工具 (Build.exe)。现在,WDK 可使用与你用于构建 Visual Studio 项目相同的编译器和构建工具。使用早期版本的 WDK 构建的驱动程序项目必须进行转换才能在 Visual Studio 环境中工作。你可以从命令行运行转换实用工具,也可以通过从现有的源创建新的 Visual Studio 项目来转换现有驱动程序。
构建驱动程序主要有以下两种方式(选一即可)
方法一:使用 Visual Studio 构建驱动程序
构建驱动程序的方法与在 Visual Studio 中构建任何项目或解决方案的方法相同。当使用 Windows 驱动程序模板创建新的驱动程序项目时,该模板定义默认(活动)的项目配置以及默认(活动)的解决方案生成配置。
注意 你可以将使用 WDK 8 或 Windows 驱动程序工具包 (WDK) 8.1 所创建的项目和解决方案转换为适用于 Windows 驱动程序工具包 (WDK) 10 和 Visual Studio 2015。打开项目或解决方案前,请先运行 ProjectUpgradeTool。ProjectUpgradeTool 将转换项目和解决方案,以便可以使用 WDK 10 构建它们。
1、确保安装在你的计算机上的 SDK 和 WDK 的版本相同。
2、在 Visual Studio 中打开驱动程序项目或解决方案。
3、在逗解决方案资源管理器地中右键单击解决方案,并选择逗配置管理器地。
4、从逗配置管理器地中,选择与你感兴趣的构建类型相对应的活动解决方案配置(例如,逗调试地或逗发布地)以及活动解决方案平台(例如,逗Win32地)。
5、选择要构建驱动程序的目标 *** 作系统。导航到逗驱动程序地>逗常规地中的项目属性,然后设置 TargetVersion 属性。
6、为驱动程序或驱动程序包配置项目属性。 可以为部署、驱动程序签署或其他任务设置属性。
7、从逗构建地菜单中,单击逗构建解决方案地 (Ctrl+Shift+B)。
方法二:
使用命令行构建驱动程序 (MSBuild)
你可以使用逗Visual Studio 命令提示符地窗口和 Microsoft Build Engine (MSBuild) 来从命令行构建驱动程序。
使用逗Visual Studio 命令提示符地窗口构建驱动程序
打开逗适用于 VS2015 的开发人员命令提示符地窗口。
在此窗口中,你可以借助 MSBuild.exe,通过指定项目 (.VcxProj) 或解决方案 (.Sln) 文件来构建任何 Visual Studio 项目。
导航到项目目录并为你的目标输入 MSbuild 命令。
例如,若要使用默认的平台和配置生成名为 MyDriver.vcxproj 的全新的 Visual Studio 驱动程序项目,请导航到项目目录并输入以下 MSBuild 命令:
msbuild /t:clean /t:build .\MyDriver.vcxproj
语法 - 若要指定特定的配置和平台,请使用以下命令语法:
msbuild /t:clean /t:build ProjectFile /p:Configuration=<Debug|Release>/p:Platform=architecture /p:TargetPlatformVersion=a.b.c.d /p:TargetVersion=OS
例如,以下命令将为逗调试地配置、逗Win32地平台和 Windows 10 生成一个通用 Windows 驱动程序。
msbuild /t:clean /t:build .\MyDriver.vcxproj /p:Configuration="Debug" /p:Platform=Win32 /p:TargetVersion=地Windows10地 /p:TargetPlatformVersion=地10.0.10010.0地
逗TargetPlatformVersion地设置为可选项,并且允许你指定用于生成的工具包版本。默认值为使用最新的工具包。
使用 Visual Studio 中的选项增加构建输出详细信息的步骤
1、单击 Tools > Options。
2、单击逗项目和解决方案地文件夹并单击逗生成并运行地。
3、更改逗MSBuild 项目构建输出详细信息地和逗MSBuild 项目构建日志文件详细信息地。 默认情况下,这些都设置为逗最少地。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)