《Win7设备驱动程序开发》学习笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Sagittarius_Warrior/article/details/51672107

        《Windows 7 设备驱动程序开发》是美国Ronald D. Reeves著的一本关于WDF模型的Windows 驱动程序开发教程,适用于Win7和Win10。本文我学习该书的一些笔记,目前主要是一些知识点的索引,通过本文可以迅速找到对应知识点的章节,后续将增加知识点的讲解和个人理解以及扩展链接。内容如下(不断更新中):


-------------------------------------------------------------------------------------Chapter 12 编写KMDF硬件驱动程序-----------------------------------------------------------------
1,设备中断    P177
    创建中断对象 WDFINTERRUPT

2,映射资源    P184
    1)PrepareHardwar和ReleaseHardwar两个回调函数,提供一个在设备进入操作(DO)状态之前和离开操作(DO)之后的准备好硬件的方法。
2)枚举期、资源重新均衡的加电期,调

    




-------------------------------------------------------------------------------------Chapter 11 为WMI支持编写程序-----------------------------------------------------------------






-------------------------------------------------------------------------------------Chapter 10 为即插即用和电源管理编写程序-----------------------------------------------------------------






-------------------------------------------------------------------------------------Chapter 9 为KMDF编写程序-----------------------------------------------------------------
1,KMDF示例程序描述列表    P136
2,WDM示例程序与KMDF示例程序比较    P139
3,KMDF程序中两个重要的宏    P140
    1)PAGED_CODE    -- 可以让驱动程序断定函数是在在IROL_DISPATCH_LEVEL及以上的级别调用的。
2)UNREFERENCED_PARAMETER    -- 它禁用某个未引用参数的编译器警告。

4,KMDF驱动程序的结果和概念    P140
    1)所有KMDF驱动程序都创建了一个WDFDRIVER对象和代表每个设备的WDFDEVICE对象。大多数驱动程序还创建了一个或多个表示驱动程序IO队列的WDFQUEUE对象。
2)所有KMDF对象的创建方法都是:使用KMDF初始化方法和对象创建方法。
3)所有KMDF对象都有一个或多个对象上下文区。

5,KMDF对象创建:    P141
    1)初始化对象配置结构config
2)初始化对象特性结构attribute
3)调用对象创建方法。

6,对象上下文区context    P142
    1)对象context是与特定实例相关的数据;
2)对于设备对象,context等价设备扩展。
3)KMDF删除对象时,context会连同被删除。

7,IO队列
    KMDF的队列管理那些针对驱动程序的请求。任何队列最重要的特征是其接受的请求类型(read/write/ioctl)、调度这些请求的方式(sequential/parallel),
以及KMDF是否处理这些队列的电源管理。驱动程序为每个队列指定以下内容:
1)放在队列中的IO请求类型。例如:Set the Write Queue forwarding for IRP_MJ_WRITE requests.
2)队列的调度方法。WDF_IO_QUEUE_CONFIG_INIT
3)队列的电源管理选择。
4)注册IO事件回调函数,以处理来自队列的IO请求。
5)队列是否接受具有零长度缓冲区的请求。


8,最小的KMDA驱动程序:Simple Toaster    P143 目录:***\toaster\toastDrv\kmdf\func\simple
    1)DriverEntry例程,它创建驱动程序对象。
   创建一个驱动程序对象,事实上就是向KMDF注册该驱动程序。
注册EvtDriverDeviceAdd回调函数,让KMDF在设备枚举期间调用。
初始化事件跟踪(可选)
在驱动程序级分配资源(可选)
2)EvtDriverDeviceAdd回调函数,它创建设备对象、设备接口和默认的IO队列。
   创建设备对象WDFDEVICE和context.
为驱动程序的即插即用和电源管理回调函数设置入口点。
创建设备接口。GUID
配置和创建一个或多个IO队列。
创建中断对象(可选)。
3)用于read/write/ioctl请求的IO回调函数。

9,创建设备接口的三种方法    P148
    1)用户模式安装应用程序,可以使用SetupDi函数创建接口。
2)INF可以通过包含DDInstall.Interfaces节来创建接口。
3)驱动程序可以调用WdfDeviceCreateInterface来创建接口。


10,默认IO队列
    默认IO队列处理所有的IO请求,包括read/write/ioctl,但不处理create请求

11,IO请求的缓冲区    P150
    1)使用WDFMEMORY对象代表缓冲区,会相对简单一些,框架会处理验证和寻址问题。
2)获得WDFMEMORY对象句柄的方法:WdfRequestRetrieveOutputMemory读请求、 WdfRequestRetrieveInputMemory写请求。
3)处理读请求:WdfMemoryCopyFromBuffer 从驱动程序的buffer或设备buffer将数据拷贝到WDFMEMORY对象中。
4)处理写请求:三个选择WdfMemoryCopyToBuffer、WdfRequestRetrieveInputBuffer、WdfMemoryGetBuffer。


12,Featured Toaster扩展Simple Toaster
    1)文件创建和关闭请求;
