Windows内核原理与实现之Windows设备驱动程序

article/2025/10/5 16:54:19

文章摘录自《Windows内核原理与实现》一书。

设备驱动程序是操纵设备的内核模块,I/O 管理器、即插即用管理器和电源管理器都需要与设备的驱动程序打交道。

在Windows I/O 系统中,设备驱动程序不仅为操作系统提供了支持各种 I/O 设备的能力, 也是 Windows 内核本身扩展的基础。Windows 可以动态地加载或卸载设备驱动程序,通过这些驱动程序来调整或扩展内核的功能。 Windows I/O 系统规定了设备驱动程序应遵循的接口, 这组接口是通用的,可适用于所有的内核模式驱动程序。设备驱动程序依据用途不同,可以分为以下三类:

1.即插即用驱动程序,也称为 WDM驱动程序。 它们通常为了驱动硬件设备而由硬件厂商提供,与 Windows的 I/O 管理器、即插即用管理器和电源管理器一起工作。Windows 自身携带了大量即插即用驱动程序,用于支持各种常见的存储设备、视频适配器、网络适配器以及输入设备等。

2.内核扩展驱动程序,也称为非即插即用驱动程序。它们扩展内核功能,或者提供了访问内核模式代码和数据的一种途径。它们并没有集成到即插即用管理器和电源管理器的管理框架中。早期的 Windows NT 驱动程序(在引入即插即用机制以前)都属于这一类类型,现在仍然有大量的内核扩展驱动程序。

3.文件系统驱动程序。它们接收针对文件的 I/O 请求,再进一步将这些请求转变成正真对于储存设备或网络设备的 I/O 请求,从而满足客户的原始请求。文件系统的驱动程序被放在对象管理器的\FileSystem 目录下,其他的驱动程序放在\Driver 目录下。

Windows 驱动程序模型 (WDM) 在 I/O 模型中增加了对即插即用、电源管理和 Windows 管理规范(WMI)的支持。而且,遵从 WDM 的驱动程序在 Windows 平台(包括 Windows 98/Windows 2000 以后的所有版本) 上至少是源代码兼容的,甚至也可能是二进制兼容的。WDM驱动程序又进一步划分成以下三类

1.总线驱动程序。顾名思义,总线驱动程序管理一个总线设备,它负责检测总线上附载的所有设备,并通知即插即用管理器关于这些设备情况。总线驱动程序也负责总线的电源管理。

2.功能驱动程序。功能驱动程序管理具体的设备,在一个设备的设备栈中,功能驱动程序创建的设备对象(即 FDO)相当于操作系统控制该设备的逻辑接口。功能驱动程序是实际管理该设备的功能模块。

3.过滤驱动程序。在设备栈中,过滤驱动程序位于功能驱动程序之上或之下,它的用途是:监视一个设备的 I/O 请求以及这些请求的处理情况,或者,增加或改变一个设备或另一个驱动程序的行为。例如,病毒扫描工具常常利用过滤驱动来监视被读写的文件数据。

在WDM中,总线式可供其他设备附载的设备,其中既有像 PCI 和 SCSI 这样的物理总线设备,也有像 HAL这样的虚拟总线设备。总线驱动程序负责检测总线上的设备,并且协助即插即用管理器列举这些设备,而且它也控制该总线的物理配置。相反地,功能驱动程序要简单得多,通常只是控制一个设备的硬件而已。

在即插即用管理器列举得到的设备树中,每个设备节点都包含一个设备栈,设备栈中的各个设备对象分别由对应的驱动程序创建和实现。图 6.12 显示了不同类型WDM驱动程序在设备栈中的角色,以及它们之间的关系。

每个设备对象都是由对应的驱动程序创建的,设备的 PDO 是由总线驱动程序创建的,而 FDO 是由功能驱动程序创建的。在PDO和FDO之间,紧挨着PDO,可以由零个或多个总线过滤设备对象,他们由相应的总线过滤驱动程序创建。在总线过滤设备对象和 FDO之间,可以有零个或多个下层过滤设备对象。而在 FDO 之上, 则可以有零个或多个上层过滤设备对象。这些下层或上层过滤设备对象分别由相应的下层或上层过滤驱动程序创建。WDM规定了这样的设备栈结构,即合理地让参与其中的每个驱动程序实现它所负责的那部分功能,也提供了足够的扩展性,允许过滤驱动程序在不同层次上监视或修正一个设备的工作方式。

