1、CreateFile从r3到r0所调用的函数
CreateFile->ZwCreateFile->NtCreateFile->IoCreateFile->IRP_MJ_CREATE
2、自旋锁和信号量在互斥使用时注意哪些?
使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。中断服务例程中的互斥使用的是自旋锁
3、minifilter与sfilter的区别
解决了重入问题
实现了用户态与核心态双向通信,打破了传统的CDO,共享内存的方式
加载顺序更容易控制、冗余代码更少、兼容性更好
minifilter
流上下文:文件控制块(PCB),一一对应
流句柄上下文:文件对象(FO),一对多
调试
常用命令 https://bbs.pediy.com/thread-178808-2.htm
_asm INT 3; 软件断点
bp 条件断点
!process [PID] 0,查看进程信息
!analyze -v 自动分析当前出错的原因
g 卡住就按
dt DriverObject 查看某个参数的当前值
!dt nt!_* 查看当前内核数据结构
!irql 查看CPU 的IRQL,中断级别
.sympath 看当前符号路径
.cls清屏
lm 当前系统加载的模块和驱动
dv 查看当前参数值
kb 显示堆栈和前三个参数
kp 显示堆栈和参数的完整列表
kn 允许你查看堆栈及其旁边的框架信息
RTLMoveMemory、RTLCopyMemory 区别
一个会内存重叠,一个不会
进程空间32位的为4GB
分为两部分:低2GB,用户空间(进程独立使用)
高2GB,系统空间(共用)
UNICODE_STRING str= RTL_CONSTANT_STRING(L"hello");//字符串赋初值
内核模块并不生成一个进程,只是填写一组回调函数让windows来调用
设备对象是唯一可接收请求的实体,任何一个IRP都是发送给某个设备对象的
驱动对象可以生成多个设备对象
#define PAGEDCODE code_seg(“PAGE”);//分页内存 #define LOCKEDCODE code_seg();//非分页的 #define INITCODE code_seg(“INIT”);
#pragma alloc_text(INIT , DriverEntry);
#pragma alloc_text(PAGE, Other);
INIT 初始化完毕后就被释放
PAGE 可以进行分页交换的内存空间,交换到文件中
默认为 PAGELK 加载后位于不可分页交换的内存空间中
NonPagedPool不分页的内存是永远存在的
DISPATCH_LEVEL及以上 必须用非分页内存
//打印
UNICODE_STREING u;
PUNICODE_STRING pu;
ANSI_STRING A;
kdPrint("%wZ \n",&u);
kdPrint("%ws / %S \n",pu->Buffer);
kdPrint("%Z \n",A);
调用函数时先将参数入栈,再将函数的返回地址入栈
APC 异步过程调用
SSDT 系统服务描述表
DPC 延迟过程调用
MDL 内存服务描述表
NT 新技术
PE 可移植执行体
VPB 卷参数体
为什么windbg看不到微软的驱动
自己的驱动加载的PDB是private PDB,微软的是public PDB,你可以在VS的PDB生成选项里指定是否去除私有信息。区别是 private PDB是完整的包含了代码信息的PDB,比如说局部变量,全局变量,等等,几乎等同于源代码。而public PDB一般只包含函数名称和全局变量