当前位置: 首页 > news >正文

Windows驱动开发系列(1)竹林蹊径这本书有哪些值得看的部分

全文使用Markdown编写,具体请看Markdown 菜鸟教程
一些天天看的概念:WDM / NT 驱动(都是老驱动,淘汰掉了)KMDF/UMDF才是现代化的驱动,本文讲述的是NT或者WDM

这本书阅读宗旨:《竹林蹊径》代码和工具全部已过时,WDM已经过时,KMDF才是现代精髓。

1.1 从Helloworld开始

  • P2
    • 看一下代码示例1-1
    • 重点关注两个入参DriverObject以及RegistryPath
  • P3
    • 驱动程序编译后是.sys文件,属于PE文件格式的一种。延伸:.dll、.exe 也属于微软PE文件格式
    • NTDDK.h是NT驱动的头文件,延伸:Windows驱动开发(一)序言
    • DriverEntry是入口函数,类似于Win32编程的WinMain函数或者Dll编程的DllMain函数
    • DriverObject是驱动对象的指针,RegisteryPath是注册表子键的字符串指针
    • __in和__out只是宏定义,没有任何有效的含义。
  • P4
    • DbgPrint是C语言的printf函数,需要借助别的工具才能看到
    • 如何编译?需要微软的WDK,详情请看第二章

1.1.1 HelloDRIVER

  • P4
    • HelloDriver 头文件
    • 注意结构体DEVICE_EXTENSION有三个成员,设备对象+设备名称+符号链接名称(这个不知道干嘛的)
    • 还有几个函数DriverEntry DriverUnload DefaultDispatch
  • P5 P6 P7 P8
    • 这4页是源代码文件,每个函数,每一行代码都要自问自答解释一遍,看不懂的往后面翻有解释

1.1.2 代码解释

  • P9
    • 提到一本书编程匠艺--编写卓越代码和代码大全
    • 这里提到 P4-helloDriver.h中的结构体DEVICE_EXTENSION是自定义的,不是官方的
    • 有用的是016-018行的解释。这里有点晦涩,举三个具体的实例秒懂。
    #pragma alloc_text(INIT, DriverEntry) // DriverEntry 只在初始化时调用 → INIT
    #pragma alloc_text(PAGE, DispatchCreate) // 普通派遣函数 → PAGE(可省略,就是可以完全不用加#pragma)
    #pragma alloc_text(NONPAGED, MyIsr) // 中断服务例程 → NONPAGED
    
    • 027行 DriverEntry是由操作系统内核的I/O管理器调用
  • P10
    • 039行KdPrint是对DbgPrint的宏封装,在Release中自动移除
    • Debug和Release在驱动中被称为:Check和Free版
    • 041行 UNREFERENCED_PARAMETER是一个宏,避免警告,这在内核开发中是个好习惯
    • 043行 RtlInitUnicodeString(&deviceName, L"\Device\HelloDriver");微软内核采用UnicodeUnicode/UTF-8科普
    • 046-049行 遍历所有派遣函数,max=IRP_MJ_MAXIMUM_FUNCTION 指定默认派遣函数
    • 051行 卸载函数,如果你不卸载可以不提供
    • 052-055行 提供的创建、关闭、读、写函数
  • P11
    • 058行 IoCreateDevice创建设备对象,重点关注设备类型FILE_DEVICE_UNKNOWN独占设备
    • 070行 BUFFERED_IO和DO_DIRECT_IO代表了两种缓冲区处理方式
    • 079-085使用IoCreateSymbolicLink创建了设备符号链接,这个符号连接是用来和应用程序通信
    • 驱动设备的设备名称,应用程序不知道,只能用符号链接和驱动通信
    • 098行 在DriverUnload中要释放哪些资源,设备对象是一个链表,需要遍历释放符号链接和设备对象
    • 031行 在DefaultDispatch中直接完成输入输出请求包,IRP
      小结 以后这种对代码的说明看代码即可,上面的这一堆就凑合看看,算是踩坑

1.1.3 驱动程序的编译和安装 【跳过】

http://www.zskr.cn/news/54365.html

相关文章:

  • 2025年抓斗清污机制造厂权威推荐榜单:格栅式清污机/耙斗式清污机/耙齿清污机源头厂家精选
  • K8S集群1.30版本怎么执行命令进入容器
  • python学习笔记-基础功能和场景功能
  • 一文读懂 PG18 EXPLAIN 新字段:Index Searches
  • 领嵌iLeadE-588边缘计算网关
  • 2025年CAN通讯汽车喇叭定做厂家权威推荐榜单:客运汽车喇叭/电动汽车喇叭/货运汽车喇叭源头厂家精选
  • 2025年11月全年度食品/产品/体系认证机构权威推荐榜单:前十强专业评测与选择指南
  • 和利时MACSV6.5.4 ,Autothink下装失败,工程总控下装失败
  • agc050e 题解
  • AOI检测设备厂家推荐:聚焦高精度表面检测技术应用
  • 邻接链表实战反思:从一次超时错误,看透数据结构的“映射本质”
  • AOI检测设备定制厂家实力解析:工业质量监控技术方案对比
  • 哪些保健品能提高免疫力?常见品类及成分解析
  • 解决4K屏下VMware虚拟机中界面太小问题
  • 国内AI公司估值排行:行业格局与核心企业实力观察
  • 2025 年 11 月活动隔断厂家推荐排行榜,移动隔断,折叠隔断,推拉隔断,电动隔断,玻璃隔断,酒店隔断,办公隔断,会议室隔断,展板隔断公司推荐
  • 为什么求方差和标准差至少需要两个数据点?
  • 2025年一对一家教名师综合能力排行榜,一对一家教/上门家教一对一家教老师推荐排行
  • 34、SQL语句执行顺序
  • (四)收官篇!从分层架构到数据湖仓架构系列:数据服务层和数据应用层及湖仓技术趋势小结
  • 安装rustdesk 远程服务
  • 2025 最新卷帘门源头厂家推荐排行榜,电动 / PVC 快速 / 钢质 / 防火 / 车库卷帘门优质厂家精选
  • 效率神器 Listary Pro v5 经典版:下载资源、激活码与使用教程 (亲测可用)
  • 40、IF NOT EXISTS 条件判断子句
  • 图像概念与作用
  • Docker - 部署 RustFS 对像存储
  • 如何查看Tailscale是否P2P 直连及Openwrt upnp设置
  • Kafka 如何保证精确一次性消费?
  • 2025年黄麻地毯公司口碑推荐榜单:前十强深度解析
  • 2025年山东租赁直臂升降车服务商权威推荐榜单:山东租赁直臂车公司/山东租赁柴油直臂车服务/山东租赁电动直臂车企业精选