DRIVER_OBJECT是驱动程序在内核中的数据结构,每个驱动程序有唯一DRIVER_OBJECT,IO管理器使用驱动程序对象代表每个设备驱动程序,驱动程序对象有一个DeviceObject域指向一个设备对象链表,每个设备对象代表一个设备。
DEVICE_OBJECT是物理设备或逻辑设备在内核中的数据结构,跟这个概念相关的有PDO和FDO;PDO对应于具体的硬件设备,每个硬件设备对应一个PDO,而一个PDO可以对应多个FDO;PDO和FDO都是DEVICE_OBJECT的实体;
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_DISPAT
CH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION];
}DRIVER_OBJECT;
typedef struct _DEVICE_OBJECT { SHORT Type; WORD Size; LONG ReferenceCount; PDRIVER_OBJECT DriverObject; PDEVICE_OBJECT NextDevice; PDEVICE_OBJECT AttachedDevice; PIRP CurrentIrp; PIO_TIMER Timer; ULONG Flags; ULONG Characteristics; PVPB Vpb; PVOID DeviceExtension; ULONG DeviceType; CHAR StackSize; BYTE Queue[40]; ULONG AlignmentRequirement; KDEVICE_QUEUE DeviceQueue; KDPC Dpc; ULONG ActiveThreadCount; PVOID SecurityDescriptor; KEVENT DeviceLock; WORD SectorSize; WORD Spare1; PDEVOBJ_EXTENSION DeviceObjectExtension; PVOID Reserved; } DEVICE_OBJECT |
同一个设备驱动程序对象下的所有设备通过NextObject域连接成一个链表(即上述驱动程序设备对象的一个域);DriverObject域指向与该设备相关的驱动程序对象