在正式开始驱动开发之前,须要自行搭建驱动开发的必要环境,首先咱们须要装置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\x64C:\Program Files (x86)\Windows Kits\8.1\bin蕴含目录C:\Program Files (x86)\Windows Kits\8.1\Include\kmC:\Program Files (x86)\Windows Kits\8.1\Include\sharedC:\Program Files (x86)\Windows Kits\8.1\Include\umC:\Program Files (x86)\Windows Kits\8.1\Include\wdf\kmdf\1.13C:\Program Files (x86)\Windows Kits\8.1\Include\wdf\umdf\2.0C:\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\x64C:\Program Files (x86)\Windows Kits\8.1\Lib\wdf\kmdf\x64\1.13C:\Program Files (x86)\Windows Kits\8.1\Lib\wdf\umdf\x64\2.0C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64C:\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 onbcdedit -debug onbcdedit /bootdebug onbcdedit /set "{current}" bootmenupolicy Legacy             // 批改启动形式为Legacybcdedit /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200    // 设置串口1为调试端口波特率为115200bcdedit /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/symbolskd> .reloadkd> gkd> gkd> ed nt!Kd_SXS_Mask 0kd> ed nt!Kd_FUSION_Mask 0kd> 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驱动,则能够无烦扰的输入咱们所需后果。