驱动对象与设备对象的关系
2016-11-11 15:02
204 查看
----------------以下内容摘自《寒江独钓》-------------------
1、驱动对象:
一个驱动对象代表了一个驱动程序。或者说一个内核模块。驱动对象的结构如下(这个结构的定义取自 WDK中的 wdm.h)。下面有一些域用省略号代替。
[plain]
view plain
copy
typedef struct _DRIVER_OBJECT {
// 结构的类型和大小。
CSHORT Type;
CSHORT Size;
// 设备对象,这里实际上是一个设备对象的链表的开始。因为 DeviceObject
// 中有相关链表信息。读下一小节“设备对象”会得到更多的信息。
PDEVICE_OBJECT DeviceObject;
……
// 驱动的名字
UNICODE_STRING DriverName;
……
// 快速 IO分发函数
PFAST_IO_DISPATCH FastIoDispatch;
……
// 驱动的卸载函数
PDRIVER_UNLOAD DriverUnload;
// 普通分发函数
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT;
2、设备对象:
设备对象是内核中的重要对象。 其重要性不亚于在WindowsGUI编程中的窗口 (Wnd)。进行过 Windows 窗口应用程序开发的读者知道,窗口是唯一可以接收消息的东西。任何消息都是发送给一个窗口的。而在内核的世界里,大部分“消息”以“请求” (IRP)的方式传递。而设备对象(DEVICE_OBJECT)是唯一可以接受请求的的实体。任何一个“请求”(IRP)都是发送给某个设备对象的。
设备对象的结构是 DEVICE_OBJECT,常常被简称为 DO。一个 DO 可能代表许多东西。浅显的例子是:一个DO可以代表一个实际的硬盘。这很明显:硬盘可以被读,或者
被写。所以这个 DO 将接受读和写两种请求(实际还有更多) 。但是一个 DO 也可能代表一个和硬件毫无关系的东西。比如说内核中可能有一个设备,实现类似“管道”的功能。一个进程打开这个设备对象进行读,另一个进程打开这个设备进行写,就把数据从一个进程传递到了另一个进程。为了接受来自用户进程的请求,我们不得不生成了一个 DO。这个 DO和实际硬件没什么关系。 因为我们总是在内核程序中生成一个 DO,而一个内核程序是用一个驱动对象表示的。所以一个设备对象总是属于一个驱动对象。
在 WDK中的 wdm.h 中可以看到结构定义如下 (我省略了许多现在读者不需要了解的域)
[plain]
view plain
copy
typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {
// 和驱动对象一样
CSHORT Type;
USHORT Size;
// 引用计数
ULONG ReferenceCount;
// 这个设备所属的驱动对象
struct _DRIVER_OBJECT *DriverObject;
// 下一个设备对象。在一个驱动对象中有n 个设备,这些设备用这个指针连接
// 起来作为一个单向的链表。
struct _DEVICE_OBJECT *NextDevice;
// 设备类型
DEVICE_TYPE DeviceType;
// IRP栈大小
HAR StackSize;
……
}DEVICE_OBJECT;
从这个结构来看,读者应该发现驱动对象(DRIVER_OBJECT)和设备对象(DEVICE_OBJECT) 之间的联系。 这非常重要。驱动对象生成多个设备对象。而 Windows在向设备对象发送请求。但是这些请求如何处理呢?实际上,这些请求是被驱动对象的分发函数所捕获的。当 Windows内核向一个设备发送一个请求时,驱动对象的分发函数中的某一个会被调用。分发函数原型如下:
[plain]
view plain
copy
// 一个典型的分发函数,第一个参数 device 是请求的目标 device,第二个参数 irp 是
// 请求的指针。
NTSTATUS MyDispatch(PDEVICE_OBJECT deivce, PIRP irp);
至于究竟如何处理,由内核模块的开发者在这个函数中编写。
1、驱动对象:
一个驱动对象代表了一个驱动程序。或者说一个内核模块。驱动对象的结构如下(这个结构的定义取自 WDK中的 wdm.h)。下面有一些域用省略号代替。
[plain]
view plain
copy
typedef struct _DRIVER_OBJECT {
// 结构的类型和大小。
CSHORT Type;
CSHORT Size;
// 设备对象,这里实际上是一个设备对象的链表的开始。因为 DeviceObject
// 中有相关链表信息。读下一小节“设备对象”会得到更多的信息。
PDEVICE_OBJECT DeviceObject;
……
// 驱动的名字
UNICODE_STRING DriverName;
……
// 快速 IO分发函数
PFAST_IO_DISPATCH FastIoDispatch;
……
// 驱动的卸载函数
PDRIVER_UNLOAD DriverUnload;
// 普通分发函数
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT;
2、设备对象:
设备对象是内核中的重要对象。 其重要性不亚于在WindowsGUI编程中的窗口 (Wnd)。进行过 Windows 窗口应用程序开发的读者知道,窗口是唯一可以接收消息的东西。任何消息都是发送给一个窗口的。而在内核的世界里,大部分“消息”以“请求” (IRP)的方式传递。而设备对象(DEVICE_OBJECT)是唯一可以接受请求的的实体。任何一个“请求”(IRP)都是发送给某个设备对象的。
设备对象的结构是 DEVICE_OBJECT,常常被简称为 DO。一个 DO 可能代表许多东西。浅显的例子是:一个DO可以代表一个实际的硬盘。这很明显:硬盘可以被读,或者
被写。所以这个 DO 将接受读和写两种请求(实际还有更多) 。但是一个 DO 也可能代表一个和硬件毫无关系的东西。比如说内核中可能有一个设备,实现类似“管道”的功能。一个进程打开这个设备对象进行读,另一个进程打开这个设备进行写,就把数据从一个进程传递到了另一个进程。为了接受来自用户进程的请求,我们不得不生成了一个 DO。这个 DO和实际硬件没什么关系。 因为我们总是在内核程序中生成一个 DO,而一个内核程序是用一个驱动对象表示的。所以一个设备对象总是属于一个驱动对象。
在 WDK中的 wdm.h 中可以看到结构定义如下 (我省略了许多现在读者不需要了解的域)
[plain]
view plain
copy
typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {
// 和驱动对象一样
CSHORT Type;
USHORT Size;
// 引用计数
ULONG ReferenceCount;
// 这个设备所属的驱动对象
struct _DRIVER_OBJECT *DriverObject;
// 下一个设备对象。在一个驱动对象中有n 个设备,这些设备用这个指针连接
// 起来作为一个单向的链表。
struct _DEVICE_OBJECT *NextDevice;
// 设备类型
DEVICE_TYPE DeviceType;
// IRP栈大小
HAR StackSize;
……
}DEVICE_OBJECT;
从这个结构来看,读者应该发现驱动对象(DRIVER_OBJECT)和设备对象(DEVICE_OBJECT) 之间的联系。 这非常重要。驱动对象生成多个设备对象。而 Windows在向设备对象发送请求。但是这些请求如何处理呢?实际上,这些请求是被驱动对象的分发函数所捕获的。当 Windows内核向一个设备发送一个请求时,驱动对象的分发函数中的某一个会被调用。分发函数原型如下:
[plain]
view plain
copy
// 一个典型的分发函数,第一个参数 device 是请求的目标 device,第二个参数 irp 是
// 请求的指针。
NTSTATUS MyDispatch(PDEVICE_OBJECT deivce, PIRP irp);
至于究竟如何处理,由内核模块的开发者在这个函数中编写。
相关文章推荐
- 基础驱动和设备对象关系
- 设备对象和驱动对象的关系
- 驱动对象、设备对象、请求之间的关系
- 驱动对象 设备对象 设备栈 乱杂谈
- 驱动视频: Windows驱动讲稿1.6 -- 设备对象详解
- 一个简单的NT驱动之创建设备对象函数(CreateDevice)
- Linux驱动程序开发 003- 设备与驱动的关系
- Windows内核学习笔记(一)--浅谈驱动对象、设备对象与请求
- [转载]驱动对象 设备对象 设备栈 乱杂谈
- ALSA驱动、设备函数调用关系
- ALSA驱动、设备函数调用关系
- Linux 设备 设备驱动 设备结点 (设备号) 关系
- 浅谈驱动对象、设备对象与请求
- [转]驱动对象 设备对象 设备栈 乱杂谈
- [译]为驱动设备对象设置适当的安全描述符
- 驱动视频:windows驱动讲稿1.5 - 创建设备对象
- 驱动对象 设备对象 设备栈 乱杂谈
- 过滤键盘驱动对象Kbdclass的所有设备对象
- 驱动对象-设备对象-设备栈
- 设备模型、设备与驱动关联的全过程分析 platform_device platform_driver driver bus关系