对于一个具体的设备而言,FDO代表了它对操作系统的逻辑接口。功能驱动程序往往会创建一个代表相应 PDO 的设备接口(通过I/O 管理器函数 IoRegisterDeviceInterface),因而应用程序或内核其他部分可以通过此设备接口与该设备打交道。对于一些复杂而又通用的设备,例如磁盘设备和网络适配器等,功能驱动程序又被进一步分成多个独立的驱动程序,由它们联合起来管理该 FDO 的 I/O 请求。在这一层意义上, WDM 驱动程序对硬件的支持可以进一步划分为类驱动程序(class driver)和端口驱动程序 (port driver),以及小端口驱动程序(miniport driver).类驱动程序实现了某一种类型的设备的 I/O 处理。对于已经标准化的设备类型,比如磁盘、网络适配器等,提供一个类驱动程序可以为不同厂商生产的设备实现通用的服务。端口驱动程序实现了与某一类型 I/O 端口相关的 I/O 处理,它们并不遵从驱动程的接口请求,而只是一些内核模式的辅助例程。小端口驱动程序则实现了驱动某一特定设备而需要的 I/O 服务。类驱动程序和小端口驱动程序的分工可以看成是针对一个或一类设备的 "通用" 和 "特殊" 的功能部分。类驱动程序实现的是 "通用" 或 "公共" 的 I/O 服务,而小端口驱动程序实现的是针对某一特定设备的 “特殊” 功能部分。


http://chatgpt.dhexx.cn/article/sX55gXAY.shtml

相关文章

Windows内核的基本概念

Windows内核的基本概念 1 处理器模式 Windows使用 0 和3 两种特权级。0 表示CPU处于内核模式(kernel mode);3 表示用户模式(user mode)。 1.1 内存管理 Windows 将32位虚拟内存空间按照0~4 GB的线性地址空间看待。其中2~4GB是所有进程共享的,为系…

Windows内核--源代码在哪里?(1.1)

