Windows驱动开发技术详解

32位
1、高2G  内核 进程共享
2、字符串、返回类型、USHORT。。。
3、驱动对象 driver object 、设备对象 Device object, 请求 IRP。 
驱动对象生成多个设备对象, 请求发给设备对象
4、 不涉及内存管理、控制台的C Runtime函数 可以使用 但是不提倡
5、开发模型  WDK
6、中断级 Dispatch > Passive
7、字符串的操作  Rtl开头函数  大部分情况下使用的是unicode.. 不保证以‘\0’结束!!!!
8、输出字符传
9、链表
内存分配 申请释放成对出现 否则只能重启解决内存泄露
链表初始化,遍历,节点地址
10、自旋锁
ExInster... 带锁的插入链表节点方式
队列自旋锁 适用多CPU , 适用方法差不多 变函数名
11、注册表、文件、线程
OBJECT_ATTRIBUTES结构体
//文件&注册表
ZwCreateFile ZwRead.... Zw....
ZwOpenkey...
//时间与定时器
KeQueryTickCount...
//线程与事件
PsCreateSystemThread..
12、应用与内核通信
绑定分发函数 判断发给谁  结束请求
控制设备对象-- 暴露给应用使用 CDO
设备请求功能号
DeviceIoControl...
应用发给驱动:
取缓存区数据
驱动发给应用:
待发送数据放入链表中缓存
KeSetEvent() 设置同步事件
阻塞应用层调用

13、内核事件同步 阻塞应用程序的调用 必要的安全判断
14、32和64系统的差异
文件系统的重定向(64位系统) 32位程序调用System32下的Dll时会被WOW64子系统拦截重定向到SysWow64目录
注册表重定向
关闭重定向与开启重定向
WIN64 PatchGuard模块限制了Hook和功能
===========开发篇=======================
15、串口过滤
生成虚拟设备对象 IoCreateDevice(...)
绑定真实设备 根据设备名字绑定/根据设备指针绑定
分发函数中确定 发送目标是不是本设备驱动
处理请求


16、键盘过滤
找到所有键盘设备
应用设备扩展
注意动态卸载
注意动态卸载
注意动态卸载
也可以修改已存在的设备对象分发函数
InterlockedExchangePointer(...)原子操作替换分发函数
类驱动是指统管一类设备的驱动(USB键盘, PS/2键盘....)
端口驱动是类驱动下与具体硬件交互的驱动(USB键盘为Kbdhid, ps/2键盘是i8042prt)
17、中断
IDT 中断描述表 (保存首地址)
IRQ 硬件中断 IRQ1 PS/2键盘中断 IRQ2  某个硬件中断.......
多核心CPU有多个IDT。。
汇编指令可以得到 IDT地址
PS/2的中断在0x93 可替换中断函数 (单核)
18、虚拟磁盘
设置config变量(WDF_DRIVER_CONFIG config)
WdfDriverCreate(..)函数是使用任何WDF框架提供的函数之前必须调用的一个函数
WdfDeviceInitSetDevicetype(..)设置设备类型FILE_DEVICE_DISK
..... 真他妈复杂.....
19、FAT12/16文件系统
MBR。 Master Boot Record(主引导记录) 位于第一个扇区, 起始处是一段程序,后面是一个硬盘分区表
DBR。 DOS Boot Record(操作系统引导记录),位于MBR硬盘分区表的起始分区的第一个扇区,包括有效的引导程序....,引导程序用来加载真正的操作系统
(接上一行)BPB。 数据描述区,记录了这个分区的众多信息,用来为这个逻辑盘建立文件系统
FAT。 File Allocation Table(文件分配表),位于DBR之后,实际是一个链表,0 ,1 保留。每项编号是磁盘上的一个簇,内容是下一个簇编号。这样的链表代表了一个文件在磁盘上的簇
FAT12索引值上限4096, FAT16索引值上限65536 (也就是可索引多少个簇)
格式化磁盘。。。。初始化DBR区。。。
磁盘的DeviceIoControl 控制
20、 磁盘过滤
......
21、 文件系统的过滤与监控
文件系统过滤的目标是捕获Windwos对文件/目录的 创建、打开、删除、读写
控制设备对象、卷设备对象(一个逻辑盘一个对象,由文件系统生成)、
1 生成CDO 控制设备对象(注意路径)
2 分发函数
3 快速IO分发函数 与普通的分发函数目前只是效率上的区别
4 编写一个文件系统变动的回调函数 动态绑定和静态绑定函数混用 兼容各版本操作系统
5 IoRegisterFsRegistrationChange 可以注册一个当文件系统变动时的回调函数(注意文件系统激活的意思)
6 编写默认分发函数
7 处理文件控制请求


文件系统识别器 避免没使用到的文件系统占用内核内存, 当对应的文件系统被加载 识别器就会被卸载
生成过滤设备、绑定控制设备,控制请求。主功能号IRP_MJ_FILE_SYSTEM_CONTROL下有不同的次功能号
由真实设备获取有效的VBP指针
IRP完成时调用回调函数绑定卷设备
工作线程
绑定卷
22、解析IRP 
对IRP完成后感兴趣 则挂上回调函数
不感兴趣  -- 直接跳过/返回完成
用StorageDev(扩展设备)判断是不是卷设备的读写请求
23、文件的打开与关闭
在打开文件时获得文件信息并保存下来 在文本被关系时删除这些信息
FILE_DIRECTORY_FILE标记是否为目录文件
24、路径过滤
在文件打开后获取路径
在读写改时获取文件路径 直接调用ObQueryNameString容易死机 , 向下发送IRP可以
把sfilter编译成静态库文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值