C++第三十九篇 -- 研究一下Windows驱动开发(二)-- 驱动程序中重要的数据结构

数据结构是计算机程序的核心,I/O管理器定义了一些数据结构,这些数据结构是编写驱动程序时所必须掌握的。驱动程序经常要创建和维护这些数据结构的实例。

一、驱动对象(DRIVER_OBJECT)

每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序所创建的。

驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并且内核对一个驱动只加载一个实例。确切地说,是由内核中的I/O管理器负责加载的。驱动程序需要在DriverEntry中初始化。先了解一下驱动对象的数据结构。

》DeviceObject:每个驱动程序会有一个或多个设备对象。其中,每个设备对象都有一个指针指向下一个驱动对象。通过DeviceObject,就可以遍历驱动对象里的所有设备对象。设备对象是由程序员自己创建的,而非操作系统完成,在驱动被卸载的时候,遍历每个设备对象,并将其删除。

》DriverName:顾名思义,PriveName记录的是驱动程序的名字。这里用UNICODE字符串记录,该字符串一般为\Driver\[驱动程序名称]。

》HardwareDatabase:这里记录的是设备的硬件数据库键名,这里同样用UNICODE字符串记录。该字符串一般为\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM。

》DriverStartIo:记录StartIo例程的函数地址,用于串行化操作。

》DriverUnload:指定驱动卸载时所用的回调函数地址。

》MajorFunction:MajorFunction域记录的是一个函数指针数组,也就是MajorFunction是一个数组,数组中的每个成员记录着一个指针,每一个指针指向的是一个函数。这个函数就是处理IRP的派遣函数。

》FastIoDispatch:文件驱动中用到的派遣函数,参阅MSDN。

二、设备对象(DEVICE_OBJECT)

每个驱动程序会创建一个或多个设备对象,用DEVICE_OBJECT数据结构表示。每个设备对象都会有一个指针指向下一个设备对象,因此就形成了一个设备链。设备对象保存设备特征和状态的信息。

》DriverObject:指向驱动程序中的驱动独享。同属于一个驱动程序的驱动对象指向的是统一驱动对象。

》NextDevice:指向下一个设备对象。这里指的下一个设备对象是同属于一个驱动对象的设备,也就是同一个驱动程序创建的若干设备对象。每个设备对象根据NextDevice域形成链表,从而可以枚举每个设备对象。

》AttachedDevice:指向下一个设备对象。这里指的是,如果有更高一层的驱动附加到这个驱动的时候,AttachedDevice指向的就是那个更高一层的驱动。

》CurrentIrp:在使用StartIO例程的时候,此域指向的是当前IRP结构。

》Flags:此域是一个32位的无符号整型。每一个位有具体的含义。

标志 描述
DO_BUFFERED_IO 读写操作使用缓冲方式(系统复制缓冲区)访问用户模式数据
DO_EXCLUSIVE  一次只允许一个线程打开设备句柄
DO_DIRECT_IO 读写操作使用直接方式(内存描述符表)访问用户模式数据
DO_DEVICE_INITIALIZING 设备对象正在初始化
DO_POWER_PAGABLE 必须在PASSIVE_LEVEL级上处理IRP_MJ_PNP请求
DO_POWER_INRUSH    设备上电期间需要大电流

》DeviceExtension:指向的是设备的扩展对象。每个设备都会制定一个设备扩展对象,设备扩展对象记录的是设备自己特殊意义的结构体,也就是程序员自己定义的结构体。另外,在驱动程序中,应该尽量避免全局变量的使用,因为全局变量涉及不容易同步的问题。解决办法,将全局变量存在设备扩展里。

》DeviceType:指明设备的类型。