大部分人能看到这篇帖子, 想必已经用过Windows系统多年了... 微软官方并不完全公开源代码 想清楚Windows技术内幕,就需要逆向工具。幸运的是: WRK源代码(Windows Research Kernel) (XP/Server 2003)Windows 2000源代码(Kernel和用户层) 深入解析Windows操作系统(最…

windows内核驱动开发(WDK环境搭建)

去官网下载WDK安装包和Visual Studio 下载 Windows 驱动程序工具包 (WDK) - Windows drivers | Microsoft Docs 首先安装Visual Studio 这个就不用我介绍了怎么安装了。 下面直接下载步骤二和步骤三的SDK和WDK。 SDK下载地址 WDK下载地址 注意下载的SDK和WDK版本需要统…

Windows内核--子系统(3.5)

到底什么是子系统? 子系统是用户层概念。在Windows内核之上,如果想要执行类UNIX应用程序,就是POSIX子系统,如果要类似OS/2环境,就是OS/2子系统。 如何能模拟出不同子系统呢? 一般需要子系统用户态应用程序和相关DLL支援。 对于W…

无法正常进入Windows也能开启Windows内核调试

1 背景 Windows的启动的早期阶段,大致分为3步:bootmgr,winload,nt内核加载。 下图是Winload阶段的一个报错。 如果出现Windowslogo,一般就是进入nt内核加载了。 我们经常开的调试功能是nt内核加载后的调试。无法调试…

windows内核开发学习笔记二十四:windows内核架构

从上图上可以看出,windows内核主要层次划分为三个层次,以及windows子系统、文件系统、网络、设备驱动程序等几个部分。 硬件抽象层(Hardware Abstraction Layer,简称HAL):主要是把所有与硬件相关联的代码隔…

Windows内核--内核空间和用户空间(3.6)

内核喜欢抽象出句柄给用户空间 句柄, Handle, 表达处理、控制之意。内核不会直接暴露指针给用户空间,这样会增大内核风险。相反,内核抽象出Handle给用户态,不管是文件、进程、线程等对象,通过Handle可以隐藏内核细节,统…

Windows内核基础之权限级别

权限级别是CPU中的一个概念,CPU中包含4个权限级别,分别是0环,1环,2环,3环,CPU设计制造商最初希望0环用于运行内核,1环和2环运行设备驱动,3环运行应用程序,但是系统设计者…

Windows内核--调试内核源代码(1.5)

Kernel编译和普通应用程序编译有差异吗? 最终Kernel二进制档是给CPU执行的,只要用普通的C编译器能正常编译出给CPU执行的二进制程序即可,从编译角度,内核和应用程序无差别。Windows内核是exe文件。 内核与用户应用程序运行环境有…

Windows内核驱动Hook入门

文章目录 Hook框架选择基于微软规范的框架微软规范以外的框架简单介绍一下InfinityHook 获取内核中的函数地址内核中导出的函数内核未导出的函数获取 SSDT ShadowSSDT 地址获取系统服务号手动获取获取并判断系统版本 代码自动获取 获取GUI相关的函数地址,还需附加GU…

Windows内核编程(二)-第一个内核程序

第一个内核程序 通过 Visual Studio新建工程 注意事项: 大部分widnows驱动程序都是内核驱动(Kernel Driver),所以本笔记不分"驱动程序"与"内核编程",也不区分"内核模块"(Kernel Module)、“驱动程序”(Drive…

Windows内核原理与实现之Windows研究内核(WRK)

Windows并非一个开放源码的操作系统,但正如上一章所提,Microsoft开放了一份以Windows XP x64和Windows Server 2003 SP1为基础的内核源代码,它可以编译和运行,作为教育科研机构的教学实践和研究的平台使用,称为WRK&…

Windows内核结构

Windows内核结构 第一篇博客,随便写下练练手:) Windows内核总共分为三层: 与硬件直接打交道的这一层叫做硬件抽象层简称HAL,这一层的用意就是把所有与硬件相关联的代码逻辑隔离到一个专门的模块中,从而做到尽可能的独立于硬件平…

WINDOWS内核对象及其理解

一.前言 Windows中有很多像进程对象、线程对象、文件对象等等这样的对象,我们称之为Windows内核对象。内核对象是系统地址空间中的一个内存块,由系统创建并维护,这个内存对象是一个数据结构,维护着与对象相关的信息&a…

windows内核——基石

友链 内存布局 用户内存空间和内核内存空间之间的gap是为了避免不经意的越界而导致安全问题 CPU的初始化 系统启动期间,会对所有的处理器进行初始化操作 大部分初始化操作我们都不必了解,因为你了不了解都不影响你的逆向,毕竟你又不是开发…

Windows内核原理与实现--Windows基本结构概述

一、Windows系统结构概述 1、Windows采用双模式来保护操作系统本身,内核模式和用户模式。在Windows中,用户代码和内核代码有各自的运行环境,而且它们可以访问的内存空间也并不相同。在x86中,内核代码可以访问当前进程的4GB虚拟地址空间,而用户代码只能访问底端2GB虚拟地址…

《Windows内核原理与实现笔记》(一)Windows系统结构和基本概念

Windows内核结构 上图是windows内核的组成结构 如图Windows内核分三层,与硬件直接打交道的是硬件抽象层HAL,这一层把所有与硬件相关代码逻辑隔离到一个专门模块中,从而是上层尽可能独立于硬件平台。HAL是一个独立动态链接库,wind…

windows内核基础

windows分层模型 硬件抽象层屏蔽了硬件实现功能的细节。 IRP为内核层重要的数据结构。 物理地址和虚拟地址 x64的cpu仅仅支持64位地址中的前48位。其中若虚拟地址为内核,则前16位为ffff;若虚拟地址为用户模式,则前16位为0000。用户能看到的…

WebService的工作原理

WebService的工作原理如下: 服务提供者WebService2和WebService3通过UDDI协议将服务注册WebService目录中服务消费者WebService1通过UDDI协议从WebService目录中查询服务,并获得服务的WSDL服务描述文件服务消费者WebService1通过WSDL语言远程调用WebSer…

WebService原理

1、WebService实际上就是两个应用程序之间的远程调用,而且这种调用是跨语言的。 2、应用程序调用WebService的接口,实际上就是解析XML语言。也就是说两个应用程序之间的交流实际上就是通过XML来交流的。 3、WebService内部的实现是基于HTTP协议的&…