当前位置 博文首页 > OBJECT_KOOKNUT的博客:驱动程序数据结构--DRIVER
我们先来看一下微软对这个结构体的定义:
typedef struct _DRIVER_OBJECT
{
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;//该驱动程序挂载的设备对象
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;//当前驱动名
PUNICODE_STRING HardwareDatabase;//设备硬件数据库键名,Pointer to the \Registry\Machine\Hardware path to the hardware configuration information in the registry.
PFAST_IO_DISPATCH FastIoDispatch;//指向定义驱动程序的快速I/O入口点的结构的指针。此成员仅供FSDs和网络传输驱动程序使用。
PDRIVER_INITIALIZE DriverInit;//驱动入口例程的入口点,由IO管理器设置
PDRIVER_STARTIO DriverStartIo;//指向StartIO例程的函数地址
PDRIVER_UNLOAD DriverUnload;//驱动卸载函数的回调地址
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];//处理IRP派遣例程的指针数组 IRP_MJ_MAXIMUM_FUNCTION 0x1b
} DRIVER_OBJECT;
每个驱动程序会有自己的驱动对象与之对应,该对象是由驱动加载时候,对象管理器给驱动程序创建的。
还有一个很重要的结构体设备对象(DEVICE_OBJECT):
typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
struct _DRIVER_OBJECT *DriverObject;//当前设备对象所属的驱动对象
struct _DEVICE_OBJECT *NextDevice;//下一个设备对象
struct _DEVICE_OBJECT *AttachedDevice;//attach到的设备对象
struct _IRP *CurrentIrp;//当前IRP堆栈
PIO_TIMER Timer;
ULONG Flags; //设备对象标志
ULONG Characteristics; // See ntioapi: FILE_...
__volatile PVPB Vpb;
PVOID DeviceExtension;//设备拓展对象
DEVICE_TYPE DeviceType;//设备类型,包括磁盘、文件、邮槽等等
CCHAR StackSize;//IO堆栈的层数
union {
LIST_ENTRY ListEntry;
WAIT_CONTEXT_BLOCK Wcb;
} Queue;
ULONG AlignmentRequirement;//内存对齐
KDEVICE_QUEUE DeviceQueue;
KDPC Dpc;
ULONG ActiveThreadCount;
PSECURITY_DESCRIPTOR SecurityDescriptor;
KEVENT DeviceLock;
USHORT SectorSize;
USHORT Spare1;
struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
PVOID Reserved;
} DEVICE_OBJECT;
每个驱动程序会创建一个或多个设备对象,每个设备对象都有一个指针指向下一个设备对象(如果下一个存在),会形成一个设备链。
设备拓展:
设备拓展由程序员指定内容和大小,由I\O管理器创建的,保存在非分页内存中。在驱动程序编写时候,为保证多线程的安全性,将一些全局数据以设备拓展的形式存储。
“夜色之浓,莫过于黎明前的黑暗。”
参考书籍:
《Windows驱动开发技术详解》