原文链接:http://blog.csdn.net/hazy/article/details/481705

WDM中的结构   ---设备扩展

设备扩展(DEVICE_EXTENSION)是与设备对象相关的另一种重要的数据结构。可以用它来保存与特定设备关联的信息。设备扩展其实只是一个未分页的池,由驱动开发者来定义它的大小和内容。并由I/O管理器自动把它分配给设备对象,即设备对象的PVOID DeviceExtension字段。由于此结构是驱动开发者自定义的,所以必须要让系统知道需要给此结构预留多少空间,因此要把设备扩展结构的大小作为参数传递给IoCreateDevice函数。I/O管理器的IoCreateDevice函数将为设备对象和设备扩展对象在非分页内存池内申请内存。

设备扩展一般要包括设备对象的反向指针、设备状态或驱动程序环境信息等,它的布局类似于如下结构:

typedef struct tagDEVICE_EXTENSION {

PDEVICE_OBJECT DeviceObject;          // device object this extension belongs to

PDEVICE_OBJECT LowerDeviceObject;       // next lower driver in same stack

PDEVICE_OBJECT Pdo;                         // the PDO

IO_REMOVE_LOCK RemoveLock;         // removal control locking structure

UNICODE_STRING devname;

. . . . . .

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

设备扩展的内容依赖特定的驱动程序,应该根据驱动程序的需要来定义。

设备扩展主要用来维护设备状态信息、存储驱动程序使用的内核对象或系统资源(如自旋锁)、保存驱动程序需要的数据等。由于大多数的总线驱动、功能驱动和过滤 器驱动都要工作在任意线程上下文,即任意线程都可能成为当前线程,所以,设备扩展是保存设备状态信息和数据的主要空间。

每一个实现了ISR的驱动程序都要存储中断对象(一种内核对象)指针,大部分的驱动程序把它们存储在设备扩展里。每一个标准的驱动程序函数在接收一个IRP时,同时接收到的还有一个指向申请该IO操作的设备对象的指针,此函数能够通过此指针访问到相应的设备扩展。

另外,上一层的设备扩展都保存一个指向下一层设备对象的指针(如上述结构中的PDEVICE_OBJECT LowerDeviceObject字段)作为调用IoCallDriver函数的参数。

在驱动程序中应该尽量避免使用全局变量,因为全局变量会导致不同步的问题,解决办法之一就是可将全局变量存储在设备扩展中,将其作为一个局部变量来使用。

设备扩展(DEVICE_EXTENSION)的更多相关文章

  1. windows驱动开发-设备扩展

    设备对象Device_Object记录通用设备信息,另外一些信息记录在设备扩展里,设备扩展由程序员自己定义,由程序员指定内容和大小,由I/O管理器创建,并保存在非分页内存中. 驱动程序中,尽量避免使用 ...

  2. 《天书夜读:从汇编语言到windows内核编程》六 驱动、设备、与请求

    1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函 ...

  3. USB设备驱动概述

    USB设备驱动 ·  )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...

  4. PCI设备内存操作函数总结

    1.  ExAllocatePool() 函数说明: ExAllocatePool allocates pool memory of the specified type and returns a ...

  5. [11]Windows内核情景分析---设备驱动

    设备驱动 设备栈:从上层到下层的顺序依次是:过滤设备.类设备.过滤设备.小端口设备[过.类.过滤.小端口] 驱动栈:因设备堆栈原因而建立起来的一种堆栈 老式驱动:指不提供AddDevice的驱动,又叫 ...

  6. 802.1X 账号密码+设备信息双重认证

    名词解释 802.1X: IEEE802 LAN/WAN 委员会为解决无线局域网网络安全问题,提出了 802.1X 协议.后来,802.1X协议作为局域网端口的一个普通接入控制机制在以太网中被广泛应用 ...

  7. wdk中ramdisk代码解读

    入口函数,即驱动加载函数 NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) ...

  8. Windows内核 WDM驱动程序的基本结构和实例

    WDM驱动的基本结构: WDM驱动模型是建立在NT式驱动程序模型基础之上的.对于WDM驱动程序来说,一般都是基于分层的,即完成一个设备的操作,至少要由两个驱动设备共同完成. 1)物理设备对象和功能设备 ...

  9. Windows NT驱动程序的基本结构和实例

    Windows驱动程序分为两类:一类是不支持即插即用功能的NT式驱动程序:另一类是支持即插即用功能的WDM驱动程序. NT式驱动的基本结构: 1)驱动加载过程与驱动入口函数DriverEntry: 驱 ...

随机推荐

  1. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  2. CQRS学习——最小单元的Cqrs(CommandEvent)[其一]

    [说明:博主采用边写边思考的方式完成这一系列的博客,所以代码以附件为准,文中代码仅为了说明.] 结构 在学习和实现CQRS的过程中,首要参考的项目是这个[http://www.cnblogs.com/ ...

  3. 【数位DP】bzoj1026: [SCOI2009]windy数

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4163  Solved: 1864[Submit][Sta ...

  4. 【DP/单调栈】关于单调栈的一些题目(codevs 1159,codevs 2673)

    CODEVS 2673:Special Judge 题目描述 Description   这个月的pku月赛某陈没有参加,因为当时学校在考试[某陈经常逃课,但某陈还没有强大到考试也可以逃掉的程度].何 ...

  5. html5 Doctor——教你规范使用html5标签

    学习地址(英文资料):http://html5doctor.com/ http://www.w3.org/html/wg/drafts/html/master/text-level-semantics ...

  6. DEDECMS采集规则,过滤,替换文章内的部分内容

    1.采集去除链接[Copy to clipboard]CODE:{dede:trim}]*)>([^<]*){/dede:trim}---------------------------- ...

  7. HDU1565+状态压缩dp

    简单的压缩状态 dp /* 状态压缩dp 同hdu2167 利用滚动数组!! */ #include<stdio.h> #include<string.h> #include& ...

  8. hdu 4658 Integer Partition

    五角数定理!!可以参考这个http://www.cnblogs.com/xin-hua/p/3242428.html  代码如下: #include<iostream> #include& ...

  9. hibernate 字段名最好不要使用数据库的保留字

    请看如下红色部分,show为mysql的保留字,所以我在hibernate修改show字段值的时候出现错误,原来是show跟mysql的保留字相同了 CREATE TABLE `t_letter` ( ...

  10. linux 模拟延时和丢包

    这是 RHCA 中的一个 BDP 的测试,这也是公司很常用的一种延时和丢包的模拟,现在分享给大家. 我们做的应用软件,还有测试 TCP/UDP  对比,测试 BDP 对 TCP/IP 的影响时,我们都 ...