设备扩展(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函数的参数。

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

时间: 2024-08-02 14:17:25

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

windows驱动开发-设备扩展

设备对象Device_Object记录通用设备信息,另外一些信息记录在设备扩展里,设备扩展由程序员自己定义,由程序员指定内容和大小,由I/O管理器创建,并保存在非分页内存中. 驱动程序中,尽量避免使用全局函数,因为全局函数往往导致函数的不可重入性, 重入性是指,在多线程程序中,多个函数并行运行,函数的运行结果不会根据函数的先后调用顺序而导致不同, 解决办法是,将全局变量以设备扩展的形式存储,并加以适当的同步保护措施, 除此之外,在设备扩展中,还会记录以下一些内容, 1,设备对象反向指针, 2,设

USB设备驱动概述

USB设备驱动 ·  17.1 USB总线协议 ·  17.1.1 USB设备简介 ·  17.1.2 USB连接拓扑结构 ·  17.1.3 USB通信的流程 ·  17.1.4 USB四种传输模式 ·  17.2.1 观察USB设备的工具 ·  17.2.2 USB设备请求 ·  17.2.3 设备描述符 ·  17.2.4 配置描述符 ·  17.2.5 接口描述符 ·  17.2.6 端点描述符 ·  17.3.1 功能驱动与物理总线驱动 ·  17.3.2 构造USB请求包 ·  17

[转载]windows过滤驱动程序设计入门(驱动程序基本结构,设备栈,IRP栈和工作原理)

本文转载自: http://blog.csdn.net/arvon2012/article/details/7789724 最近在学习windows驱动设计,认真看了些教材后总结了我认为驱动中都会涉及到,也最重要的概念,和大家分享.如果有说的不对的请大家留言指出.谢谢! 这里主要是写概念,代码涉及的不多也不详细,但是我会说出涉及到的API,详细的使用细节大家可以自己动手搜搜.掌握下面的概念之后,看驱动开发的教材里的代码,或者理解教材里说的内容应该就顺利很多! 过滤驱动程序概括: 对于window

PCI设备内存操作函数总结

1.  ExAllocatePool() 函数说明: ExAllocatePool allocates pool memory of the specified type and returns a pointer to the allocated block. 函数定义: PVOID ExAllocatePool( __in  POOL_TYPE PoolType, __in  SIZE_T NumberOfBytes ); 代码中用来分配设备描述DMA adepter设备的特性(DEVICE

有人设备在工业物联网解决方案中的应用

设备解决方案 用于工业物联网 我们的设备解决方案使系统集成商和工业物联网应用开发商能够以更低的成本更快地将产品推向市场. 我们通过提供针对性的数传设备来实现这一点,我们的设备配置和管理,安全性,设备控制以及传感器数据收集和完整性; 同时最大化通信正常运行时间. 有人物联网可以让您轻松获取高质量的数据,让您专注于提供您的工业物联网应用. 不仅仅是设备. 简单,实用,价格合理 我们的4G DTU 集成到您的应用程序中,协调作为应用程序一部分部署的所有有人物联网设备与中央服务器之间的所有通信; 保护所

WDF编程框架

微软的wdk开发包里自带了一些sample,这是些质量不错并且权威的学习资料,最好的学习驱动的方法就是阅读和修改这些代码.其中Ramdisk实现了一个虚拟磁盘,可以作为WDF编程的经典代码材料,<寒江独钓-Windows内核安全编程>第5章"磁盘的虚拟"便以此为例,这篇博客是一篇学习总结. 驱动的入口函数很简洁: NTSTATUS DriverEntry(     IN PDRIVER_OBJECT DriverObject,     IN PUNICODE_STRING 

一个简单的截取键盘按键的驱动

近来在学驱动开发,自己写了一个简单地驱动程序,截取键盘按键,另外写的应用程序会显示按键.下面是驱动部分的关键代码,完整代码点击:猛戳这里 /**************************************************************/ #include "KeyFilter.h" /************************************************************************ * 函数名称:DriverE

Windows 驱动入门(二)代码结构

windows驱动程序基础.转载标明出处:http://blog.csdn.net/ikerpeng/article/details/38777641 windows驱动程序结构: 我想说的是windows驱动程序的结构和C++的程序结构是一样的,在你知道这一点以后你就会认为简单了很多. 首先在一个头文件中面做一些必要的预处理.然后定义会用到的设备扩展结构体(相当于Class):接下来就是函数的声明. 当这一切结束以后,我们就在.cpp文件中面实现这些函数.可是不一样的地方要说一下: 1.这里声

第二讲:我的第一个驱动

原文:http://blog.csdn.net/caperingrabbit/article/details/5285288 配置好了开发环境之后,下面就要通过具体的程序来了解驱动的开发了.下面我们以一个WDM驱动的框架来实现Windows驱动程序的HelloWorld. 作为一个驱动程序,首先应该写的是它的入口函数,这点跟MFC的WinMain或者C++中的Main函数一样,驱动的入口函数使用DriverEntry.在入口函数中主要实现的功能是一些分发例程的注册以及其他的需要初始化的事务. D