设备类型 描述
FILE_DEVICE_BEEP 蜂鸣器设备对象
FILE_DEVICE_CD_ROM CD光驱设备对象
FILE_DEVICE_CD_ROM_FILE_SYSTEM CD光驱文件系统设备对象
FILE_DEVICE_CONTROLLER 控制器设备对象
FILE_DEVICE_DATALINK 数据链设备对象
FILE_DEVICE_DFS DFS设备对象
FILE_DEVICE_DISK 磁盘设备对象
FILE_DEVICE_DISK_FILE_SYSTEM 磁盘文件系统设备对象
FILE_DEVICE_FILE_SYSTEM 文件系统设备对象
FILE_DEVICE_INPORT_PORT 输入端口设备对象
FILE_DEVICE_KEYBOARD 键盘设备对象
FILE_DEVICE_MAILSLOT 邮件槽设备对象
FILE_DEVICE_MIDI_IN MIDI输入设备对象
FILE_DEVICE_MIDI_OUT MIDI输出设备对象
FILE_DEVICE_MOUSE 鼠标设备对象
FILE_DEVICE_MULTI_UNC_PROVIDER 多UNC设备对象
FILE_DEVICE_NAMED_PIPE 命名管道设备对象
FILE_DEVICE_NETWORK 网络设备对象
FILE_DEVICE_NETWORK_BROWSER 网络浏览器涉笔对象
FILE_DEVICE_NETWORK_FILE_SYSTEM 网络文件系统设备对象
FILE_DEVICE_NULL 空设备对象
FILE_DEVICE_PARALLEL_PORT 并口设备对象
FILE_DEVICE_PHYSICAL_NETCARD 物理网卡设备对象
FILE_DEVICE_PRINTER 打印机设备对象
FILE_DEVICE_SCANNER 扫描仪设备对象
FILE_DEVICE_SERIAL_MOUSE_PORT 串口鼠标设备对象
FILE_DEVICE_SERIAL_PORT 串口设备对象
FILE_DEVICE_SCREEN 屏幕设备对象
FILE_DEVICE_SOUND 声音设备对象
FILE_DEVICE_STREAMS 流设备对象
FILE_DEVICE_TAPE 磁带设备对象
FILE_DEVICE_TAPE_FILE_SYSTEM 磁带文件系统设备对象
FILE_DEVICE_TEANSPORT 传输设备对象
FILE_DEVICE_UNKNOWN 未知设备对象
FILE_DEVICE_VIDEO 视频设备对象
FILE_DEVICE_VIRTUAL_DISK 虚拟磁盘设备对象
FILE_DEVICE_WAVE_OUT 声音输出设备对象
FILE_DEVICE_8042_PORT 8042端口设备对象
FILE_DEVICE_NETWORK_REDIRECTOR 网卡设备对象
FILE_DEVICE_BATTERY 电池设备对象
FILE_DEVICE_BUS_EXTENDER 总线扩展设备对象
FILE_DEVICE_MODEM 调制解调器设备对象
FILE_DEVICE_VDM VDM设备对象
FILE_DEVICE_MASS_STORAGE 大容量存储设备对象
FILE_DEVICE_SMB SMB设备对象
FILE_DEVICE_KS 内核流设备对象
FILE_DEVICE_CHANGER 充电设备对象
FILE_DEVICE_SMARTCARD 智能卡设备对象
FILE_DEVICE_ACPI ACPI设备对象
FILE_DEVICE_DVD DVD设备对象
FILE_DEVICE_WAVE_IN 声音输入设备对象

根据设备的需要,需要填写相应的设备类型。当制作虚拟设备时,应选择FILE_DEVICE_UNKNOWN类型的设备。

》StackSize:在多层驱动情况下,驱动与驱动之间会形成类似堆栈的结构。IRP会依次从最高层传递到最底层。StackSize描述的就是这个层数。

》AlignmentRequirement:设备在大容量传输的时候,需要内存对齐,以保证传输速度。

有点累了,写到这里。

原文地址:https://www.cnblogs.com/smart-zihan/p/11783038.html

时间: 2024-09-29 00:57:39

