《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

《Win7设备驱动程序开发》学习笔记相关推荐

  1. 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术

    本章要点 任何一个应用程序,总是不停的和数据打交道. 瞬时数据:指储存在内存当中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据. 数据持久化技术,为了解决关键性数据的丢失. 6.1 持久化技 ...

  2. 第一行代码学习笔记第二章——探究活动

    知识点目录 2.1 活动是什么 2.2 活动的基本用法 2.2.1 手动创建活动 2.2.2 创建和加载布局 2.2.3 在AndroidManifest文件中注册 2.2.4 在活动中使用Toast ...

  3. 第一行代码学习笔记第八章——运用手机多媒体

    知识点目录 8.1 将程序运行到手机上 8.2 使用通知 * 8.2.1 通知的基本使用 * 8.2.2 通知的进阶技巧 * 8.2.3 通知的高级功能 8.3 调用摄像头和相册 * 8.3.1 调用 ...

  4. 第一行代码学习笔记第六章——详解持久化技术

    知识点目录 6.1 持久化技术简介 6.2 文件存储 * 6.2.1 将数据存储到文件中 * 6.2.2 从文件中读取数据 6.3 SharedPreferences存储 * 6.3.1 将数据存储到 ...

  5. 第一行代码学习笔记第三章——UI开发的点点滴滴

    知识点目录 3.1 如何编写程序界面 3.2 常用控件的使用方法 * 3.2.1 TextView * 3.2.2 Button * 3.2.3 EditText * 3.2.4 ImageView ...

  6. 第一行代码学习笔记第十章——探究服务

    知识点目录 10.1 服务是什么 10.2 Android多线程编程 * 10.2.1 线程的基本用法 * 10.2.2 在子线程中更新UI * 10.2.3 解析异步消息处理机制 * 10.2.4 ...

  7. 第一行代码学习笔记第七章——探究内容提供器

    知识点目录 7.1 内容提供器简介 7.2 运行权限 * 7.2.1 Android权限机制详解 * 7.2.2 在程序运行时申请权限 7.3 访问其他程序中的数据 * 7.3.1 ContentRe ...

  8. 第一行代码学习笔记第五章——详解广播机制

    知识点目录 5.1 广播机制 5.2 接收系统广播 * 5.2.1 动态注册监听网络变化 * 5.2.2 静态注册实现开机广播 5.3 发送自定义广播 * 5.3.1 发送标准广播 * 5.3.2 发 ...

  9. 第一行代码学习笔记第九章——使用网络技术

    知识点目录 9.1 WebView的用法 9.2 使用HTTP协议访问网络 * 9.2.1 使用HttpURLConnection * 9.2.2 使用OkHttp 9.3 解析XML格式数据 * 9 ...

  10. 安卓教程----第一行代码学习笔记

    安卓概述 系统架构 Linux内核层,还包括各种底层驱动,如相机驱动.电源驱动等 系统运行库层,包含一些c/c++的库,如浏览器内核webkit.SQLlite.3D绘图openGL.用于java运行 ...

最新文章

  1. android 不重新加载,android – 返回Activity而不重新创建(不调用onCreate())
  2. 满洲里市智慧教育建设跨入云时代
  3. 从web编辑器 UEditor 中单独提取图片上传,包含多图片单图片上传以及在线涂鸦功能...
  4. 使用Q进行同步的Promises操作
  5. 小案例:编写立方体六个面,合成一张全景图后端
  6. Spring事务管理(注解式声明事务管理)备忘
  7. vmware虚拟化之vswitch详细资料
  8. PaddleOCR问题汇总(1)
  9. Django 分页器 缓存 信号 序列化
  10. 有没有哪里有python电子书_为初学者准备的15本免费Python电子书
  11. 计算机实验室安全知识心得体会,实验室安全知识宣传
  12. idea打包jar程序
  13. 计算机网络拓扑星型结构应用,浅谈计算机网络拓扑结构及其应用.doc
  14. js中的shift()函数
  15. 矩阵满秩分解原理解释
  16. HTML仿腾讯微博首页(Dreamweaver网页作业)
  17. AppleTalk--网络大典
  18. Excel设置自动恢复功能以及数据恢复教程
  19. 书籍记录了我技术的成长历程
  20. 看服务器被入侵如何排查?如何防止服务器被入侵?

热门文章

  1. java-php-net-python-文献资料管理系统计算机毕业设计程序
  2. MPLAB构建项目报错“recipe for target ‘.build-conf‘ failed”
  3. 全面剖析FLASH在线大头贴
  4. php zitian虚拟主机配置_建设网站怎么选择虚拟主机
  5. 从与星瑞格软件的合作看浪潮深化主机生态布局
  6. 优达学城安卓开发(初级 项目:sunshine) 分课时树状图
  7. 1037. Magic Coupon (25)
  8. [内核内存] 伙伴系统4---alloc_pages(内存块分配)
  9. Codeforces Round #626 (Div. 2)
  10. MacOS 重置网络配置