关于c++:驱动开发配置Visual-Studio驱动开发环境

40次阅读

共计 6008 个字符,预计需要花费 16 分钟才能阅读完成。

在正式开始驱动开发之前,须要自行搭建驱动开发的必要环境,首先咱们须要装置 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 驱动,则能够无烦扰的输入咱们所需后果。

正文完
 0