2)其他设备对象属性;
3)即插即用和电源管理。
4)wmi


13,如何处理“createfile”?    P151
    可使用KMDF的默认函数即可。如需注册,需调用一些DDI,如WDF_FILEOBJECT_CONFIG_INIT







-------------------------------------------------------------------------------------Chapter 8 内核模式的安装和生成-----------------------------------------------------------------
1,WDK生成工具 P119
2,输出文件:    P120
    TargetName.sys    -- 驱动程序二进制文件
SourceFileName.obj    -- 对象文件
TargetName.pdb    -- 符号文件(符号表)
TargetName.inf    -- 项目INF文件


3,Toaster工程文件解析 P121
    1)source文件的宏和环境变量

4,安装KMDF驱动程序    P123
    1)安装包:sys文件、辅助安装程序DLL、INF文件、数字签名目录(.cat)文件。共4个文件

5,WDF调试程序扩展命令    P132






-------------------------------------------------------------------------------------Chapter 7 即插即用和电源管理-----------------------------------------------------------------
1,功能或过滤设备对象的启动顺序  P106
    该表从底部的“插入设备”开始,由下而上执行,简述如下:
插入设备 -> 创建设备对象(EvtDriverDeviceAdd) -> (Option)改变资源需求 (EvtDeviceRemoveAddResource)->
准备为硬件供电(EvtDevicePrepareHardware) ->  通知驱动程序状态发生改变( EvtDeviceD0Entry) ->
连接中断 (EvtInterruptEnable、EvtDeviceD0EntryPostInterruptsEnabled) ->
启用DMA(EvtDmaEnableFill、EvtDmaEnablerEnable、EvtDmaSelfManageIoStart) ->
关闭唤醒信号 -> 启动电源管理队列 -> 启动自管理IO

2,物理设备对象的启动顺序 P107
    设备插入 -> 枚举子设备(EvtChildListCreateDevice) -> 报告资源需求(EvtDeviceResourceQuery) ->
创建设备对象(EvtDriverDeviceAdd)。。。

3,设备电源关闭和移除顺序 P108
    P109设备意外移除顺序

4,同步问题 P112 
    同步范围:KMDF对多类对象的回调函数提供可配置并发控制。对象的同步范围将决定KMDF是否同时在对象上调用某些事件回调。
设备范围、队列范围和无范围。
SynchronizationScope
    每个KMDF对象都可以从其父对象继承范围。在创建对象时,可以在WDF_OBJECT_ATTRIBUTES结构体中指定范围。

5,执行级别 P114
    默认执行级别、被动执行级别(WdfExecutionLevelPassive)、调度执行级别(WdfExecutionLevelDispatch)


6,锁 P115
    获取与设备对象相关的锁




-------------------------------------------------------------------------------------Chapter 6 内核模式驱动程序概述-----------------------------------------------------------------
Page: 83 - 


Key Points:
1,KMDF驱动程序结构 P86
    1)DriverEntry函数,驱动程序入口函数;
2)EvtDriverDeviceAdd回调函数,在即插即用管理器枚举某个驱动程序的设备时被调用;
3)一个或多个EvtIO*回调函数,处理特定队列中具体的IO请求。


2,设备对象 P87
    PDO FDO和过滤器设备对象


3,WDF对象的方法、属性和事件的命名规则 P90


4,WDF对象的类型、层次结构 P91


5,WDF对象的特性(config)、对象上下文(context or extension) P93


6,WDF对象的创建和删除过程 P94


7,KMDF的IO模型 P95


8,IO请求的类型和IO请求处理函数 P97
    1)创建、清理和关闭请求;
2)读、写、设备IO控制和内部设备IO控制请求;(为每一类请求创建一个队列)
3)IO请求通过IO请求处理程序的流程 P98
4)In-flight动态请求 P99


9,KMDF队列的调度类型:WdfIoQueueDispatchSequential、WdfIoQueueDispatchParallel和WdfIoQueueDispatchManual(手动) P100


10,WDFMEMORY对象与WDFREQUEST对象
    1)WDFMEMORY对象封装为IO请求提供的IO缓冲区;
2)WDFREQUEST对象是IRP的KMDF表示(封装IRP);
3)一个WDFREQUEST对象可以关联多个WDFMEMORY对象;

11,IO目标(IOTARGET对象),驱动程序调驱动程序 P101


12,完成IO请求(WDFRequestComplete)    P104
    1)简述WDFRequestComplete函数中完成的动作和顺序;
2)持有锁时,最好不要调用WDFRequestComplete;

13,访问IRP和WDM结构    P104















-------------------------------------------------------------------------------------Chapter 2 WDF体系结构-----------------------------------------------------------------
Page: 6 - 22


Key Points:
1,WDF驱动程序模型 P8
2,WDF对象模型 P9
    属性(Attibute)、方法(method)和事件(event)
3,内核对象模型 P10
    WDFDRIVER    WDFDEVICE    WDFQUEUE...

4,即插即用和电源状态管理


5,IO请求流程 P14


展开阅读全文

没有更多推荐了,返回首页