驱动学习笔记 之 认识驱动架构
1. NT 驱动的构架
1.1 入口函数: DriverEntry
接受两个参数, pDriverObject,该参数有I/O管理器传递. 驱动对象
pRegisterpath ,驱动程序在注册表中的路径
DriverEntry主要实现以下功能:
1,注册其他驱动调用函数的入口:
有DriverUnload,以及一些IRP_MI_XXX消息的处理函数
2.创建驱动设备对象:
首先,创建设备名称 devName,使用RtlInitUnicodeString 初始化该字符串
然后,调用IoCreateDevice函数,创建设备
再然后调用IoSymbolicLink创建符号链接
1.2 关于IRP_MJ_XXX消息的处理函数
接受两个参数, pDevObj:功能设备对象
pIrp :I/0 requset packet
功能: 该系列函数主要是实现对IRP_MJ_XXX进行相应的处理
1.3 关于DriverUnload函数
接受一个参数:PDRIVER_OBJECT pDriverObject
功能: 向系统卸载列程,主要实现对一些资源的释放,比如删除符号链接
2. WDM 驱动的构架
WDM驱动的构架和NT驱动构架大同小异,也是DriverEntry,IRP_MJ_XXX消息的处理,还有DriverUnload函数
主要的差别表现在:
1.创建驱动设备的时候,需要设置AddDevice函数.
2.需要设置对IRP_MJ_PNP的回调函数
3,向系统卸载例程的大部分功能也是在IRP_MN_REMOVE_DEVICE中实现的
1.1 入口函数:DriverEntry
1.2 AddDevice函数
接受两个参数: DriverObject: 从I/O管理器传来的驱动对象
PhysicalDeviceObject: 从I/O管理器传来的物理设备对象
功能: 添加新的设备:(描述如下)
1,创建设备名称 devName,使用RtlInitUnicodeString 初始化该字符串
2,调用IoCreateDevice函数,创建设备
3,用IoAttachDeviceToDeviceStack函数将这个fdo挂接在设备堆栈上,并将返回值记录在设备扩展结构中.
4,最后,调用IoSymbolicLink创建符号链接
1.3 处理IRP_MJ_PNP的函数
接受两个参数: fdo和Irp
功能:对即插即用IRP进行处理,主要是IRP_MN_XXX消息处理. 应注意IRP_MN_STOP_DEVICE 该消息
1.4 处理IRP_MN_REMOVE_DEVICE
接受两个参数:fdo 和 Irp
功能:向系统卸载大部分例程
1.5其他的处理IRP_MJ_XXX函数
1.6 DriverUnload函数