[windows驱动]基本概念
https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff554721
1、设备节点和设备堆栈
在windows中,设备通过即插即用设备树中的设备节点表示。典型地,当设备接受到一个I/O请求,数个驱动帮忙处理这个请求,这些驱动各自与一个设备对象相关,这些设备对象在堆栈中有序排列。一个设备对象序列以及它们各自相关的驱动称为设备堆栈。每个设备节点拥有一个它们自己的设备堆栈。
1.2、设备对象和设备堆栈
一个设备对象是一个DEVICE_OBJECT的实例。pnp树中的每一个设备节点都有一个有序的设备对象列表,每一个设备对象都有一个相关的驱动。这个有序设备对象列表及设备对象的相关驱动组成设备节点的设备堆栈。
我们可以从多个角度来看待这个设备堆栈概念。最普遍的看法是:一个设备堆栈是一个有序的设备对象和驱动的列表;但在有些上下文中,我们认为设备堆栈就是一个有序设备对象列表;而在另一些上下文中,我们认为设备堆栈是一个有序设备驱动列表。
A device object is an instance of a DEVICE_OBJECT structure. Each device node in the PnP device tree has an ordered list of device objects, and each of these device objects is associated with a driver. The ordered list of device objects, along with their associated drivers, is called the device stack for the device node.
You can think of a device stack in several ways. In the most formal sense, a device stack is an ordered list of (device object, driver) pairs. However, in certain contexts it might be useful to think of the device stack as an ordered list of device objects. In other contexts, it might be useful to think of the device stack as an ordered list of drivers.
By convention, a device stack has a top and a bottom. The first device object to be created in the device stack is at the bottom, and the last device object to be created and attached to the device stack is at the top.
In the following diagram, the Proseware Gizmo device node has a device stack that contains three (device object, driver) pairs. The top device object is associated with the driver AfterThought.sys, the middle device object is associated with the driver Proseware.sys, and the bottom device object is associated with the driver Pci.sys. The PCI Bus node in the center of the diagram has a device stack that contains two (device object, driver) pairs--a device object associated with Pci.sys and a device object associated with Acpi.sys.
1.3、如何构建设备堆栈:
在启动过程中,PnP 管理器请求每个总线的驱动程序枚举连接到该总线的子设备。例如,PnP 管理器请求 PCI 总线驱动程序 (Pci.sys) 枚举连接到该 PCI 总线的设备。为了响应此请求,Pci.sys 会为连接到 PCI 总线的每个设备创建一个设备对象。这些设备对象中的每一个都被称为“物理设备对象”(PDO)。在 Pci.sys 创建该组 PDO 不久之后,设备树类似于下图中的一个设备树。

PnP 管理器将设备节点与每个新创建的 PDO 关联,并查询注册表以确定哪些驱动程序需要成为该节点设备堆栈的一部分。设备堆栈必须具有一个(且只有一个)“函数驱动程序”,并且可以选择具有一个或多个“筛选器驱动程序”。 函数驱动程序为设备堆栈的主要驱动程序且负责处理读、写以及设备控制请求。筛选器驱动程序在处理读、写以及设备控制请求中扮演辅助角色。加载每个函数驱动 程序和筛选器驱动程序时,它都会创建一个设备对象并将其自身附加到设备堆栈。由函数驱动程序创建的设备对象称为“函数设备对象”(FDO),由筛选器驱动程序创建的设备对象称为“筛选器设备对象”(筛选器 DO)。现在设备树类似于此图。

