Windows 驱动入门

date
Aug 11, 2023
slug
getting-started-with-windows-drivers
status
Published
tags
Windows Internals
Drivers
summary
这篇内容介绍了在Windows上开始使用驱动程序的一些基本知识。它包括了从用户模式(R3)到内核模式(R0)的API调用示例,以及如何创建和调试驱动程序。文章还提到了与驱动程序开发相关的一些概念,如IRP(I/O Request Packet)和不同的驱动程序开发框架(如WDM、KMDF、UMDF等)。最后,文章提到了一些准备工作和安装驱动程序的步骤,以及如何进行符号配置和源代码调试。
type
Post

前置知识

R3 和 R0

notion image

API 从 R3 到 R0

notion image
Nt* 和 Zw* 的区别参考:

SSDT(System Service Descriptor Table)

SSDT表中存放在一组服务函数, 通过该表找到该API在执行体 (Executive)(ntoskrnl.exe)中导出函数的位置,最终调用系统功能。
notion image

Windows IO 模型

内核模式驱动程序通过一个保护子系统对最终用户进行隐藏,该子系统实现了一个已经熟悉的编程接口,例如Windows或POSIX。设备仅对用户模式代码可见,包括受保护的子系统,但只作为由I/O管理器控制的具名文件对象。具体关系可以看下图:
notion image
下面官方有个图,来描述从 subsystem 中打开一个文件的过程:
notion image
具体到 IO 是怎么做的,可以看下面这个图:
notion image
可以看到,整个过程都是使用 IRP 来传输信息的。简化下:
notion image
模型中我们需要关注三个概念:
  1. I/O 请求使用 IRP 从用户空间发送到驱动程序
  1. I/O 管理器(I/O manager)为所有内核模式驱动程序提供一致的接口。
  1. 此 I/O 管理器为每个已安装和加载的驱动程序创建一个驱动程序对象( driver object)。

IRP

notion image
IRP 在驱动开发过程中不可避免的,除了 DriverEntry,还有我们的 R0 和 R3 通信,也是利用 IRP 来进行的。具体可以参考:

驱动类型

notion image
具体分类可以看:

主要开发框架

框架名称
解释
使用场景
Windows Driver Model (WDM)
用于Windows 98到XP的统一驱动模型
通用硬件驱动开发
Kernel-Mode Driver Framework (KMDF)
WDF的一部分,用于内核模式驱动开发
需要直接与硬件交互的驱动程序
User-Mode Driver Framework (UMDF)
WDF的一部分,用于用户模式驱动开发
需要在用户模式下运行的驱动程序
Network Driver Interface Specification (NDIS)
网络驱动开发框架
网络适配器和相关硬件的驱动开发
Windows Display Driver Model (WDDM)
图形显示驱动模型
显示和图形卡驱动开发
Miniport Drivers
与通用端口驱动程序一起用于特定类型的硬件接口
特定硬件如SCSI、网络设备的驱动开发
Class Drivers and Function Drivers
类驱动程序用于控制一类设备,功能驱动程序针对特定设备
例如,USB类驱动程序可控制所有USB设备,功能驱动程序可针对特定USB摄像头

上个手

0. 准备工作

1. 写代码

2. 调试

  • 安装驱动
  • Windbg 附加
  • 符号配置、源配置
  • 断点

3. 签名

参考文档

  1. 通过驱动接触win内核-编程技术-看雪-安全社区|安全招聘|kanxue.com
  1. https://bbs.kanxue.com/thread-275999.htm
  1. https://learn.microsoft.com/zh-cn/windows-hardware/drivers/kernel/handling-irps
 
 

© Frend Guo 2022 - 2024