驱动开发:配置Visual Studio驱动开发环境

100编程书屋_孔夫子旧书网

  • 配置驱动开发环境
  • 配置驱动开发模板
  • 配置驱动双机调试

在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的vs_ultimate.exe安装包,Visual Studio的安装非常的简单,您只需要按照提示全部选择默认参数即可,根据机器配置不同可能需要等待一段时间;

回到顶部

配置驱动开发环境

在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的vs_ultimate.exe安装包,Visual Studio的安装非常的简单,您只需要按照提示全部选择默认参数即可,根据机器配置不同可能需要等待一段时间;

接着读者还需要继续安装Windows Driver Kit 8.1工具包,请将该工具包解压缩到桌面,并双击wdksetup.exe进行安装,过程中只需要一直下一步,并等待WDK工具包安装完成;

WDK就是内核编程开发工具包,某些读者可能听说过DDK或者IFSDDK,最典型的开发工具包莫过于DDK7600,直到目前此类工具包仍然可以正常使用,但并不推荐。

为了能测试驱动程序运行状态,读者需安装VMWare虚拟机,双击附件中的VMware-workstation-full-16.2.4-20089737.exe安装程序一直点击下一步即可,需要注意的是在如下选项中请在增强型键盘驱动程序上打对勾,之后等待安装完毕即可;

接着打开VMware虚拟机,并在【文件】处选择【新建虚拟机】,单机下一步并选中【稍后安装操作系统】,在操作系统选择页面选择【Win10 x64】版本。

在硬件配置处,读者可根据自己电脑的配置灵活的选择,当自定义配置完成后,则虚拟机模板将被创建。

虚拟机模板创建完成后,读者可根据如下配置选择编辑虚拟机设置,并在磁盘位置处将课件中的cn_windows_10_consumer_editions_version_1903_x64_dvd_8f05241d.iso挂载到虚拟机上;

点击开启虚拟机,并按照提示将Windows系统正确的安装,需要注意的是在选择版本时,读者最好使用教育版与笔者开发环境保持一致,至此只需等待系统安装完毕,根据系统差异安装时间可能有所差别,耐性等待即可;

当一切安装就绪后我们需要在系统中安装VMware Tools工具,该组件在安装后可让虚拟机具备有拖拽上传文件的功能,且鼠标键盘将可以自由切换,该功能是我们必须要用到的;

安装VMware Tools工具很容易,只需要点击安装菜单,后会在虚拟机中出现DVD驱动器,此时双击驱动器并按照要求安装即可,安装完成后重启系统,此时则具备了拖拽上传功能;

当这些都做好以后,建议用户关闭虚拟机,并点击【虚拟机】菜单,找到【快照】并拍摄一个快照,快照的作用是当虚拟机系统出现问题后可快速恢复到初始模式,避免重装系统,在后续课程中读者会出现无数次的蓝屏,而虚拟机快照的快速恢复功能则是一个很好的选择;

回到顶部

配置驱动开发模板

1.打开Visual Studio开发工具,然后选择【文件】菜单新建项目,并在已安装模板中选中【Visual C++】新建空项目,并将项目名称命名为【WinDDK】点击确定。

2.依次选择【解决方案视图-源文件-添加新建项】选项卡,或者直接按下Ctrl + Shift + A快捷打开菜单,并创建main.c文件。

3.接着需要修改配置管理器,添加自定义配置管理,选择【生成-配置管理器-新建】选项卡,此处我们命名为WinDDK即可。

4.修改配置属性中的【常规】属性,点击菜单栏中的调试,选择【WinDDK属性-配置-常规】修改为标黄处所示内容即可。

5.配置可执行文件路径与导入库路径,这里我们选择【配置属性-VC++目录】依次将如下信息填入配置项。

可执行目录
C:\Program Files (x86)\Windows Kits\8.1\bin\x64
C:\Program Files (x86)\Windows Kits\8.1\bin包含目录
C:\Program Files (x86)\Windows Kits\8.1\Include\km
C:\Program Files (x86)\Windows Kits\8.1\Include\shared
C:\Program Files (x86)\Windows Kits\8.1\Include\um
C:\Program Files (x86)\Windows Kits\8.1\Include\wdf\kmdf\1.13
C:\Program Files (x86)\Windows Kits\8.1\Include\wdf\umdf\2.0
C:\Program Files (x86)\Windows Kits\8.1\Include\winrt引用目录
C:\Program Files (x86)\Windows Kits\8.1\Lib\win7\km\x64库目录
C:\Program Files (x86)\Windows Kits\8.1\Lib\win7\km\x64
C:\Program Files (x86)\Windows Kits\8.1\Lib\wdf\kmdf\x64\1.13
C:\Program Files (x86)\Windows Kits\8.1\Lib\wdf\umdf\x64\2.0
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\km\x64