C++第三十九篇 -- 研究一下Windows驱动开发(二)-- 驱动程序中重要的数据结构的相关文章

C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载

基于Windows驱动开发技术详解这本书 一.简单的INF文件剖析 INF文件是一个文本文件,由若干个节(Section)组成.每个节的名称用一个方括号指示,紧接着方括号后面的就是节内容.每一行就是一项内容,其形式都是类似SomeEntry=SomwValue.每个项的顺序是可以颠倒的,但系统分析INF文件的时候,是顺序解析的.INF中注释语句是用分号开头的. 二.WDM设备安装在注册表中的变化 WDM式驱动程序的安装会在三个方面修改注册表,分别是硬件子键(Hardware).类子键(Class

C++第三十五篇 -- 写第一个驱动开发程序

VS2017+WDK+VMware12+Win10环境配置完毕,接下来写第一个驱动程序. 1.新建一个KMDF的程序. 2.配置项目属性. 3.编译项目.一般这里应该成功,我一台电脑成功了,另一台电脑失败了.两台电脑OS的版本不同,一个1803(失败),一个1809(成功).失败的信息如下: 做法: 好像不管用,上google搜索了下,修改平台集V141,也不管用.最后,看到一个说安装WDK1809的.PS:有问题的是VS2017+WDK1803.VS2017+WDK1809是正常的.不过正常编

mysql 第三十九篇文章~canal的深度解读1

一 简介:经过一段时间的研究,对canal有了一些见解 二 配置文件: 1 canal.properties (系统根配置文件)     主要参数列表   canal.properties (系统根配置文件)   canal.destinations= example 当前server上部署的instance列表 默认为example 在canal.properties定义了canal.destinations后,需要在canal.conf.dir对应的目录下建立同名的文件 canal.auto

第三十九篇 Python异常处理

一. 什么是异常 异常就是程序运行时发生的错误,在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止,在python中,错误触发的异常如下 错误分成两种: #语法错误示范一 if #语法错误示范二 def test: pass #语法错误示范三 class Foo pass #语法错误示范四 print(haha 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #TypeError:int类型不可迭代 for i i

Python之路(第三十九篇)管道、进程间数据共享Manager

一.管道 概念 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 先画一幅图帮助大家理解下管道的基本原理 现有2个进程A和B,他们都在内存中开辟了空间,那么我们在内存中再开辟一个空间C,作用是连接这两个进程的.对于进程来说内存空间是可以共享的(任何一个进程都可以使用内存,内存当中的空间是用地址来标记的,我们通过查找某一个地址就能找到这个内存)A进程可以不断的向C空间输送东西,B进程可以不断的从C空间读取东西,这

第三十九篇 matplotlib模块

matplotlib模块 绘图库,可以创建常用的统计图(条形图.箱型图.折线图.散点图和直方图) bar() 条形图 # 由于该模块不识别中文,所以我们需要导入一个中文简体字文件 import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties font = FontProperties(fname='B:\\msyh.ttc') # 在文件B中找字体文件 # 修改背景为条纹 plt.style.

NeHe OpenGL教程 第三十九课:物理模拟

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切. 物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇文章很适合你. 在这篇教程里,你会创建一个非常简单的物理引

ActionScript3游戏中的图像编程(连载三十九)

2.3.1 用方块观察斜面样式与斜角滤镜作用方法的差异 在Photoshop和Flash里都各自建一个500*500的空白文件,然后各自在画布中心画上一个纯蓝的(#0000FF),100*100大小的方块,(如果不懂得如何完成以上操作,可自行翻阅相关的入门教材)然后Flash里再多做一步,按F8转换为元件,类型选择"影片剪辑". 为了最大程度上减少对本课题研究的干扰,我们创建的投影力求做到最简单,最干净.为此,我把Flash里的投影滤镜中的模糊设置成0,并且把颜色调亮(#00cc00)

Python之路【第十九篇】:爬虫

Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. Requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. import