设备对象(DEVICE_OBJECT)

        设备对象(DEVICE_OBJECT)
        每个驱动程序会创建一个或多个设备对象,用DEVICE_OBJECT数据结构表示。每个设备对象都会有一个指针指向下一个设备对象,因此就形成一个设备链。设备对象链的第一个设备是由DRIVER_OBJECT结构体中指明的。设备对象保存设备特征和状态的信息,其数据结构定义如下:

typedef struct _DEVICE_OBJECT {
  CSHORT                   Type;			// 由操作系统用来指示对象是设备对象。 对于设备对象,此成员的值为 3。 这是一个只读成员
 
  USHORT                   Size;			// 指定设备对象的大小(以字节为单位)。 此大小包括 DeviceExtension
											// 成员指向的驱动程序指定的设备扩展,但不包括 DeviceObjectExtension 
										    // 成员指向的不透明设备对象扩展。 Size 是只读成员。
  
  LONG                     ReferenceCount;	// 由 I/O 管理器用于跟踪与设备对象关联的设备的打开句柄数。 
											// 这样,当驱动程序的设备 () 有未完成的句柄时,
											// I/O 管理器就可以避免卸载驱动程序。 这是一个只读成员。
											
  struct _DRIVER_OBJECT    *DriverObject;	// DriverObject: 指向驱动程序中的驱动对象。
											// 同属于一个驱动程序的驱动对象指向的是统一驱动对象。
  
  struct _DEVICE_OBJECT    *NextDevice;		// NextDevice:指向下一个设备对象。这里指的下一个设备对象是同属于一个驱动对象的设备,
											// 也就是同一个驱动, 程序创建的若干设备对象。每个设备对象根据NextDevice域形成链表,
											// 从而可以枚举每个设备对象。


  struct _DEVICE_OBJECT    *AttachedDevice;	// AttachedDevice: 指向下一个设备对象。这里指的出,如果由更高一层的驱动附加
											// 到这个驱动的时候,AttachedDevice 指向的就是那个更高一层的驱动。

  struct _IRP              *CurrentIrp;		// CurrentIrp: 在使用StartIO例程的时候,此域指向的是当前IRP结构。
  
  PIO_TIMER                Timer;			// 指向计时器对象的指针。 这允许 I/O 管理器每秒调用驱动程序提供的计时器例程。
											// 有关详细信息,请参阅 IoInitializeTimer。 这是一个读/写成员
  
  ULONG                    Flags;			// Flags: 此域是一个32位的无符号整形。每一个位由具体的含义。
  ULONG                    Characteristics;
  __volatile PVPB          Vpb;
  PVOID                    DeviceExtension;	// DeviceExtension : 指向的是设备的扩展对象。每个设备都会指定一个设备扩展对象。
											// 设备扩展对象记录的是设备自己特殊定义的结构体,也就是由程序员自己定义的结构体。
											// 另外,在驱动程序中,应该尽量避免全局变量的使用,因为全局变量涉及不容易同步的问
											// 题。解决的办法,将全局变量存在设备扩展里。
  
  DEVICE_TYPE              DeviceType;		// DeviceType: 指明设备的类型,常用类型如下
  
  CCHAR                    StackSize;
  union {
    LIST_ENTRY         ListEntry;
    WAIT_CONTEXT_BLOCK Wcb;
  } Queue;
  ULONG                    AlignmentRequirement; // AlignmentRequirement: 设备在大容量传输的时候需要
									             // 内存对其,以保证传输速度。
  
  KDEVICE_QUEUE            DeviceQueue;
  KDPC                     Dpc;
  ULONG                    ActiveThreadCount;
  PSECURITY_DESCRIPTOR     SecurityDescriptor;
  KEVENT                   DeviceLock;
  USHORT                   SectorSize; // StackSize: 在多层驱动的情况下,驱动与驱动之间会形成类似
									   // 堆栈的结构。IRP会依次从最高层传递到最底层。
									   // StackSize描述的就是这个层次
									   
  USHORT                   Spare1;
  struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
  PVOID                    Reserved;
} DEVICE_OBJECT, *PDEVICE_OBJECT;


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

