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

来源:互联网 发布:淘宝客服的工作时间 编辑:程序博客网 时间:2024/05/01 01:29

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

看了《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 也不对,郁闷了,到底是什么呢,这个看来还得研究研究,呵呵