在该图中,注意在一个节点中,筛选器驱动程序位于函数驱动程序之上,而在另一节点中,筛选器驱动程序位于函数驱动程序之下。在设备堆栈中位于函数驱动程序之上的筛选器驱动程序称为“上筛选器驱动程序”。位于函数驱动程序之下的筛选器驱动程序称为“下筛选器驱动程序”。
PDO 始终为设备堆栈中的底部设备对象。这缘于设备堆栈的构造方式。PDO 最先创建,并且当其他设备对象附加到堆栈中时,这些对象会附加到现有堆栈的顶部。
[注]:安装设备驱动程序后,安装程序使用信息 (INF) 文件中的信息来确定哪个驱动程序为函数驱动程序,哪些驱动程序为筛选器。通常,INF 文件由 Microsoft 或硬件供应商提供。安装设备驱动程序后,PnP 管理器可以通过查找注册表来确定设备的函数驱动程序和筛选器驱动程序。
1.4、总线驱动程序
在上图中,你可以看到驱动程序 Pci.sys 扮演两个角色。第一,Pci.sys 与 PCI 总线设备节点中的 FDO 关联。事实上,Pci.sys 已在 PCI 总线设备节点中创建 FDO。因此,Pci.sys 为 PCI 总线的函数驱动程序。第二,Pci.sys 与 PCI 总线节点的每个子节点中的 PDO 关联。谨记 Pci.sys 已为子设备创建 PDO。为设备节点创建 PDO 的驱动程序称为该节点的“总线驱动程序”。
如果你的参考点为 PCI 总线,则 Pci.sys 为函数驱动程序。但如果你的参考点为 Proseware Gizmo 设备,则 Pci.sys 为总线驱动程序。此双重角色为 PnP 设备树中的典型。作为总线的函数驱动程序的驱动程序也是总线子设备的总线驱动程序。
1.5、
2、I/O 请求数据包
发送到设备驱动程序的大部分请求都打包在 I/O 请求数据在(IRP)中。操作系统组件或驱动程序将 IRP 发送到驱动程序,方法是调用IoCallDriver,它有两个参数:指向DEVICE_OBJECT的指针和指向 IRP 的指针。DEVICE_OBJECT 具有指向关联DRIVER_OBJECT的指针。当组件调用 IoCallDriver 时,我们说组件将 IRP 发送到设备对象或将 IRP 发送到与设备对象关联的驱动程序。有时,我们使用短语传递 IRP 或转发 IRP 而非发送 IRP。
通常,IRP 由在堆栈中排列的多个驱动程序进行处理。堆栈中的每个驱动程序都与一个设备对象关联。有关详细信息,请参阅设备节点和设备堆栈。如果 IRP 由设备堆栈进行处理,则通常首先发送 IRP 至设备堆栈中的顶部设备对象。例如,如果 IRP 由此图中显示的设备堆栈进行处理,则会首先将 IRP 发送至设备堆栈顶部的筛选器设备对象(筛选器 DO)。