当如上文件配置完成后,最终效果如下图所示;

6.配置C/C++优化选项,在配置属性中找到【C/C++-所有选项】并依次修改下方几个关键位置。

安全检查         禁用安全检查 (/GS-)
将警告视为错误    否 (/WX-)
警告等级         关闭所有警告
启用C++异常      否
调用约定         __fastcall (/Gr)
优化            已禁用 (/Od)
运行库          多线程 (/MT)
预处理器定义     _AMD64_;_DDK_;_WIN32_WINNT=0x0501;WINVER=0x0501;_NDEBUG;DBG=0;%(PreprocessorDefinitions)

当如上文件配置完成后,最终效果如下图所示;

7.配置连接器选项,选择【连接器-所有选项】依次修改下方几个关键位置。

附加选项            /IGNORE:4078 /safeseh:no
附加依赖项          ntoskrnl.lib;ndis.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib
固定基址            此处需要清空
忽略所有默认库      是 (/NODEFAULTLIB)
启用增量链接        否 (/INCREMENTAL:NO)
驱动程序            驱动程序 (/Driver)
入口点              DriverEntry
生成清单            否 (/MANIFEST:NO)
生成调试信息        是 (/DEBUG)
生成映射文件        是 (/MAP)
数据执行保护        是 (/NXCOMPAT)
随机基址           此处需要清空
子系统             本机 (/SUBSYSTEM:NATIVE)

当如上文件配置完成后,最终效果如下图所示;

8.上方的配置已经基本完成了,接着我们编写一段驱动初始化代码,然后按下F7即可完成驱动的编译。

// 署名权
// right to sign one's name on a piece of work
// PowerBy: LyShark
// Email: me@lyshark.com#include <ntifs.h>// 卸载驱动
NTSTATUS UnDriver(PDRIVER_OBJECT driver)
{DbgPrint("Uninstall Driver Is OK \n");return STATUS_SUCCESS;
}// 驱动入口地址
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{DbgPrint("Hello LyShark \n");Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;
}

9.最后生成一个驱动开发模板,依次选择【文件-导出模板-项目模板-下一步-完成】即可完成模板的导出,此时关闭VS工具并再次打开,就能直接使用我们的模板来开发驱动了,当用户需要使用时,不需要每次都配置。

  • 模板位置:C:\Users\admin\Documents\Visual Studio 2013\My Exported Templates

读者也应注意,如果用户通过模板创建驱动开发项目则需要手动在配置菜单中切换到WinDDK选项的x64模式下。

回到顶部

配置驱动双机调试

1.首先需要在VMware虚拟机关闭状态下添加一个管道虚拟串口,此处需要删除打印机,否则串口之间冲突。

操作步骤:编辑虚拟机设置 -> 添加 -> 串行端口 -> 完成
参数配置:使用命名管道 -> \\.\pipe\com_1 -> 该端是服务器,另一端是应用程序 -> 轮询时主动放弃CPU->确定

2.开启虚拟机中的Windows系统,然后以管理员身份运行CMD命令行,输入bcdedit命令,可以查看到系统的当前启动项,如果是新的系统,则只会有{current}启动项以及一个{bootmgr}项。

连续执行下方的七条命令,依次建立启动项,激活Windows系统的调试模式,并开启串口通信,调试端口波特率为115200

bcdedit /set testsigning on
bcdedit -debug on
bcdedit /bootdebug on
bcdedit /set "{current}" bootmenupolicy Legacy             // 修改启动方式为Legacy
bcdedit /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200    // 设置串口1为调试端口波特率为115200
bcdedit /copy "{current}" /d "Debug"                       // 将当前配置复制到Debug启动配置
bcdedit /debug "{<新建的启动配置的标识符>}" on               // 打开调试开关

但需要注意{<新建的启动配置的标识符>}需替换成{bdb0b3b6-3f21-11ed-9931-d46011246f28}标志,如下所示。

3.最后查看一下当前调试配置选项,执行命令 bcdedit /dbgsettings,显示出使用的第一个串口,波特率为115200bps,保持默认不需要修改。

4.配置完成后,重新启动系统,在开机的时候选择Windows10 [启用调试程序]则系统会黑屏,说明已经正常进入调试模式了。

5.此时回到物理机上面,解压缩课件中的WinDBG_10.0.16299.15.zip到D盘根目录下,我们在命令行中切换到WinDBG\x64的根目录下,并执行以下命令,即可连接虚拟机串口进行调试了。

  • 执行命令 windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe 如下图

6.至此我们还需要加载符号,符号的作用是方便我们调试,该符号是由微软官方维护的权威资料,在命令行下依次执行以下命令,配置好符号加载并启动系统。

