如何开发Windows NT设备驱动程序

如何开发Windows NT设备驱动程序,第1张

一、开发工具

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 项目构建日志文件详细信息地。 默认情况下,这些都设置为逗最少地。

需要win 7 sp1系统和ie10或者IE11.Win7上安装vs2015 RC(候选发布版)失败完美解决方法,包含了Win7 SP1下载地址,IE10下载地址,IE11下载地址,在windows 7 *** 作系统上安装Visual Studio 2015,发生下面的错误:

解决方案:

可以手动安装目录packages\Patch 下根据 *** 作系统32,64 位系统安装对应的补丁:

安装完成补丁KB2999226,就可以正常的安装Visual Studio 2015

失败条件1:

Windows NT版本为6.3,且WindowsBuildNumber <9600,则不能安装。NT6.3是指windows 8.1系统或Windows Server 2012 R2,6.x是内核版本。如果是这个 *** 作系统版本,且build版本号低于9600,则不能安装。

失败条件2:

兼容模式未开启,如果系统不是最新系统,则需要开启兼容模式,否则无法安装。

失败条件3:

*** 作系统是Win7以上版本,或者是Win7版本并且SP包大于等于1的其他情况,则无法安装。这个表示,如果是Win7,则必须安装SP1及以上版本的补丁包。如果你的Win7没有安装补丁包,请先安装,否则无法安装VS2015.如果是更高版本的 *** 作系统,那么就不存在这个问题。

失败条件4:

IE不存在或者IE版本小于10,则无法安装。如果你在Win7上安装IE11,也是需要先安装SP1包。

所以Win7安装VS2015失败的最终的解决方案如下:

1.安装SP补丁包。

2、升级IE位IE10或者IE11

VS不同版本不会冲突:

我的win7刚装好2015,vs版本是不会冲突的,我的电脑上安装着2010,2013,2014,2015。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11577991.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存