当前位置: 首页 > 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.jsqmd.com/news/44783/

相关文章:

  • 博客到底怎么写
  • 构造题 Codeforces2131H Sea, You copriMe
  • AT AGC004 题解【鸽】
  • 2025年抓斗清污机制造厂权威推荐榜单:格栅式清污机/耙斗式清污机/耙齿清污机源头厂家精选
  • 【Java Web学习 | 第1篇】前端 - HTML - 详解
  • 2025年一拖四中央空调品牌权威推荐榜单:6赫兹中央空调/最值得买的中央空调/中央空调品牌精选
  • 2025年连续梁防落梁装置源头厂家权威推荐榜单:防落梁装置施工/防落梁装置缓冲器/链环式防落梁装置源头厂家精选
  • 运输货物题解
  • K8S集群1.30版本怎么执行命令进入容器
  • 不同行业企业如何选择可观测产品?
  • 2025年青岛暑假预习新高一方案权威推荐榜单:青岛新高一暑假没学习培训/青岛新高三暑假数学方案/青岛新初一衔接班方案服务机构精选
  • 赋能智慧商业:国标GB28181算法算力平台EasyGBS构筑大型商场智慧安防新生态
  • 2025年可观测厂商解析:博睿数据如何领跑全球可观测性市场?
  • Joycode 无法跨项目读取源码怎么办?MCP Easy Code Reader 帮你解决!
  • python学习笔记-argparse
  • Codes 创新的低代码接口测试解决方案,让点工也能做好接口自动化测试且效率起飞
  • 2025年均质乳化机订制厂家权威推荐榜单:分散乳化机/管线式乳化机/乳化设备源头厂家精选
  • GAN生成式对抗网络
  • OBET工具使用说明
  • 2025年湖北皮卡车出租公司权威推荐榜单:湖北出租预警车/湖北出租皮卡车服务精选
  • python学习笔记-基础功能和场景功能
  • 2025年重庆科技展示展厅公司权威推荐榜单:博物馆数字展厅/科技展馆/智能全息展馆源头公司精选
  • 一文读懂 PG18 EXPLAIN 新字段:Index Searches
  • java泛型类型通配符
  • 2025年CAN通讯汽车喇叭定做厂家权威推荐榜单:客运汽车喇叭/电动汽车喇叭/货运汽车喇叭源头厂家精选
  • 领嵌iLeadE-588边缘计算网关
  • 2025年11月全年度食品/产品/体系认证机构权威推荐榜单:前十强专业评测与选择指南
  • 建造者-创建型设计模式
  • 深入解析:FFmpeg 核心 API 系列:音频重采样 SwrContext 完全指南(新API版本)
  • http和https区别如何转https - 详解