《Windows NT FileSystem Internals》学习笔记之DRIVER_OBJECT对象结构

本文主要是介绍《Windows NT FileSystem Internals》学习笔记之DRIVER_OBJECT对象结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

驱动编程这么长时间了,还没有 彻底理解这个玩意,呵呵惭愧。

看了《Windows NT FileSystem Internals》把每一个细节搞清楚了,这里记下来,防止以后忘掉(以后还不知道能不能开发驱动呢)

typedef struct _DRIVER_OBJECT

{

        CSHORT      Type;

        CSHORT      Size;

        //一个链表,记录了该驱动创建的所有设备对象

        PDEVICE_OBJECT  DeiceObject;

        ULONG  Flags;

        PVOID DriverStart;

        ULONG DriverSize;

        PVOID DriverSection;

        PDRIVER_EXTENSION DriverExtension;

        UNICODE_STRING DriverName;

        PUNICODE_STRING HardwareDataBase;

        PFAST_IO_DISPATCH FastIoDispatch;

        PDRIVER_INITIALIZE DriverInit;

        PDRIVER_STARTIO DriverStartIo;

        PDRIVER_UNLOAD DriverUnload;

        PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION];

}DRIVER_OBJECT;

I/O管理器在装载驱动时,首先调用IopLoadDriver()函数,该函数执行一下功能

1.   确定要装载的驱动名称,查询该驱动是否已经被装载。系统中包含一个已经装载的驱动链表,I/O管理器是通过查询这个链表确定驱动是否被装载的,如果已经被装载,则返回成功;另外注册表中也必须配置相关的信息

2.   如果驱动没有被装载,I/O管理器请求虚拟存储管理器(VMM)将驱动可执行文件映射到内存中,VMM在映射时检查该文件是否为可用的PE格式,如果不是,VMM使请求失败,驱动装载失败

3.   I/O管理器通过对象管理器创建驱动对象,该驱动对象存储在非分页内存池中,因此任意IRQL都可以访问

4.   I/O管理器将驱动对象结构清零,MajorFunction中的每一个元素被设置为IopInvalidDeiviceRequest()。该函数仅仅返回STATUS_INVALID_DEVICE_REQUEST状态码

5.   I/O管理器将DriverInit字段设置为驱动的入口程序(DriverEntry),DriverSection被初始化为驱动的Section对象指针,该section对象指向驱动的可执行文件;DriverStart设置为驱动映像的基址;DriverSize被设置为驱动映像的尺寸。

6.   I/O管理器将该驱动对象插到 NT Object Manager维护的驱动列表中

7.   HardwareDatabase字段初始化为Configuration Manager的硬件配置信息。底层驱动可以使用这个字段决定驱动启动顺序的配置;DriverName也被初始化,这样错误记录服务可以记录相关的信息

8.    I/O 管理器调用驱动初始化程序。该初始化程序总是在系统进程中IRQL_PASSIVE_LEVEL级别被调用。

 

Windg中的相关命令:

查询所有的驱动信息:!drivers

查询所有的设备对象信息!devnode 0 1

列出相应的设备对象和驱动对象信息!devobj和!drvobj

这里遇到一个问题,就是我使用dt nt!_DRIVER_OBJECT查询DriverOject对象的DriverSection字段时,不知道该如何得到驱动的文件名,不知哪位大侠指教一下。

找到NDIS驱动对象:

再用dt nt!_DRIVER_OBJECT查询

 注意上面的DriverSection字段,这个应该能连接到Ndis.sys文件的,可是我不知道咋连接,寒一个

用!ca显示的不对,用dt nt!_SECTION_OBJECT也不对,用dt nt!_SECTION_OBJECT_POINTERS 也不对,郁闷了,到底是什么呢,这个看来还得研究研究,呵呵

 

这篇关于《Windows NT FileSystem Internals》学习笔记之DRIVER_OBJECT对象结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/686449

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at