设备扩展(DEVICE_EXTENSION)
原文链接: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)的更多相关文章
- windows驱动开发-设备扩展
设备对象Device_Object记录通用设备信息,另外一些信息记录在设备扩展里,设备扩展由程序员自己定义,由程序员指定内容和大小,由I/O管理器创建,并保存在非分页内存中. 驱动程序中,尽量避免使用 ...
- 《天书夜读:从汇编语言到windows内核编程》六 驱动、设备、与请求
1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函 ...
- USB设备驱动概述
USB设备驱动 · )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...
- PCI设备内存操作函数总结
1. ExAllocatePool() 函数说明: ExAllocatePool allocates pool memory of the specified type and returns a ...
- [11]Windows内核情景分析---设备驱动
设备驱动 设备栈:从上层到下层的顺序依次是:过滤设备.类设备.过滤设备.小端口设备[过.类.过滤.小端口] 驱动栈:因设备堆栈原因而建立起来的一种堆栈 老式驱动:指不提供AddDevice的驱动,又叫 ...
- 802.1X 账号密码+设备信息双重认证
名词解释 802.1X: IEEE802 LAN/WAN 委员会为解决无线局域网网络安全问题,提出了 802.1X 协议.后来,802.1X协议作为局域网端口的一个普通接入控制机制在以太网中被广泛应用 ...
- wdk中ramdisk代码解读
入口函数,即驱动加载函数 NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) ...
- Windows内核 WDM驱动程序的基本结构和实例
WDM驱动的基本结构: WDM驱动模型是建立在NT式驱动程序模型基础之上的.对于WDM驱动程序来说,一般都是基于分层的,即完成一个设备的操作,至少要由两个驱动设备共同完成. 1)物理设备对象和功能设备 ...
- Windows NT驱动程序的基本结构和实例
Windows驱动程序分为两类:一类是不支持即插即用功能的NT式驱动程序:另一类是支持即插即用功能的WDM驱动程序. NT式驱动的基本结构: 1)驱动加载过程与驱动入口函数DriverEntry: 驱 ...
随机推荐
- vs2010 使用SignalR 提高B2C商城用户体验(二)
vs2010 使用SignalR 提高B2C商城用户体验(二) 上一节,已经实现了,当前域内的通信,这一节中,介绍一下跨域的即时通信,既然要做,我们肯定要把这个推送及聊天服务器做为一个单独的服务器,以 ...
- 修改radio、checkbox、select默认样式的方法
样式 radio select checkbox 兼容性 现在前端页面效果日益丰富,默认的input组件样式显然已经不能满足需求.趁着这次开发的页面中有这方面的需求,在这里整理一下修改radio.ch ...
- BZOJ 3160 万径人踪灭 解题报告
这个题感觉很神呀.将 FFT 和 Manacher 有机结合在了一起. 首先我们不管那个 “不能连续” 的条件,那么我们就可以求出有多少对字母关于某一条直线对称,然后记 $T_i$ 为关于直线 $i$ ...
- PAT-乙级-1038. 统计同成绩学生(20)
1038. 统计同成绩学生(20) 时间限制 250 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求读入N名学生的成绩,将 ...
- C++ static、const和static const 以及它们的初始化
转自C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. s ...
- 【leetcode】Word Break (middle)
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- [模拟]ZOJ3485 Identification Number
题意:给了一串15位或18位的身份证号码,求 在改变最少位数的情况下, 输出正确合法的身份证号 合法的身份证 是按照以下规则: 前6位以及“Order code”三位 一定合法 其中X是根据前17位 ...
- Linux C/C++ 编程练手 --- 大数相加和大数相乘
最近写了一个大数相乘和相加的程序,结果看起来是对的.不过期间的效率可能不是最好的,有些地方也是临时为了解决问题而直接写出来的. 可以大概说一下相乘和相加的解决思路(当然,大数操作基本就是两个字符串的操 ...
- Fast scroller styles
<!-- Fast scroller styles --> <!-- Drawable to use as the fast scroll thumb. --> <att ...
- IMX51+WINCE6.0平台缩写意义
1.以EPIT为例 EPIT(Enhanced Periodic Interrupt Timer)为增强型周期中断定时器,其中有CR控制寄存器,要设置CR寄存器的SWR位,代码如下: // Asser ...