一、创建项目

新建一个以Kernel Mode Driver, Empty(KMDF)为模板的驱动项目,项目名称HelloDriver,在项目中新建一个hello.cpp文件作为驱动入口文件,写一点简单的代码做测试:
hello.cpp代码:
#include <ntddk.h>
// 提供一个Unload 函数只是为了让这个程序能够动态卸载,方便调试
extern "C" void DriverUnload(PDRIVER_OBJECT driver)
{
// 但是实际上我们什么都不做,只打印一句话
DbgPrint("hello: my driver is unloading...\r\n");
}
// DriverEntry,入口函数。相当于main。
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
// 这是内核模块入口,可以在这里写入我们想写的东西
DbgPrint("hello: my world!");
// 设置一个卸载函数,便于这个函数退出
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
修改告警:调整属性 - C/C++ - 常规,警告等级 4,将警告视为错误 否;

二、编译及测试

  • 根据目标机器,选择x86/x64编译
  • 拷贝:KMDFDriver1.sys、KMDFDriver1.cer、KMDFDriver1.inf到测试机器
  • 测试机器打开驱动测试(驱动需要正规签名才能使用,而测试程序没有签名)
bcdedit /debug on
bcdedit /bootdebug on                 // boot 驱动需要此设置
bcdedit /set testsigning on            // 使用测试签名可用,和禁用签名功能类似
  • 测试机器打开debugview,需要配置收集内核驱动信息
  • 利用驱动加载工具,安装驱动
  • 安装服务后,启动和停止驱动,即可看到对应的调试信息。至此完成第一个驱动demo

三、远程调试

3.1 VS2019 远程调试

注:容易卡死,不稳定
1、VS2019中,选择 调试 - 附加到进程,连接类型选择 Windows Kernel Mode Debugger,连接目标为之前新建的Device,附加。
注意:附加前要开启虚拟机
2、Debug窗口会显示以下字样,表示已打开管道并等待重连。(注意是 Opened \.\pipe\com_1)
3、接着重新启动虚拟机,等待虚拟机进入桌面。Debug窗口显示如下:

注意:1.这里可能会花较长时间,并不是因为卡死了。
注意:2.重启虚拟机的时候记得禁用驱动程序强制签名。(或者使用testsigning)

4、进入桌面后,虚拟机可以正常操作。在VS2019中按下 全部中断

5、等待VS停下来,并出现以下画面,再点击 继续。(先暂停再继续,否则可能断不下来)。
注意:如果VS很长时间都没有响应,可以用任务管理器结束VS,然后重新打开再附加到进程。
6、此时就可以设置断点了

7、后面,同单机一样,用驱动加载工具安装驱动即可。

3.2 windbg远程调试

工具:windbg或win10商店的windbg preview(推荐)
1、Attach to kernel、配置com信息
2、重启虚拟机
3、配置符号文件路径
4、open source
5、下断点
  • break
  • 强制加载符号文件:.load /i KMDFDriver1.sys
  • 下断点:bp KMDFDriver1!DriverUnload
  • 继续运行:g
  • 在虚拟机加载驱动,触发相关过程,即可被断
注:
  • cpp源文件乱码:源码保存为utf8-bom模式
  • 断点位置不正确:确保pdb、cpp、sys文件编译版本一致
  • 断点时机:需要已经加载驱动,再下断点

四、QA

Q1:编译时出现error MSB8040: 此项目需要缓解了 Spectre 漏洞的库
原因:这是因为Visual Studio默认开启了缓解Spectre攻击的机制,所以就有两种解决方案,一种是生成解决方案时禁用Spectre缓解机制,另一种就是安装Spectre缓解机制。
a) 禁用Spectre机制:  右键解决方案,然后选择“属性”,然后选择“配置属性”——“C/C++”——“代码生成”,在最下方有一项Spectre缓解,下拉选择“禁用“就行了
b) 安装Spectre缓解机制:如下:
  • 打开Visual Studio Installer,点击修改
  • 选择单个组件,选择Spectre缓解库(最新),其中“最新”对应的为你的MSVC编译版本。点击修改完成安装
Q2:error 1297: Device driver does not install on any devices, use primitive driver if this is intended.
参考:
Win10下VS2019双机调试之调试驱动
VS2019社区版--WDK-win10-2004开发环境搭建
Windows内核驱动开发:HelloWorld

