设备对象(DEVICE_OBJECT)

发布时间:2024年01月22日

????????设备对象(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??????????0x000000278042端口设备对象
FILE_DEVICE_ACPI???????????????0x00000032ACPI设备对象
FILE_DEVICE_BATTERY????????????0x00000029电池设备对象
FILE_DEVICE_BEEP???????????????0x00000001蜂鸣器设备对象
FILE_DEVICE_BUS_EXTENDER???????0x0000002a总线扩展设备对象
FILE_DEVICE_CD_ROM?????????????0x00000002CD光驱设备对象
FILE_DEVICE_CD_ROM_FILE_SYSTEM?0x00000003CD光驱文件系统设备对象
FILE_DEVICE_CHANGER????????????0x00000030充电设备对象
FILE_DEVICE_CONTROLLER?????????0x00000004控制器设备对象
FILE_DEVICE_DATALINK???????????0x00000005数据链设备对象
FILE_DEVICE_DFS????????????????0x00000006DFS设备对象
FILE_DEVICE_DFS_FILE_SYSTEM????0x00000035 
FILE_DEVICE_DFS_VOLUME?????????0x00000036 
FILE_DEVICE_DISK???????????????0x00000007磁盘设备对象
FILE_DEVICE_DISK_FILE_SYSTEM???0x00000008磁盘文件系统设备对象
FILE_DEVICE_DVD????????????????0x00000033DVD设备对象
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????????????0x0000000dMIDI输入设备对象
FILE_DEVICE_MIDI_OUT???????????0x0000000eMIDI输出设备对象
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_SYSTEM0x00000014网络文件系统设备对象
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????????????????0x0000002eSMB设备对象
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声音输出设备对象
文章来源:https://blog.csdn.net/wendyWJGU/article/details/135758773
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。