kd> .sympath SRV*c:\mySymbols*http://msdl.microsoft.com/download/symbols
kd> .reload
kd> g
kd> g
kd> ed nt!Kd_SXS_Mask 0
kd> ed nt!Kd_FUSION_Mask 0
kd> u KiSystemServiceUser

这样即可完成配置操作,此时系统已被断下等待我们执行操作,如下图所示。

7.最后我们配置测试一下调试功能,首先编写以下代码,代码中使用DbgBreakPoint()设置断点,将会在入口处中断。

// 署名权
// right to sign one's name on a piece of work
// PowerBy: LyShark
// Email: me@lyshark.com#include <ntifs.h>// 驱动默认回调
NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{NTSTATUS status = STATUS_SUCCESS;pIrp->IoStatus.Status = status;pIrp->IoStatus.Information = 0;IoCompleteRequest(pIrp, IO_NO_INCREMENT);return status;
}// 驱动卸载函数
VOID UnDriver(PDRIVER_OBJECT driver)
{DbgPrint("驱动已卸载 \n");
}// 驱动入口地址
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{// 初始化默认派遣函数NTSTATUS status = STATUS_SUCCESS;for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++){Driver->MajorFunction[i] = DriverDefaultHandle;}// 设置断点DbgBreakPoint();// KdBreakPoint();// __debugbreak();DbgPrint("驱动已加载 \n");// 驱动卸载函数Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;
}

通过Visual Studio工具编译如上代码片段,并在WinDBG中输入g命令让系统运行起来,将编译好的驱动程序拖入到虚拟机中,并以管理员身份打开Windows 64Signer.exe,使用该工具对驱动程序进行签名,如下图所示;

签名完成后将我们的驱动文件WinDDK.sys,拖入到KmdManager.exe驱动加载工具中,并通过驱动加载工具加载运行,此时Windows系统会卡死,回到WinDBG中发现已经可以进行调试了,如下图所示;

此处需要扩展一个知识点,如果不使用WinDBG工具而想要获取到DbgPrint()函数输出结果,则你可以使用课件中提供的dbgview64.exe程序,不过此程序需要注意几点,该程序需要使用管理员身份运行,且运行后需要将Capture菜单中的属性全部打对勾,如下图所示;

此时DebugView会出现很多的无用输出,则你需要打开过滤器按钮,输入STORMINI将此类输出屏蔽掉,如下图所示;

至此再次使用KmdManager工具加载WinDDK驱动,则可以无干扰的输出我们所需结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2009-2024年第一季度上市公司华证ESG评级季度数据

2009-2024年第一季度上市公司华证ESG评级季度数据 1、时间&#xff1a;2009-2024年第一季度 2、指标&#xff1a;证券代码、证券简称、评级日期、综合评级、综合得分、E评级、E得分、S评级、S得分、G评级、G得分、证监会行业&#xff08;新&#xff09;、同花顺行业&#xff…

Visio框图自动带填充色原因及如何取消

0 Preface/Foreword Visio&#xff0c;Windows的一个流程图&框图制作工具。 1 新建Visio文件 1.1 图形带填充 新建Visio时候&#xff0c;如果选择了模版&#xff0c;那么就后期使用的工具元素会自动填充。 带来的弊端&#xff0c;在元素编辑文字时&#xff0c;如果此时不…

苹果公司的Wifi定位服务(WPS)存在被滥用的风险

安全博客 Krebs on Security 2024年5月21日发布博文&#xff0c;表示苹果公司的定位服务存在被滥用风险&#xff0c;通过 "窃取"WPS 数据库&#xff0c;可以定位部队行踪。 相关背景知识 手机定位固然主要依赖卫星定位&#xff0c;不过在城市地区&#xff0c;密集的…

Perl 语言开发(五):循环语句

目录 1. 循环语句概述 2. while 循环 2.1 基本语法 2.2 示例 2.3 无限循环 3. until 循环 3.1 基本语法 3.2 示例 3.3 无限循环 4. for 循环 4.1 基本语法 4.2 示例 4.3 嵌套循环 5. foreach 循环 5.1 基本语法 5.2 示例 5.3 遍历哈希 6. 循环控制语句 6.1 …

新建Vue工程的几种方法

文章目录 使用CLI2 : vue-cli使用CLI3 : vue/cli使用 vue3构建 &#xff08;内置Vite&#xff09;直接使用Vite使用parcel (最少配置方案) 使用CLI2 : vue-cli vue-cli是针对构建vue的脚手架CLI2&#xff0c;只能新建vue2工程。 全局安装vue-cli之后&#xff0c;构建vue2项目的…

03.C1W2.Sentiment Analysis with Naïve Bayes

