驱动开发:配置Visual Studio驱动开发环境
在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装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
驱动,则可以无干扰的输出我们所需结果。
驱动开发:配置Visual Studio驱动开发环境相关推荐
- vs2015html5环境配置,visual studio 2015 PreView环境搭建图文教程
2014年11月13日,微软发布了Visual Studio 2015 Preview,跟随者Visual Studio 2015 而来的是,.net 开源,C#支持wp,ios,android三大系 ...
- macOS配置Visual Studio Code开发Java项目
今天折腾了一会vs code下配置Java开发环境,现贴出配置步骤. 1.开发环境: macOS Mojave JDK 1.8 Visual Studio Code 2.macOS下查看jdk安装路径 ...
- 配置 Visual Studio 2019以进行 iOS 开发
前言 在安装vs2019时有个选项:在vs2019中进行Android和ios开发,是不是普大喜空,再次膜拜地表最强IDE vs2019,幻想着在windows下跑Android和Ios程序..... ...
- 配置Visual Studio Code的SciLab开发环境
配置Visual Studio Code的SciLab开发环境 引言 整体思路 插件安装 设置环境变量 设置setting.json 引言 由于美国将一批中国高校列入了实体清单制裁,近日Mathwor ...
- Linux操作系统Ubuntu 22.04配置Visual Studio Code与C++代码开发环境的方法
本文介绍在Linux Ubuntu操作系统下,配置Visual Studio Code软件与C++ 代码开发环境的方法. 在文章虚拟机VMware Workstation Pro中配置Linu ...
- Microsoft Visual Studio C++开发环境的配置及使用
Microsoft Visual Studio C++开发环境的配置及使用 本文引用自作者编写的下述图书; 本文允许以个人学习.教学等目的引用.讲授或转载,但需要注明原作者"海洋饼干叔 叔& ...
- 【错误记录】Ubuntu 中 ROOT 用户无法启动 Visual Studio Code 开发环境 ( 推荐在普通用户下使用 VSCode 开发环境 )
文章目录 一.报错信息 二.解决方案 一.报错信息 在 [开发环境]Ubuntu 安装 Visual Studio Code 开发环境 ( 下载 Visual Studio Code 安装器 | Ub ...
- DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建
DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建 DCMTK 362MD支持库与Microsoft Visual Studio 2017开发 ...
- 打造TypeScript的Visual Studio Code开发环境
打造TypeScript的Visual Studio Code开发环境 本文转自:https://zhuanlan.zhihu.com/p/21611724 作者: 2gua TypeScript是由 ...
最新文章
- inux时间问题两篇
- 前端js vue遇到的一些简单的数据处理-持续更新
- java实现对大文件切割下载_Java实现大文件的切割与合并操作示例
- windows下mysql主从同步_详解windows下mysql的主从同步
- SpringBoot2.1.5(13)--- SpringBoot 特性下
- 魔法值(【CCF】NOI Online能力测试3 提高组)
- django查询mysql 区分大小写_Django+MySQL查询不区分大小写问题
- ORACLE AWR简介
- asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结
- Discuz! X2.5 添加风格模板
- ASP.NET基础教程-Server对象
- 阿里云CDN回源OSS产生流量计费说明
- Java 8 新增函数式接口到底是什么?
- 流放者柯南自建服务器 linux,流放者柯南个人服务器搭建教程 怎么搭建个人服务器...
- Python:folium地图标记icon分组展示
- OpenCV快速入门篇(Python实现)
- 贝塞尔曲线 unity两点画曲线弧线三点
- 2012年桂城街道小学毕业生升初中
- 每日时间管理【战隼】
- springMVC+poi导出excel
热门文章
- 真正优秀的人,从来都是不动声色
- 时光邮局|来写一封未来的信试试吧!一个我的新项目,Java+Vue
- 采用FPGA进行bayer插值算法的实现方法
- 第20章 知识产权管理、第21章 法律法规和标准规范
- 在线查看html文件大小,如何以HTML格式的可访问方式显示文件大小(How to display file sizes in an accessible way in HTML)...
- Solaris10 网卡驱动安装(Intel(R) Pro/100 VM Network Connection网卡)
- 什么年龄干什么事【转载】
- Altium Designer 20 凡亿教育视频学习-05
- 《白帽子讲Web安全》学习笔记
- html js页面跳转的几种方式