表2 DeviceType
设备类型编码描述
FILE_DEVICE_8042_PORT          0x000000278042端口设备对象
FILE_DEVICE_ACPI               0x00000032ACPI设备对象
FILE_DEVICE_BATTERY            0x00000029电池设备对象
FILE_DEVICE_BEEP               0x00000001蜂鸣器设备对象
FILE_DEVICE_BUS_EXTENDER       0x0000002a总线扩展设备对象
FILE_DEVICE_CD_ROM             0x00000002CD光驱设备对象
FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003CD光驱文件系统设备对象
FILE_DEVICE_CHANGER            0x00000030充电设备对象
FILE_DEVICE_CONTROLLER         0x00000004控制器设备对象
FILE_DEVICE_DATALINK           0x00000005数据链设备对象
FILE_DEVICE_DFS                0x00000006DFS设备对象
FILE_DEVICE_DFS_FILE_SYSTEM    0x00000035 
FILE_DEVICE_DFS_VOLUME         0x00000036 
FILE_DEVICE_DISK               0x00000007磁盘设备对象
FILE_DEVICE_DISK_FILE_SYSTEM   0x00000008磁盘文件系统设备对象
FILE_DEVICE_DVD                0x00000033DVD设备对象
FILE_DEVICE_FILE_SYSTEM        0x00000009文件系统设备对象
FILE_DEVICE_FIPS               0x0000003a 
FILE_DEVICE_FULLSCREEN_VIDEO   0x00000034 
FILE_DEVICE_INPORT_PORT        0x0000000a输入端口设备对象
FILE_DEVICE_KEYBOARD           0x0000000b磁盘设备对象
FILE_DEVICE_KS                 0x0000002f内核流设备对象
FILE_DEVICE_KSEC               0x00000039 
FILE_DEVICE_MAILSLOT           0x0000000c邮件槽设备对象
FILE_DEVICE_MASS_STORAGE       0x0000002d大容量存储设备对象
FILE_DEVICE_MIDI_IN            0x0000000dMIDI输入设备对象
FILE_DEVICE_MIDI_OUT           0x0000000eMIDI输出设备对象
FILE_DEVICE_MODEM              0x0000002b调制解调器设备对象
FILE_DEVICE_MOUSE              0x0000000f鼠标设备对象
FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010多UNC设备对象
FILE_DEVICE_NAMED_PIPE         0x00000011命名管道设备对象
FILE_DEVICE_NETWORK            0x00000012网络设备对象
FILE_DEVICE_NETWORK_BROWSER    0x00000013网络浏览器设备对象
FILE_DEVICE_NETWORK_FILE_SYSTEM0x00000014网络文件系统设备对象
FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028网卡设备对象
FILE_DEVICE_NULL               0x00000015空设备对象
FILE_DEVICE_PARALLEL_PORT      0x00000016并口设备对象
FILE_DEVICE_PHYSICAL_NETCARD   0x00000017物理网卡设备对象
FILE_DEVICE_PRINTER            0x00000018打印机设备对象
FILE_DEVICE_SCANNER            0x00000019扫描仪设备对象
FILE_DEVICE_SCREEN             0x0000001c屏幕设备对象
FILE_DEVICE_SERENUM            0x00000037 
FILE_DEVICE_SERIAL_MOUSE_PORT  0x0000001a串口鼠标设备对象
FILE_DEVICE_SERIAL_PORT        0x0000001b串口设备对象
FILE_DEVICE_SMARTCARD          0x00000031智能卡设备对象
FILE_DEVICE_SMB                0x0000002eSMB设备对象
FILE_DEVICE_SOUND              0x0000001d声音设备对象
FILE_DEVICE_STREAMS            0x0000001e流设备对象
FILE_DEVICE_TAPE               0x0000001f磁带设备对象
FILE_DEVICE_TAPE_FILE_SYSTEM   0x00000020磁带文件系统设备对象
FILE_DEVICE_TERMSRV            0x00000038 
FILE_DEVICE_TRANSPORT          0x00000021传输设备对象
FILE_DEVICE_UNKNOWN            0x00000022未知设备对象
FILE_DEVICE_VDM                0x0000002c 
FILE_DEVICE_VIDEO              0x00000023视频设备对象
FILE_DEVICE_VIRTUAL_DISK       0x00000024虚拟磁盘设备对象
FILE_DEVICE_WAVE_IN            0x00000025声音输入设备对象
FILE_DEVICE_WAVE_OUT           0x00000026声音输出设备对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/340450.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UI自动化中的option选项配置

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

