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驱动]基本概念的更多相关文章

  1. Windows驱动开发入门指引

       1.  前言 因工作上项目的需要,笔者需要做驱动相关的开发,之前并没有接触过相关的知识,折腾一段时间下来,功能如需实现了,也积累了一些经验和看法,所以在此做番总结. 对于驱动开发的开发指引,微软 ...

  2. Windows驱动派遣函数的学习

    //派遣处理例程的介绍: //IPR简介: //IRP全称(I/O Request Package),即输入输出请求包.他是windows驱动的重要概念,用户模式下所有对驱动程序的I/O请求,全部由操 ...

  3. C++第三十三篇 -- 研究一下Windows驱动开发(一)内部构造介绍

    因为工作原因,需要做一些与网卡有关的测试,其中涉及到了驱动这一块的知识,虽然程序可以运行,但是不搞清楚,心里总是不安,觉得没理解清楚.因此想看一下驱动开发.查了很多资料,看到有人推荐Windows驱动 ...

  4. Windows驱动开发(中间层)

    Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...

  5. [windows驱动]内核态驱动架构

    1.windows驱动简介: 1.1 windows组件简介: 1.2 windows驱动类型: windows驱动分为两种基本类型: 用户态驱动在用户态下执行.它们一般提供一套win32应用程序和内 ...

  6. (转)Windows驱动编程基础教程

    版权声明     本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括 ...

  7. [Windows驱动开发](一)序言

    笔者学习驱动编程是从两本书入门的.它们分别是<寒江独钓——内核安全编程>和<Windows驱动开发技术详解>.两本书分别从不同的角度介绍了驱动程序的制作方法. 在我理解,驱动程 ...

  8. windows驱动开发推荐书籍

    [作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...

  9. Windows 驱动开发 - 5

    上篇<Windows 驱动开发 - 4>我们已经完毕了硬件准备. 可是我们还没有详细的数据操作,比如接收读写操作. 在WDF中进行此类操作前须要进行设备的IO控制,已保持数据的完整性. 我 ...

随机推荐

  1. 记录---base64

    什么是Base64呢? Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下 ...

  2. 原!!tomcat7.0 配置数据库连接池 SQLServer2000

    SQLServer2000所需的3个驱动jar包 msbase.jarmssqlserver.jarmsutil.jar 放入WEB-INF lib文件夹中 1.META-INF 创建一个contex ...

  3. Python核心编程-基础

    python编码风格指南:www.Python.org/doc/essays/styleguide.htmlwww.Python.org/dev/peps/pep-0007/www.Python.or ...

  4. panels能否包含views_block ////// panels -- content pane 参数传递

    是可以的包含block,不管是手动在block后台创建的,还是通过views创建的block,都可以在Panel add content的时候添加. ------------ panels 和 con ...

  5. C++ Primer 第三章 标准库类型string运算

    1. 标准库类型 string string表示可变长的字符序列,使用string必须首先包含string头文件.如何初始化类的对象是由类本身决定的. int n; string s1;//默认初始化 ...

  6. git代码提交方式

    https://my.oschina.net/tearlight/blog/193921 <a>github的提交方式      (1)git add .----------------- ...

  7. C#压缩加密和vb压缩加密

    string[] FileProperties = new string[2]; FileProperties[0] = "C:\\a\\";//待压缩文件目录 FilePrope ...

  8. python中cPickle的用法

    import cPickle as p f = file('data.txt' , 'w') data = (1 , 'A' , "hello") p.dump(data , f) ...

  9. PHP基本知识收集

    1.符号“@”的作用 @是可以屏蔽函数执行过程中遇到问题而产生的一些错误.警告信息,这样用户就看不到程序的出错信息.这样除了用户界面会友好一些外,更重要的是安全性,因为屏蔽了出错文件的路径等信息. 2 ...

  10. 436. Find Right Interval ——本质:查找题目,因此二分!

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...