沿着设备堆栈向下传递 IRP
假设 I/O 管理器将 IRP 发送至图中的筛选器 DO。与筛选器 DO 关联的驱动程序 AfterThought.sys 处理 IRP,然后将其传递至功能设备对象 (FDO),该对象在设备堆栈中紧挨设备对象之下。当驱动程序将 IRP 传递至设备堆栈中紧挨设备对象之下的对象时,我们说驱动程序沿着设备堆栈向下传递 IRP。
某些 IRP 沿着设备堆栈一路向下传递至物理设备对象 (PDO)。其他 IRP 从未到达 PDO,原因是这些 IRP 由 PDO 之上的驱动程序之一完成。
IRP 为自包含型
就 IRP 包含驱动程序处理 I/0 请求所需的全部信息而言,IRP 结构为自包含结构。IRP 结构的某些部分包含堆栈中所有参与驱动程序共同的信息。IRP 的其他部分包含特定于堆栈中特定驱动程序的信息。
[windows驱动]基本概念的更多相关文章
- Windows驱动开发入门指引
1. 前言 因工作上项目的需要,笔者需要做驱动相关的开发,之前并没有接触过相关的知识,折腾一段时间下来,功能如需实现了,也积累了一些经验和看法,所以在此做番总结. 对于驱动开发的开发指引,微软 ...
- Windows驱动派遣函数的学习
//派遣处理例程的介绍: //IPR简介: //IRP全称(I/O Request Package),即输入输出请求包.他是windows驱动的重要概念,用户模式下所有对驱动程序的I/O请求,全部由操 ...
- C++第三十三篇 -- 研究一下Windows驱动开发(一)内部构造介绍
因为工作原因,需要做一些与网卡有关的测试,其中涉及到了驱动这一块的知识,虽然程序可以运行,但是不搞清楚,心里总是不安,觉得没理解清楚.因此想看一下驱动开发.查了很多资料,看到有人推荐Windows驱动 ...
- Windows驱动开发(中间层)
Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...
- [windows驱动]内核态驱动架构
1.windows驱动简介: 1.1 windows组件简介: 1.2 windows驱动类型: windows驱动分为两种基本类型: 用户态驱动在用户态下执行.它们一般提供一套win32应用程序和内 ...
- (转)Windows驱动编程基础教程
版权声明 本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括 ...
- [Windows驱动开发](一)序言
笔者学习驱动编程是从两本书入门的.它们分别是<寒江独钓——内核安全编程>和<Windows驱动开发技术详解>.两本书分别从不同的角度介绍了驱动程序的制作方法. 在我理解,驱动程 ...
- windows驱动开发推荐书籍
[作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...
- Windows 驱动开发 - 5
上篇<Windows 驱动开发 - 4>我们已经完毕了硬件准备. 可是我们还没有详细的数据操作,比如接收读写操作. 在WDF中进行此类操作前须要进行设备的IO控制,已保持数据的完整性. 我 ...
随机推荐
- virtualbox虚拟机上安装centOS的网络配置(安装centos时选择桥接网络)
最近接触hadoop,需要在在Linux上面开发,所以我装了一个virtualbox虚拟机,在该虚拟机上面安装了一个centOS系统.linux系统是装好了,但是网络配置却另人头疼.我主要是想让宿主机 ...
- CAS原理全面分析
http://blog.chinaunix.net/uid-22816738-id-3525939.html 上文对CAS各方面原理做了很详细.很明了分析,包括CAS架构.认证协议.安全性.登录.认证 ...
- 当CanTK遇到PhoneGap
有朋友问能不能在CanTK和AppBuilder开发的APP里发送UDP数据,HTML5里只能用HTTPS/HTTP/WebSocket几种通讯方式,要使用UDP需要通过phonegap打包成APK等 ...
- linux笔记:linux常用命令-网络命令
网络命令:ping(测试网络连通性) 网络命令:ifconfig(查看和设置网卡信息) 注意:在查看网卡信息时,直接输入ifconfig命令即可. 网络命令:last(列出目前和过去登入系统的用户信息 ...
- div中字垂直居中对齐
div中的文本水平居中,一般都是用text-align:center;就可以解决,那么垂直居中呢,知道vertiacl-align:middle;但有时候却不起作用:整理下div中文本垂直居中对齐的问 ...
- CentOS 7.x安装配置
简述 VMware可以创建多个虚拟机,每个虚拟机上都可以安装各种类型的操作系统.安装方法也有很多种.下面,主要以ISO镜像安装为例,介绍CentOS 7.x的安装过程及相关的参数设置. 简述 创建虚拟 ...
- 第四周 技术随笔psp
本周psp 类型 内容 开始时间 结束 打断时间 净时间 写随笔 Scrum会议 23:46 00:27 0 41分
- 一些git命令
git push --set-upstream origin release 强制将add的数据提交到 release分支.
- PHP 页面编码声明方法详解(header或meta)
php的header来定义一个php页面为utf编码或GBK编码 php页面为utf编码 header("Content-type: text/html; charset=utf-8&quo ...
- ODBC错误处理
ODBC 中的错误处理 ODBC 中的错误是使用来自每个 ODBC 函数调用的返回值和 SQLError 函数或 SQLGetDiagRec 函数的返回值进行报告的.SQLError 函数用于 ODB ...