windows驱动开发3:第一个驱动及调试相关推荐

  1. Linux嵌入式驱动开发01——第一个驱动Hello World(附源码)

    文章目录 全系列传送门 引言 驱动介绍 Hello World 1. 包含头文件 2. 驱动模块的入口和出口 3. 声明信息 4. 功能实现 完整代码 编译 第一种方法 第二种方法 编译成模块 第一步 ...

  2. STM32MP157驱动开发——多点电容触摸屏驱动

    STM32MP157驱动开发--多点电容触摸屏驱动 一.简介 二.电容触摸屏驱动框架简介 多点触摸(MT)协议详解 三.驱动开发 1.添加 FT5426 设备节点 2.FT5426 节点配置 3.驱动 ...

  3. STM32MP157驱动开发——Linux块设备驱动

    STM32MP157驱动开发--Linux块设备驱动 一.简介 二.驱动开发 1.使用请求队列的方式 2.测试① 3.不使用请求队列的方式 4.测试② 参考文章:[正点原子]I.MX6U嵌入式Linu ...

  4. Linux SD卡驱动开发(五) —— SD 卡驱动分析Core补充篇

    Core层中有两个重要函数 mmc_alloc_host 用于构造host,前面已经学习过,这里不再阐述:另一个就是 mmc_add_host,用于注册host 前面探测函数s3cmci_probe, ...

  5. Linux驱动开发(外传)---驱动开发调试方法

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

  6. i.MX 6ULL 驱动开发 六:beep 驱动

    一.原理分析 通过原理图可以确定 beep 连接到 SNVS_TAMPER1 引脚上.根据 beep 原理,当 SNVS_TAMPER1 输出低电平时,beep 鸣叫. 通过数据手册确定 SNVS_T ...

  7. Linux驱动开发:字符设备驱动开发实战

    Linux驱动开发:字符设备驱动开发实战 一.工程创建 VSCode 创建工程,设置 C/C++ 配置,导入 linux kernel 源码目录,方便 vscode 写代码自动补全,vscode 配置 ...

  8. Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)

    一.前言 块设备主要为存储设备设计的框架. 在前面章节Linux下驱动开发_块设备驱动开发(内存模拟存储) 里介绍了块设备驱动编写思路,并且利用内存模拟了硬件存储,完成了块设备驱动开发测试.这一篇文章 ...

  9. Windows驱动开发之第一个驱动程序

    转载请注明来源: enjoy5512的博客 : http://blog.csdn.net/enjoy5512 GitHub : https://github.com/whu-enjoy 为了整理方便, ...

  10. 关于《竹林蹊径 深入浅出Windows驱动开发》第一个例子在Win7下蓝屏

    在尝试运行<竹林蹊径 深入浅出Windows驱动开发>的第一个例子-HelloDRIVER时,在XP下没有问题,但在Win7下却发生蓝屏,蓝屏发生点在于卸载函数DriverUnload. ...

最新文章

  1. 公开课 | 详解CNN-pFSMN模型以及在语音识别中的应用
  2. iframe引用页面中的js操作父窗口标签
  3. HTML5 + CSS 左右排版自适应高
  4. java ioexception异常_12. Java IO: 异常处理
  5. leetcode算法题解(Java版)-16-动态规划(单词包含问题)
  6. matlab ann-bp分类器,利用matlab真的BP-ANN分类器设计.doc
  7. java中的过滤器:Filter
  8. oracle获取去年年份_「实战」中文检错纠错之语料获取与处理
  9. mysql导出数据大概得多久_MySQL 导出数据
  10. 南阳oj-----一种排序(set)
  11. 考研和找工作都可以用的简历模板百度网盘链接
  12. metro样式开机启动菜单_如何在Windows 8中获取Metro风格的开始菜单和开始按钮
  13. 超实数系统的单子(Monad)结构
  14. The Evils of Duplication
  15. android 出生日期设置,android-选择出生日期对话框
  16. 未定义标识符ULONG_PTR,BOOL等错误解决方法
  17. 基于LSTM网络的视觉识别研究与实现——详细版
  18. 算法:初探12306售票算法。
  19. 【Qt】QML快速入门7——输入元素
  20. 如何让你pycharm用起来更舒服,看起来更美观

热门文章

  1. Java基于JSP的高校教材管理系统
  2. js根据不同证件进行校验
  3. 西门子S7-1200PLC脉冲控制伺服程序
  4. ERROR: Timeout after 10 minutes ERROR: Error fetching remote repo 'origin'
  5. java毕业设计电力公司员工安全培训系统Mybatis+系统+数据库+调试部署
  6. LinuxShell编程-脑洞实验-脚本小程序
  7. Java:图书管理系统
  8. windows 下 c++ 快速截屏
  9. 二叉树的二叉链表表示与基本操作
  10. [北京]华兴资本招聘初级全栈工程师 (junior full stack developer)