《WebKit 技术内幕》学习之七(2): 渲染基础

2 网页层次和RenderLayer树 2.1 层次和RenderLayer对象 前面章节介绍了网页的层次结构,也就是说网页是可以分层的,这有两点原因,一是为了方便网页开发者开发网页并设置网页的层次,二是为了WebKit处理上的便利,也就是…

C++中命名空间、缺省参数、函数重载

目录 1.命名空间 2.缺省参数 3.函数重载 1.命名空间 在C中定义命名空间我们需要用到namespace关键字,后面跟上命名空间的名字,结构框架有点类似结构体(如图所示) 上面的代码我一一进行讲解: 1.我们先来说第三行和main函…

开源堡垒机JumpServer本地安装并配置公网访问地址

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。JumpS…

基于CLIP4Clip的DRL的WTI模块实现

关于DRL的WTI模块: Weighted Token-wise Interaction: 直觉上,并非所有的单词和视频帧都同等重要。我们提供一种自适应方法,来调整每个标记的权重大小: 注:其中两个f函数都是MLP和softmax构成。 WTI的算…

使用STM32的SPI接口实现与外部传感器的数据交互

一、引言 外部传感器是嵌入式系统中常用的外设,用于检测环境参数、采集数据等。通过STM32微控制器的SPI接口,可以与外部传感器进行数据交互,从而实现数据的采集和控制。本文将介绍如何使用STM32的SPI接口实现与外部传感器的数据交互&#xff…

云计算任务调度仿真05

今天再分享一个新的调度框架deeprm 本项目基于hongzimao/deeprm,原作者还著有论文Resource Management with Deep Reinforcement Learning 。 这个框架研究的也蛮多的,我在一篇博士论文中也看到了基于此的研究工作,但是论文题目忘记了。 运…

【C++】入门(一)

前言&#xff1a; 本篇博客将带大家认识C&#xff0c;熟悉基本语法 文章目录 认识CC的诞生与发展C 在行业中的运用 一、命名空间1.1 命名空间的定义1.2 命名空间的使用1.3 命名空间的访问 二、C输入&输出输出操作符 <<输入操作符 >>换行符和刷新输出缓冲区关键…

如何在CentOS8使用宝塔面板本地部署Typecho个人网站并实现公网访问【内网穿透】

文章目录 前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 Typecho是由type和echo两个词合成的&#xff0c;来自于开发团队的头脑风暴。Typecho基于PHP5开发&#xff0c;支持多种数据库&#…

vmware 安装Rocky-9.3系统

安装系统截图 安装完成&#xff0c;启动 查看版本和内核 开启远程登陆授权 1、编辑配置文件 #提升权限&#xff0c;输入su,并输入密码 su #编辑ssh文件开启root远程登陆 vi /etc/ssh/sshd_config找到以下内容&#xff1a;#PermitRootLogin prohibit-password 添加&#xff1a…

C#winform上位机开发学习笔记5-串口助手的定时发送功能添加

1.功能描述 选择自动发送功能后&#xff0c;按照设定的发送时间发送发送框中的信息数据&#xff0c;设定时间可以手动输入&#xff0c;当手动输入信息无效&#xff08;非数字&#xff09;时&#xff0c;系统弹出错误提示&#xff0c;并将其设置为默认定时时间。 2.代码部分 步…

