设备对象(DEVICE_OBJECT)
每个驱动程序会创建一个或多个设备对象,用DEVICE_OBJECT数据结构表示。每个设备对象都会有一个指针指向下一个设备对象,因此就形成一个设备链。设备对象链的第一个设备是由DRIVER_OBJECT结构体中指明的。设备对象保存设备特征和状态的信息,其数据结构定义如下:
typedef struct _DEVICE_OBJECT {
CSHORT Type; // 由操作系统用来指示对象是设备对象。 对于设备对象,此成员的值为 3。 这是一个只读成员
USHORT Size; // 指定设备对象的大小(以字节为单位)。 此大小包括 DeviceExtension
// 成员指向的驱动程序指定的设备扩展,但不包括 DeviceObjectExtension
// 成员指向的不透明设备对象扩展。 Size 是只读成员。
LONG ReferenceCount; // 由 I/O 管理器用于跟踪与设备对象关联的设备的打开句柄数。
// 这样,当驱动程序的设备 () 有未完成的句柄时,
// I/O 管理器就可以避免卸载驱动程序。 这是一个只读成员。
struct _DRIVER_OBJECT *DriverObject; // DriverObject: 指向驱动程序中的驱动对象。
// 同属于一个驱动程序的驱动对象指向的是统一驱动对象。
struct _DEVICE_OBJECT *NextDevice; // NextDevice:指向下一个设备对象。这里指的下一个设备对象是同属于一个驱动对象的设备,
// 也就是同一个驱动, 程序创建的若干设备对象。每个设备对象根据NextDevice域形成链表,
// 从而可以枚举每个设备对象。
struct _DEVICE_OBJECT *AttachedDevice; // AttachedDevice: 指向下一个设备对象。这里指的出,如果由更高一层的驱动附加
// 到这个驱动的时候,AttachedDevice 指向的就是那个更高一层的驱动。
struct _IRP *CurrentIrp; // CurrentIrp: 在使用StartIO例程的时候,此域指向的是当前IRP结构。
PIO_TIMER Timer; // 指向计时器对象的指针。 这允许 I/O 管理器每秒调用驱动程序提供的计时器例程。
// 有关详细信息,请参阅 IoInitializeTimer。 这是一个读/写成员
ULONG Flags; // Flags: 此域是一个32位的无符号整形。每一个位由具体的含义。
ULONG Characteristics;
__volatile PVPB Vpb;
PVOID DeviceExtension; // DeviceExtension : 指向的是设备的扩展对象。每个设备都会指定一个设备扩展对象。
// 设备扩展对象记录的是设备自己特殊定义的结构体,也就是由程序员自己定义的结构体。
// 另外,在驱动程序中,应该尽量避免全局变量的使用,因为全局变量涉及不容易同步的问
// 题。解决的办法,将全局变量存在设备扩展里。
DEVICE_TYPE DeviceType; // DeviceType: 指明设备的类型,常用类型如下
CCHAR StackSize;
union {
LIST_ENTRY ListEntry;
WAIT_CONTEXT_BLOCK Wcb;
} Queue;
ULONG AlignmentRequirement; // AlignmentRequirement: 设备在大容量传输的时候需要
// 内存对其,以保证传输速度。
KDEVICE_QUEUE DeviceQueue;
KDPC Dpc;
ULONG ActiveThreadCount;
PSECURITY_DESCRIPTOR SecurityDescriptor;
KEVENT DeviceLock;
USHORT SectorSize; // StackSize: 在多层驱动的情况下,驱动与驱动之间会形成类似
// 堆栈的结构。IRP会依次从最高层传递到最底层。
// StackSize描述的就是这个层次
USHORT Spare1;
struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
PVOID Reserved;
} DEVICE_OBJECT, *PDEVICE_OBJECT;
根据设备需要,需要填写相应的设备类型。当制作虚拟设备时,应选择FILE_DEVICE_UNKNOWN类型的设备。
表2 DeviceType | ||
设备类型 | 编码 | 描述 |
FILE_DEVICE_8042_PORT | 0x00000027 | 8042端口设备对象 |
FILE_DEVICE_ACPI | 0x00000032 | ACPI设备对象 |
FILE_DEVICE_BATTERY | 0x00000029 | 电池设备对象 |
FILE_DEVICE_BEEP | 0x00000001 | 蜂鸣器设备对象 |
FILE_DEVICE_BUS_EXTENDER | 0x0000002a | 总线扩展设备对象 |
FILE_DEVICE_CD_ROM | 0x00000002 | CD光驱设备对象 |
FILE_DEVICE_CD_ROM_FILE_SYSTEM | 0x00000003 | CD光驱文件系统设备对象 |
FILE_DEVICE_CHANGER | 0x00000030 | 充电设备对象 |
FILE_DEVICE_CONTROLLER | 0x00000004 | 控制器设备对象 |
FILE_DEVICE_DATALINK | 0x00000005 | 数据链设备对象 |
FILE_DEVICE_DFS | 0x00000006 | DFS设备对象 |
FILE_DEVICE_DFS_FILE_SYSTEM | 0x00000035 | |
FILE_DEVICE_DFS_VOLUME | 0x00000036 | |
FILE_DEVICE_DISK | 0x00000007 | 磁盘设备对象 |
FILE_DEVICE_DISK_FILE_SYSTEM | 0x00000008 | 磁盘文件系统设备对象 |
FILE_DEVICE_DVD | 0x00000033 | DVD设备对象 |
FILE_DEVICE_FILE_SYSTEM | 0x00000009 | 文件系统设备对象 |
FILE_DEVICE_FIPS | 0x0000003a | |
FILE_DEVICE_FULLSCREEN_VIDEO | 0x00000034 | |
FILE_DEVICE_INPORT_PORT | 0x0000000a | 输入端口设备对象 |
FILE_DEVICE_KEYBOARD | 0x0000000b | 磁盘设备对象 |
FILE_DEVICE_KS | 0x0000002f | 内核流设备对象 |
FILE_DEVICE_KSEC | 0x00000039 | |
FILE_DEVICE_MAILSLOT | 0x0000000c | 邮件槽设备对象 |
FILE_DEVICE_MASS_STORAGE | 0x0000002d | 大容量存储设备对象 |
FILE_DEVICE_MIDI_IN | 0x0000000d | MIDI输入设备对象 |
FILE_DEVICE_MIDI_OUT | 0x0000000e | MIDI输出设备对象 |
FILE_DEVICE_MODEM | 0x0000002b | 调制解调器设备对象 |
FILE_DEVICE_MOUSE | 0x0000000f | 鼠标设备对象 |
FILE_DEVICE_MULTI_UNC_PROVIDER | 0x00000010 | 多UNC设备对象 |
FILE_DEVICE_NAMED_PIPE | 0x00000011 | 命名管道设备对象 |
FILE_DEVICE_NETWORK | 0x00000012 | 网络设备对象 |
FILE_DEVICE_NETWORK_BROWSER | 0x00000013 | 网络浏览器设备对象 |
FILE_DEVICE_NETWORK_FILE_SYSTEM | 0x00000014 | 网络文件系统设备对象 |
FILE_DEVICE_NETWORK_REDIRECTOR | 0x00000028 | 网卡设备对象 |
FILE_DEVICE_NULL | 0x00000015 | 空设备对象 |
FILE_DEVICE_PARALLEL_PORT | 0x00000016 | 并口设备对象 |
FILE_DEVICE_PHYSICAL_NETCARD | 0x00000017 | 物理网卡设备对象 |
FILE_DEVICE_PRINTER | 0x00000018 | 打印机设备对象 |
FILE_DEVICE_SCANNER | 0x00000019 | 扫描仪设备对象 |
FILE_DEVICE_SCREEN | 0x0000001c | 屏幕设备对象 |
FILE_DEVICE_SERENUM | 0x00000037 | |
FILE_DEVICE_SERIAL_MOUSE_PORT | 0x0000001a | 串口鼠标设备对象 |
FILE_DEVICE_SERIAL_PORT | 0x0000001b | 串口设备对象 |
FILE_DEVICE_SMARTCARD | 0x00000031 | 智能卡设备对象 |
FILE_DEVICE_SMB | 0x0000002e | SMB设备对象 |
FILE_DEVICE_SOUND | 0x0000001d | 声音设备对象 |
FILE_DEVICE_STREAMS | 0x0000001e | 流设备对象 |
FILE_DEVICE_TAPE | 0x0000001f | 磁带设备对象 |
FILE_DEVICE_TAPE_FILE_SYSTEM | 0x00000020 | 磁带文件系统设备对象 |
FILE_DEVICE_TERMSRV | 0x00000038 | |
FILE_DEVICE_TRANSPORT | 0x00000021 | 传输设备对象 |
FILE_DEVICE_UNKNOWN | 0x00000022 | 未知设备对象 |
FILE_DEVICE_VDM | 0x0000002c | |
FILE_DEVICE_VIDEO | 0x00000023 | 视频设备对象 |
FILE_DEVICE_VIRTUAL_DISK | 0x00000024 | 虚拟磁盘设备对象 |
FILE_DEVICE_WAVE_IN | 0x00000025 | 声音输入设备对象 |
FILE_DEVICE_WAVE_OUT | 0x00000026 | 声音输出设备对象 |