目录 Probability and Bayes’ RuleIntroductionProbabilitiesProbability of the intersection Bayes’ RuleConditional ProbabilitiesBayes’ RuleQuiz: Bayes’ Rule Applied Nave Bayes IntroductionNave Bayes for Sentiment Analysis P ( w i ∣ c l a s s ) P(w_i|clas…

大数据领域的深度分析——AI是在帮助开发者还是取代他们?

在大数据领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的应用正在迅速扩展&#xff0c;改变了数据科学家和开发者的工作方式。本文将从大数据的专业视角&#xff0c;探讨AI工具在这一领域的作用&#xff0c;以及它们是如何帮助开发者而非取代他们的。 1. 大数据…

npm 淘宝镜像证书过期,错误信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更换 npm 证书 问题描述报错原因更换步骤1 找到 nvm 安装目录2 发现证书过期3 更换新地址4 保存后&#xff0c;重新安装成功 问题描述 在使用 nvm 安装新版本时&#xff0c;未成功&#xff0c;出现报错&#xff1a; Could not retrieve https://npm.taobao.org/mirrors/node/l…

【postgresql】表操作

创建表 (CREATE TABLE): CREATE TABLE table_name ( column1 data_type constraint,column2 data_type constraint,... ); 插入数据 (INSERT INTO): INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); 查询数据 (SELECT): SELECT column1, c…

火山引擎数据飞轮实践:在电商场景中,如何建设全链路数据血缘?

数据作为新型生产要素&#xff0c;正支撑企业的数智化转型。但企业数字化建设也存在管理成本高、数据产品使用门槛高、数据资产价值不够的问题&#xff0c;其原因在于业务和数据之间没有形成双向良性驱动。 结合新时代企业数字化转型需求&#xff0c;火山引擎基于字节跳动十余…

IC烧录员-带着工程师的梦想远航!

如果说软件工程师是代码程序的创造者&#xff0c;那么IC烧录员就是把工程师们辛苦敲代码&#xff0c;日夜辛劳的成果烧录到芯片里面的实践者&#xff0c;是他们&#xff0c;让工程师们的梦想运用到实践中&#xff0c;是他们带着工程师的梦想远航&#xff0c;他们的薪酬或许没有…

第一节-k8s架构图

一个Deployment&#xff0c;可以由多个不同Node下的Pod组成&#xff0c;每个Pod又由多个Container组成。 区分Deployment是用Labels(key:value)&#xff0c;区分Pod是用PodName&#xff0c;区分Container是用ContainerName。 一个Node可以包含多个不同Deployment中的pod&…

MySQL-作业1

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 二、创建表 1、创建一个名称为db_system的数据库 2、在该数据库下创建两张表&#xff0c;具体要求如下&#xff1a; 员工表 user …

米国政府呼吁抛弃 C 和 C++

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 很多观点认为C 或 C永远不可被…

页面集成技术方案汇总

1.window.open() 优点: 新开窗口或标签页展示内容&#xff1a;允许在新的浏览器窗口或标签页中打开指定的URL&#xff0c;适用于需要独立页面交互的场景。隔离性&#xff1a;新窗口拥有独立的执行环境&#xff0c;不会干扰主页面的JavaScript上下文和DOM结构。易于实现&#…

聚鼎装饰画:装饰画生意现在做晚吗

在这个充满机遇与挑战的时代&#xff0c;涉足装饰画领域是否为时已晚?许多人心中或许有着这样的疑问。事实上&#xff0c;尽管市场上的竞争者众多&#xff0c;但正如“朝霞映满天&#xff0c;别样红”一般&#xff0c;每个行业的黄金时期都有所不同&#xff0c;关键在于我们能…

设计模式-装饰器

装饰器模式是一种结构型设计模式&#xff0c;它允许在运行时扩展一个对象的功能&#xff0c;而不需要改变其现有结构。这种模式的核心思想是通过创建一个装饰器来动态地增强或修改原有对象的行为。装饰器模式是继承的一个补充&#xff0c;提供了比继承更加灵活的方式来扩展对象…

在线JSON可视化工具--改进

先前发布了JSON格式化可视化在线工具&#xff0c;提供图形化界面显示结构关系功能&#xff0c;并提供JSON快速格式化、JSON压缩、快捷复制、下载导出、对存在语法错误的地方能明确显示&#xff0c;而且还支持全屏&#xff0c;极大扩大视野区域。 在线JSON格式化可视化工具 但…

Cannot load configuration class: com.xxx.NacosConfigApplication

Cannot load configuration class: com.xxx.NacosConfigApplication 无法启动成功 表象错误的日志信息解决方案结言 表象 最简单的Spring Boot maven 配置 properties配置 启动类&#xff0c;但是&#xff0c;就是无法启动成功。 错误的日志信息 java.lang.IllegalStateEx…