windows驱动面试 基础

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一般只包含函数名称和全局变量

猜你喜欢

转载自blog.csdn.net/feixi7358/article/details/82898547