没有合适的资源?快使用搜索试试~ 我知道了~
首页灰狐Windows驱动开发学习笔记:实战指南
灰狐Windows驱动开发学习笔记:实战指南
5星 · 超过95%的资源 需积分: 7 3 下载量 6 浏览量
更新于2024-07-19
收藏 1.74MB DOCX 举报
"灰狐的Windows驱动学习笔记是一份详细的驱动开发教程参考资料,它旨在补充和深化对《Windows 驱动开发技术详解》的理解。这份笔记由一位名叫灰狐的作者编写,他在2005年至2009年间就读于成都信息工程学院,拥有丰富的编程背景和论坛活跃经历。作者通过自己的学习经验和实践,整理了关于驱动开发的关键知识点,如驱动程序的基本原理、编译流程、系统调用接口、设备驱动的安装与卸载、驱动安全性和兼容性等内容。 笔记中强调版权问题,指出该书是免费资源,但要求读者在分享时必须保持原文完整,并且不得用于盈利目的。学习资源可以通过邪恶八进制社区、泡面代码社区和作者的个人博客获取,这些平台提供了下载、交流和互助的环境,同时也提醒读者遵守各自的社区规定。 前言部分提到,灰狐最初只是想分享个人的学习笔记,但得到了风泽大哥的支持,促使他决定整理并发布成电子书,以方便更多人学习。书中涉及的内容广泛,主要基于《Windows驱动开发技术详解》和《Windows驱动编程基础教程》等权威教材,旨在帮助读者系统地理解和掌握Windows驱动开发技术。 这本笔记是一个实用的学习工具,不仅包含基础知识,还可能包含作者的实践经验分享和常见问题解决方案,对于想要深入理解或从事Windows驱动开发的读者来说,具有很高的参考价值。"
资源详情
资源推荐
驱动学习笔记系列文章汇总
在驱动对象 DriverObject 中,有个函数指针数组 MajorFunction,它里面的每一个元素都
记录着一个函数的地址对应着相应的 IRP,我们可以通过简单地设置这个数组将 IRP 与相应
的派遣函数关联起来。诸如 IRP_MJ_CREATE 其实是使用#define 定义的一个宏,比如
IRP_MJ_CREATE 实际上就是 0x00,而 IRP_MJ_CLOSE 则是 0x02 等。
由于在进入 DriverEntry 之 前 ,I/O 管理器会将_IopInvalidDeviceRequest 的地址填满整个
MajorFunction 数组,因此除了我们自行设置过的 IRP 之外,其他的 IRP 都与系统默认的
_IopInvalidDeviceRequest 函数关联。
2.3 创建设备例程
这里我们又遇到了一个新的概念“例程”,其实也不新,驱动中所说的例程实际上就是
函数的另外一种说法,我们毋需过于关心这种细节(实际上例程与函数还是有所区别的,但
我们不作关心)。
创建设备本来是在 DriverEntry 中完成的,不过这里为了讲解方便,我专门将其抽了出
来,下面我们来看看相关代码:
// 创建设备对象
RtlInitUnicodeString(&ntDeviceName, TEST_DEVICE_NAME_W);
Status = IoCreateDevice(
DriverObject,
sizeof (DEVICE_EXTENSION),
&ntDeviceName,
FILE_DEVICE_TEST,
0,
TRUE,
&deviceObject
// DeviceExtensionSize
// DeviceName
// DeviceType
// DeviceCharacteristics
// Exclusive
// [OUT]
);
if(!NT_SUCCESS(Status))
{
KdPrint(("[Test] IoCreateDevice Error Code = 0x%X\n", Status));
return Status;
}
deviceE xtension = (PDEVICE_EXTENSION)deviceObject->DeviceExtension;
// 创建符号链接
RtlInitUnicodeString(&dosDeviceName, TEST_DOS_DEVICE_NAME_W);
Status = IoCreateSymbolicLink(&dosDeviceName, &ntDeviceName);
if(!NT_SUCCESS(Status))
{
KdPrint(("[Test] IoCreateSymbolicLink Error Code = 0x%X\n", Status));
IoDeleteDevice(deviceObject);
return Status;
}
灰狐 [iCoodle] : http://nokyo.blogbus.com
驱动学习笔记系列文章汇总
在上述代码中,我们先来看创建设备对象的代码,首先我们使用 RtlInitUnicodeString
函数来初始化 UNICODE 字符串,关于字符串的用法请参考其他书籍;然后我们调用函数
IoCreateDevice 来完成创建设备对象的功能,该函数返回一个 NTSTATUS 值,有一个宏
NT_SUCCESS 可以很方便地判断这个 NTSTATUS 是否成功。
紧接着我们调用 IoCreateSymbolicLink 创建一个符号链接,符号链接有什么用?这么说
吧,前面我们创建的设备对象虽然有个参数指定了设备名称,但是这个设备名称只能在内核
态可见,也就说 ring3 的应用层程序是看不见它的,因此驱动程序需要向 ring3 公布一个符
号链接,这个链接指向真正的设备名称,而 ring3 的应用程序可以通过该符号链接找到驱动
程序进行通信。实际上我们经常所说的 C 盘、D 盘就是一个符号链接,它们在内核中的真
正设备对象是“\Device\HarddiskVolume1”和“\Device\HarddiskVolume2”。
在内核模式下,符号链接是以“\??\”( 或“\DosDevices\”)开头的,如 C 盘就是“\??\C:”,
而在用户模式下,则是以“\\.\”开头的,如 C 盘就是“\\.\C:”。
2.4 卸载驱动例程
卸载驱动例程是我们在 DriverEntry 中自己定义的,当驱动被卸载时 I/O 管理器负责调
用该例程,它主要做一些扫尾处理的工作。相关代码如下所示:
UNICODE_STRING dosDeviceName;
// 释放其他资源
// 删除符号链接
RtlInitUnicodeString(&dosDeviceName, TEST_DOS_DEVICE_NAME_W);
IoDeleteSymbolicLink(&dosDeviceName);
// 删除设备对象
IoDeleteDevice(DriverObject->DeviceObject);
KdPrint(("[Test] Unloaded"));
上述代码没有难以理解的地方,我们就简单介绍一下代码最后一句的 KdPrint 吧。由于
驱动程序工作于内核态,不像我们控制台的程序一样可以使用 printf 输出一些信息,也不像
Win32 程序可以通过 MessageBox 来弹出一个对话框,它要想输出一些信息,就需要调用
DbgPrint 函数,不过这个函数输出的信息我们无法直接看到,需要使用一些专门的工具,比
如 DbgView 等。
有些内容我们只想在调试版输出,在发行版忽略,因此 DDK 中定义了一个宏 KdPrint ,
它在发行版不被编译,只在调试版才会运行。KdPrint 的用法很奇怪,由于它是这样定义的:
#define KdPrint(_x_) DbgPrint _x_,这就导致了它的用法很奇怪,在使用时最外层要有两个
连续的括号,真不知道 DDK 为啥这样定义,定义的时候就多加一个括号多方便啊。
2.5 派遣例程
派遣例程是处理 IRP 的,为了快速入门,现在我们暂时不处理和 IRP 有关的地方,因
此这里就使用 EasySys 生成的框架,不做修改,第九章我们会详细介绍 IRP 的内容。
灰狐 [iCoodle] : http://nokyo.blogbus.com
剩余47页未读,继续阅读
jhyang0331
- 粉丝: 3
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C语言快速排序算法的实现与应用
- KityFormula 编辑器压缩包功能解析
- 离线搭建Kubernetes 1.17.0集群教程与资源包分享
- Java毕业设计教学平台完整教程与源码
- 综合数据集汇总:浏览记录与市场研究分析
- STM32智能家居控制系统:创新设计与无线通讯
- 深入浅出C++20标准:四大新特性解析
- Real-ESRGAN: 开源项目提升图像超分辨率技术
- 植物大战僵尸杂交版v2.0.88:新元素新挑战
- 掌握数据分析核心模型,预测未来不是梦
- Android平台蓝牙HC-06/08模块数据交互技巧
- Python源码分享:计算100至200之间的所有素数
- 免费视频修复利器:Digital Video Repair
- Chrome浏览器新版本Adblock Plus插件发布
- GifSplitter:Linux下GIF转BMP的核心工具
- Vue.js开发教程:全面学习资源指南
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功