DDK_HelloWorld卸载例程细化

  • 0x0 蓝屏
  • 0x1 头文件、cpp文件
  • 0x2 PDEVICE_EXTENSION

0x0 蓝屏

  1. 在编译DDK卸载程序时,误将符号名字写成了设备名,从而导致卸载时直接蓝屏
  2. 加载驱动的时候发生蓝屏,使用windbg定位到问题点如下:

    pDevobj正常,但是提示pDevExt为空指针从而导致蓝屏,想了想觉得很奇怪,难道是PDEVICE_EXTENSION定义错了?反复查看定义未发现有什么不妥,
    但是windbg中也显示pDevobj->DeviceExtension为空,后来左右对比发现如下代码:

    在创建设备的时候,DEVICE_EXTENSION的大小竟然为0,难怪会是空指针!
    将代码改为如下后,加载驱动便不再蓝屏了:
  3. 按照《Windows驱动开发技术详解》里的代码将HelloDDK编译后,发现每次卸载驱动的时候都会发生蓝屏,使用windbg定位到问题故障点如下:

    根据dbg上查看到的信息发现是存储pLinkName的内存访问错误,反复检查流程,发现逻辑并没有什么问题,同时发现pDevExt->ustrSymLinkName和ustrDeviceName都是异常的内存,因此怀疑是内存已经被释放了?
    我们找到ustrSymLinkName和ustrDeviceName被赋值的地方如下:

    我们发现它们的赋值是在创建设备的过程中进行的,检查创建过程的值发现它们确确实实是被成功赋值了,可是为什么后面又没有了呢?
    我们看到该函数时位于内存标志位INIT的内存区域的

    书上对INIT内存区域的描述是函数只是在加载的时候需要载入内存,但是当驱动程序成功加载后,函数就会从内存中卸载掉,如下:

    我的理解是,如果把CreateDevice函数放在INIT内存区域,函数内的赋值操作也会保存在INIT内存区域,那么在加载驱动的时候,给符号和设备名进行赋值的时候,一起正常。但是加载成功后,该段内存区域即被释放,所以当卸载驱动再次调用该段内存区域时,由于该内存区域已经被释放了,所以导致了蓝屏
    因此,解决办法是,把该函数放到PAGE内存区域,即不再蓝屏
    然而,事情没有结束
    在正常卸载掉驱动后,再次把该函数改到INIT内存区域,卸载驱动也不会出现蓝屏。这是否意味着,真正蓝屏的原因是由于之前内存中还保存着一些东西?按理来说,如果内存中有符号名是无法再次创建驱动成功的。

    真正的原因还待进一步去研究…

0x1 头文件、cpp文件

根据观察到的情况,通常,声明、定义结构体、重定义变量名放在头文件中,具体实现放在CPP文件中

0x2 PDEVICE_EXTENSION

根据源代码调用PDEVICE_EXTENSION时发现始终无法找到该结构体,后来发现原来该结构体需要自己定义,坑爹啊…如下:

typedef struct _DEVICE_EXTENSION
{PDEVICE_OBJECT pDevice;UNICODE_STRING ustrDeviceName;  // 设备名称UNICODE_STRING ustrSymLinkName;  // 符号链接名
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;

TO be continue…

DDK_HelloWorld卸载例程细化(驱动学习笔记四)相关推荐

  1. 添加卸载驱动例程(驱动学习笔记二)

    添加卸载驱动例程 0x0 驱动卸载 管理驱动 工具使用 代码问题 0x0 驱动卸载 管理驱动 卸载驱动其实用简单的命令行就可以做到,或者使用cmd脚本即可,当然工具的便利性毋庸置疑,工具的选择也可以有 ...

  2. 【嵌入式环境下linux内核及驱动学习笔记-(15-1)例程】

    目录 1.在APP直接调用标准文件IO操作I2C(针对学习笔记-15的15.3节) 1.1 mail.c 1.2 mpu6050.h 1.3 mpu6050.c 1.4 Makefile 2.以外称i ...

  3. esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机

    arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...

  4. 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

    目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...

  5. STM32F103学习笔记四 时钟系统

    STM32F103学习笔记四 时钟系统 本文简述了自己学习时钟系统的一些框架,参照风水月 1. 单片机中时钟系统的理解 1.1 概述 时钟是单片机的脉搏,是单片机的驱动源 用任何一个外设都必须打开相应 ...

  6. MySQL高级学习笔记(四)

    文章目录 MySQL高级学习笔记(四) 1. MySql中常用工具 1.1 mysql 1.1.1 连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 ...

  7. Linux驱动学习笔记

    驱动学习笔记 1.字符设备驱动 Linux 驱动有两种运行方式 第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启 动的时候就会自动运行驱动程序. 第二种就是将驱动编译成模块(Li ...

  8. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  9. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  10. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...

最新文章

  1. Jedis操作Redis数据库
  2. Softmax函数详解与推导
  3. python获取当前文件夹下所有文件名
  4. 理清ThreadLocal、ThreadLocalMap、Thread之间的关系
  5. LeetCode 977. 有序数组的平方
  6. 单字节字符集,多字节字符集,Unicode
  7. 新手小白之学习python一飞冲天日志之—基本数据类型,条件控制语句
  8. Flask 的路由系统 FBV 与 CBV
  9. Verilog实现千兆以太网传输
  10. kodi连接远程服务器,私人影音服务器奶妈级入门篇(1)——Jellyfin for Kodi客户端设置方法...
  11. 路由器与交换机的关系
  12. 独木舟上的旅行(贪心算法)
  13. Oracle练习脚本
  14. 本文是关于前端开发基本流程的分享
  15. 小波分解的系数个数如何计算
  16. Android中解析读取复杂word,excel,ppt等的方法
  17. java 记事本源代码_JAVA记事本源代码 收藏
  18. 2019.3.8 提高B组 T2 JZOJ 3055 比赛
  19. ureport 显示html,Ureport2报表使用问题及注意事项汇总
  20. 3D大底批量分布处理7.47h注册版

热门文章

  1. CorelDRAW X4 SP2 简体中文正式版精简增强版
  2. 手机计算机字体变大,手机字体怎么调大
  3. 社区发现算法 | Louvain 算法 中的分辨率参数
  4. matlab画图实例_自定义函数
  5. 初学STM32之使用STM32CubeMX编写跑马灯程序
  6. matlab中的imnoise信噪比,matlab语法fn=imnoise(f,'gaussian',0,0.02)是给f添加高斯噪声,其中数值0和0.02分别表示___和___?...
  7. python项目方案书模板格式_项目策划书格式范文
  8. 30个外贸业务员常用邮件模板案例分享
  9. 最全,从小白到交互设计大牛的105条设计原则-附PDF资料
  10. java统计代码行数