学习笔记之DRIVER_OBJECT对象结构
2008-04-03 23:15
573 查看
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 也不对,郁闷了,到底是什么呢,
{
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 也不对,郁闷了,到底是什么呢,
相关文章推荐
- 学习笔记之DRIVER_OBJECT对象结构
- Sharepoint学习笔记 –架构系列—Sharepoint的服务器端对象模型(Server Object Model) 2.内容层次结构
- Sharepoint学习笔记 –架构系列—Sharepoint的服务器端对象模型(Server Object Model) 3.服务层次结构
- Sharepoint学习笔记 –架构系列—Sharepoint的服务器端对象模型(Server Object Model) 1.物理对象层次结构
- Object-c学习笔记十一-----对象初始化
- 学习笔记之JS 对象数组Array根据对象object key的值排序sort
- Sharepoint学习笔记 –架构系列—Sharepoint的客户端对象模型(Client Object Model)
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
- scala快速学习笔记(二):控制结构,类和对象
- 驱动对象结构DRIVER_OBJECT
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
- openerp学习笔记 对象间关系【多对一(一对一)、一对多(主细结构)、多对多关系、自关联关系(树状结构)】
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
- [iphone 开发学习笔记]Object-C和C语言最大的区别也是最大的扩展-----消息(即如何调用一个对象中的函数)
- Object-C 学习笔记(三十)--- 归档(3)---对象归档
- object-c学习笔记:对象初期化
- Object-c学习笔记(一):对象的声明及初始化