DDK_HelloWorld卸载例程细化(驱动学习笔记四)
DDK_HelloWorld卸载例程细化
- 0x0 蓝屏
- 0x1 头文件、cpp文件
- 0x2 PDEVICE_EXTENSION
0x0 蓝屏
- 在编译DDK卸载程序时,误将符号名字写成了设备名,从而导致卸载时直接蓝屏
- 在加载驱动的时候发生蓝屏,使用windbg定位到问题点如下:
pDevobj正常,但是提示pDevExt为空指针从而导致蓝屏,想了想觉得很奇怪,难道是PDEVICE_EXTENSION定义错了?反复查看定义未发现有什么不妥,
但是windbg中也显示pDevobj->DeviceExtension为空,后来左右对比发现如下代码:
在创建设备的时候,DEVICE_EXTENSION的大小竟然为0,难怪会是空指针!
将代码改为如下后,加载驱动便不再蓝屏了:
- 按照《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卸载例程细化(驱动学习笔记四)相关推荐
- 添加卸载驱动例程(驱动学习笔记二)
添加卸载驱动例程 0x0 驱动卸载 管理驱动 工具使用 代码问题 0x0 驱动卸载 管理驱动 卸载驱动其实用简单的命令行就可以做到,或者使用cmd脚本即可,当然工具的便利性毋庸置疑,工具的选择也可以有 ...
- 【嵌入式环境下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 ...
- esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机
arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...
- 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】
目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...
- STM32F103学习笔记四 时钟系统
STM32F103学习笔记四 时钟系统 本文简述了自己学习时钟系统的一些框架,参照风水月 1. 单片机中时钟系统的理解 1.1 概述 时钟是单片机的脉搏,是单片机的驱动源 用任何一个外设都必须打开相应 ...
- MySQL高级学习笔记(四)
文章目录 MySQL高级学习笔记(四) 1. MySql中常用工具 1.1 mysql 1.1.1 连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 ...
- Linux驱动学习笔记
驱动学习笔记 1.字符设备驱动 Linux 驱动有两种运行方式 第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启 动的时候就会自动运行驱动程序. 第二种就是将驱动编译成模块(Li ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)
RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...
最新文章
- Jedis操作Redis数据库
- Softmax函数详解与推导
- python获取当前文件夹下所有文件名
- 理清ThreadLocal、ThreadLocalMap、Thread之间的关系
- LeetCode 977. 有序数组的平方
- 单字节字符集,多字节字符集,Unicode
- 新手小白之学习python一飞冲天日志之—基本数据类型,条件控制语句
- Flask 的路由系统 FBV 与 CBV
- Verilog实现千兆以太网传输
- kodi连接远程服务器,私人影音服务器奶妈级入门篇(1)——Jellyfin for Kodi客户端设置方法...
- 路由器与交换机的关系
- 独木舟上的旅行(贪心算法)
- Oracle练习脚本
- 本文是关于前端开发基本流程的分享
- 小波分解的系数个数如何计算
- Android中解析读取复杂word,excel,ppt等的方法
- java 记事本源代码_JAVA记事本源代码 收藏
- 2019.3.8 提高B组 T2 JZOJ 3055 比赛
- ureport 显示html,Ureport2报表使用问题及注意事项汇总
- 3D大底批量分布处理7.47h注册版
热门文章
- CorelDRAW X4 SP2 简体中文正式版精简增强版
- 手机计算机字体变大,手机字体怎么调大
- 社区发现算法 | Louvain 算法 中的分辨率参数
- matlab画图实例_自定义函数
- 初学STM32之使用STM32CubeMX编写跑马灯程序
- matlab中的imnoise信噪比,matlab语法fn=imnoise(f,'gaussian',0,0.02)是给f添加高斯噪声,其中数值0和0.02分别表示___和___?...
- python项目方案书模板格式_项目策划书格式范文
- 30个外贸业务员常用邮件模板案例分享
- 最全,从小白到交互设计大牛的105条设计原则-附PDF资料
- java统计代码行数