【MySQL进阶】视图_存储过程_存储函数_触发器

文章目录 视图基本介绍视图操作视图创建视图查询视图修改视图删除 存储过程基本介绍基本操作存储语法变量IF语句参数传递CASEWHILEREPEATLOOP游标 存储函数触发器基本介绍基本操作 总结 视图 基本介绍 视图概念&#xff1a;视图是一种虚拟存在的数据表&#xff0c;这个虚拟的表…

【Linux对磁盘进行清理、重建、配置文件系统和挂载,进行系统存储管理调整存储结构】

Linux 调整存储结构 前言一、查看磁盘和分区列表二、创建 ext4 文件系统&#xff0c;即&#xff1a;格式化分区为ext4文件系统。1.使用命令 mkfs.ext4 (make file system)报错如下&#xff1a;解决办法1&#xff1a;&#xff08;经测试&#xff0c;不采用&#xff09;X解决办法…

Docker-Jenkins编译android-app的两种方案

Docker-Jenkins编译android-app的两种方案 android开发使用jenkins编译&#xff0c;自动集成修改点/自动命名/自动备份&#xff0c;将修改的apk发布到测试服务器发布网盘&#xff0c;而不需要用通讯工具传来传去。 jenkins用在互联网开发编译比较常见&#xff0c;如果android开…

电力电子技术

文章目录 5 直流直流变流电路5.0 简介5.1 基本斩波电路5.1.1 降压斩波电路 Buck Chopper5.1.1.1 小纹波近似 5.1.2升压斩波电路 11 DC-DC 变换器数字控制11.1 基于单片机控制11.2 基于 DSP 控制11.3 基于 FPGA 控制 12 多相交错并联拓扑结构12.1 多相交错并联12.1 多相交错并联…

CS8370错误,这是由于使用了C# 7.3中不支持的功能

目录 背景: 第一种方法: 第二种办法: 背景: 在敲代码的时候&#xff0c;程序提示报错消息提示:CS8370错误&#xff0c;那么这是什么原因导致的&#xff0c;这是由于使用了C# 7.3中不支持的功能&#xff0c;不支持该功能&#xff0c;那就是版本太低我们就需要升级更高的版本&…

韩国访问学者如何申请?

作为访问学者&#xff0c;前往韩国学术机构进行研究是一项令人期待的经历。首先&#xff0c;申请者需要查找目标学术机构的官方网站&#xff0c;下面知识人网小编带大家了解其访问学者计划的具体要求和申请流程。 通常&#xff0c;申请程序包括填写在线申请表格&#xff0c;提交…

《WebKit 技术内幕》学习之八(3):硬件加速机制

3 其他硬件加速模块 3.1 2D图形的硬件加速机制 其实网页中有很多绘图操作是针对2D图形的&#xff0c;这些操作包括通常的网页绘制&#xff0c;例如绘制边框、文字、图片、填充等&#xff0c;它们都是典型的2D绘图操作。在HTML5中&#xff0c;规范又引入了2D绘图的画布功能&a…

枚举问题刷题

考研机试题目中的很多问题往往能通过暴力方法来求解&#xff0c;这些题目并不需要进行过多的思考&#xff0c;而只需枚举所有可能的情况&#xff0c;或者模拟题目中提出的规则&#xff0c;便可以得到解答。虽然说这种方法看上并不高明&#xff0c;但对于一些简单的题目来说却是…

力扣日记1.21-【回溯算法篇】77. 组合

力扣日记&#xff1a;【回溯算法篇】77. 组合 日期&#xff1a;2023.1.21 参考&#xff1a;代码随想录、力扣 终于结束二叉树了&#xff01;听说回溯篇也是个大头&#xff0c;不知道这一篇得持续多久了…… 77. 组合 题目描述 难度&#xff1a;中等 给定两个整数 n 和 k&#…