DEVICE_OBJECT 结构 (wdm.h)
操作系统使用 DEVICE_OBJECT 结构来表示设备对象。 设备对象表示驱动程序处理 I/O 请求的逻辑、虚拟或物理设备。
语法
typedef struct _DEVICE_OBJECT {
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
struct _DRIVER_OBJECT *DriverObject;
struct _DEVICE_OBJECT *NextDevice;
struct _DEVICE_OBJECT *AttachedDevice;
struct _IRP *CurrentIrp;
PIO_TIMER Timer;
ULONG Flags;
ULONG Characteristics;
__volatile PVPB Vpb;
PVOID DeviceExtension;
DEVICE_TYPE DeviceType;
CCHAR StackSize;
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, *PDEVICE_OBJECT;
成员
Type
由操作系统用来指示对象是设备对象。 对于设备对象,此成员的值为 3。 这是一个只读成员。
Size
指定设备对象的大小(以字节为单位)。 此大小包括 DeviceExtension 成员指向的驱动程序指定的设备扩展,但不包括 DeviceObjectExtension 成员指向的不透明设备对象扩展。 Size 是只读成员。
ReferenceCount
由 I/O 管理器用于跟踪与设备对象关联的设备的打开句柄数。 这样,当驱动程序的设备 () 存在未完成句柄时,I/O 管理器可以避免卸载驱动程序。 这是一个只读成员。
DriverObject
指向驱动程序对象的指针 (DRIVER_OBJECT) ,表示输入到 DriverEntry 和 AddDevice 例程的驱动程序的已加载映像。 此成员在成功调用 IoCreateDevice 或 IoCreateDeviceSecure 后由 I/O 管理器设置。 这是一个只读成员。
NextDevice
指向由同一驱动程序创建的下一个设备对象的指针(如果有)。 每次成功调用 IoCreateDevice 或 IoCreateDeviceSecure 时,I/O 管理器都会更新此列表。
正在卸载的非即插即用 (PnP) 驱动程序必须遍历 (“walk”) 其设备对象列表并删除它们。 PnP 驱动程序不必遍视此设备对象列表。 相反,PnP 驱动程序在设备删除 PnP 操作期间执行清理, (IRP_MN_REMOVE_DEVICE) 。
动态重新创建其设备对象的驱动程序也使用此成员。 这是一个读/写成员。
AttachedDevice
指向附加设备对象的指针。 如果没有附加的设备对象,则此成员为 NULL。 AttachedDevice 成员指向的设备对象通常是筛选器驱动程序的设备对象,该筛选器驱动程序截获最初针对由设备对象表示的设备的 I/O 请求。 有关详细信息,请参阅 IoAttachDevice 和 IoAttachDeviceByPointer 主题。 这是一个不透明的成员。
CurrentIrp
如果驱动程序有一个 StartIo 例程,其入口点已在驱动程序对象中设置,并且驱动程序当前正在处理 IRP () ,则为指向当前 IRP 的指针。 否则,此成员为 NULL。 有关详细信息,请参阅 IoStartPacket 和 IoStartNextPacket 主题。 这是一个只读成员。
Timer
指向计时器对象的指针。 这允许 I/O 管理器每秒调用驱动程序提供的计时器例程。 有关详细信息,请参阅 IoInitializeTimer。 这是一个读/写成员。
Flags
设备驱动程序使用以下一个或多个系统定义的值,在其新建的设备对象中对此成员执行按位 OR 操作:
DO_BUFFERED_IO或DO_DIRECT_IO
指定 I/O 管理器用于发送到设备堆栈的 I/O 请求的缓冲类型。 较高级别的驱动程序 或此成员,其值与堆栈中下一个较低级别的驱动程序相同,但可能最高级别驱动程序除外。
DO_BUS_ENUMERATED_DEVICE
操作系统在每个物理设备对象 (PDO) 中设置此标志。 驱动程序不得修改此标志。
DO_DEVICE_INITIALIZING
I/O 管理器在创建设备对象时设置此标志。 设备函数驱动程序或筛选器驱动程序在执行以下操作后,会清除其 AddDevice 例程中的标志:
- 将设备对象附加到设备堆栈。
- 建立设备电源状态。
- 如果需要) ,则对具有其中一个电源标志的成员执行按位 OR 操作 (。
DO_EXCLUSIVE
指示驱动程序为独占设备提供服务,例如视频、串行设备、并行设备或声音设备。 WDM 驱动程序不得设置此标志。 有关详细信息,请参阅 指定对设备对象的独占访问 主题。
DO_MAP_IO_BUFFER
不再使用此标志。 驱动程序不应设置此标志。
DO_POWER_INRUSH
打开设备时需要当前浪涌的设备的驱动程序必须设置此标志。 驱动程序不能同时设置此标志和DO_POWER_PAGABLE。
DO_POWER_PAGABLE
与 Microsoft Windows 2000 及更高版本的 Windows 兼容的可分页驱动程序不是分页路径的一部分,并且不需要当前启动必须设置此标志。 系统在 IRQL = PASSIVE_LEVEL 调用此类驱动程序。 驱动程序不能同时设置此标志和DO_POWER_INRUSH。 WDM、Microsoft Windows 98 和 Windows Millennium Edition 的所有驱动程序都必须设置DO_POWER_PAGABLE。
DO_SHUTDOWN_REGISTERED
由 I/O 管理器用来指示驱动程序已注册设备对象以接收关闭通知。 驱动程序不应使用此标志。
DO_VERIFY_VOLUME
可移动媒体驱动程序在处理传输请求时设置此标志。 此类驱动程序还应在传输任何数据之前,在传输请求的目标中检查此标志。 有关详细信息,请参阅 支持可移动媒体 主题。
有关如何设置 Flags 成员的详细信息,请参阅 初始化设备对象。
Characteristics
指定一个或多个系统定义的常量(结合按位 OR 操作),这些常量提供有关驱动程序设备的其他信息。 这些常量包括:
FILE_AUTOGENERATED_DEVICE_NAME
指示 I/O 管理器为设备生成名称,而不是调用方在调用此例程时指定 DeviceName 。 I/O 管理器确保名称是唯一的。 此特征通常由 PnP 总线驱动程序指定,以便为同一总线上的子设备生成物理设备对象的名称 (PDO) 。 从 Microsoft Windows 2000 和 Microsoft Windows 98 开始,此特征是新的。
FILE_CHARACTERISTIC_PNP_DEVICE
指示设备对象是即插即用 (PnP) 堆栈的一部分。 如果总线驱动程序 (或总线筛选器驱动程序) 注册对尚未收到IRP_MN_START_DEVICE请求的设备对象的 WMI 支持,则需要 此 特征。 如果函数或筛选器驱动程序在附加到其设备堆栈 之前 注册 WMI,则还需要FILE_CHARACTERISTIC_PNP_DEVICE。
FILE_CHARACTERISTIC_TS_DEVICE
指示设备对象是终端服务设备堆栈的一部分。 驱动程序不应设置此特征。
FILE_CHARACTERISTIC_WEBDAV_DEVICE
指示设备上装载了基于 Web 的分布式创作和版本控制 (WebDAV) 文件系统。 驱动程序不应设置此特征。
FILE_DEVICE_IS_MOUNTED
指示文件系统已装载到设备上。 驱动程序不应设置此特征。
FILE_DEVICE_SECURE_OPEN
指示 I/O 管理器将设备对象的安全描述符应用于相对打开,并打开设备的尾随文件名。 有关详细信息,请参阅 控制设备命名空间访问 主题。
FILE_FLOPPY_DISKETTE
指示设备是软盘设备。
FILE_READ_ONLY_DEVICE
指示无法将设备写入。
FILE_REMOTE_DEVICE
指示设备是远程设备。
FILE_REMOVABLE_MEDIA
指示存储设备支持可移动媒体。 请注意,此特征指示可移动 媒体, 而不是可移动设备。 例如,JAZ 驱动器设备的驱动程序应指定此特征,但 PCMCIA 闪存磁盘的驱动程序不应指定。
FILE_VIRTUAL_VOLUME
指示卷是虚拟卷。 驱动程序不应设置此特征。
FILE_WRITE_ONCE_MEDIA
指示设备支持写入一次媒体。 驱动程序不会直接设置此成员。 有关如何设置设备特征的详细信息,请参阅 指定设备特征 主题。
FILE_CHARACTERISTIC_CSV
指示设备是群集共享卷 (CSV) 。
FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL
当客户端是应用容器时,IO 管理器通常执行完全安全检查,以便对打开的每个文件进行遍历访问。 如果客户端令牌已具有遍历权限,则此标志的设置会绕过此强制遍历访问检查。
FILE_PORTABLE_DEVICE
指示基础堆栈认为设备可移植。 这由存储堆栈使用,意味着设备不在本地计算机容器中,并且不在固定总线类型上。
Vpb
指向卷参数块的指针, (与设备对象关联的 VPB) 。 对于文件系统驱动程序,VPB 可以提供与表示已装载卷实例的任何未命名逻辑设备对象的连接。 这是一个不透明的成员。
DeviceExtension
指向设备扩展的指针。 设备扩展的结构和内容由驱动程序定义。 大小由驱动程序确定,在驱动程序对 IoCreateDevice 或 IoCreateDeviceSecure 的调用中指定。 有关设备扩展的详细信息,请参阅 设备扩展。 这是一个只读成员。 但是,驱动程序可以修改成员指向的对象。
DeviceType
通过使用为该例程的 DeviceType 参数指定的值,由 IoCreateDevice 和 IoCreateDeviceSecure 设置。 有关详细信息,请参阅 指定设备类型 主题。
StackSize
指定要发送到此驱动程序的 IRP 中的最小堆栈位置数。 IoCreateDevice 和 IoCreateDeviceSecure 在新创建的设备对象中将此成员设置为 1;因此,最低级别的驱动程序可以忽略此成员。 如果驱动程序调用 IoAttachDevice 或 IoAttachDeviceToDeviceStack,I/O 管理器会自动将较高级别驱动程序的设备对象中的 StackSize 成员设置为适当的值。 只有使用 IoGetDeviceObjectPointer 将自身链接到另一个驱动程序的较高级别驱动程序,才能在其自己的设备对象中显式设置 StackSize 的值, () 设置为 1 + 下一个较低级驱动程序的设备对象的 StackSize 值。
Queue
I/O 管理器在内部使用,以便在需要时对设备对象进行排队。 这是一个不透明的成员。
Queue.ListEntry
包含双链接列表的向前和向后指针的 LIST_ENTRY 结构。
Queue.Wcb
I/O 管理器使用的设备上下文信息。
AlignmentRequirement
指定设备数据传输的地址对齐要求。 该值必须是 Wdm.h 中定义的FILE_XXX_ALIGNMENT值之一。 有关详细信息,请参阅 初始化设备对象、 GetDmaAlignment 和 ZwQueryInformationFile 主题。
DeviceQueue
设备对象的设备队列对象。 设备队列对象包含等待由与设备对象关联的驱动程序处理的任何 IRP。 有关详细信息,请参阅 驱动程序托管的 IRP 队列 主题。 这是一个不透明的成员。
Dpc
延迟过程调用 (设备对象的 DPC) 对象。 有关详细信息,请参阅 DPC 对象简介 主题。 这是一个不透明的成员。
ActiveThreadCount
保留供将来使用。 这是一个不透明的成员。
SecurityDescriptor
指定创建设备对象时 (SECURITY_DESCRIPTOR) 的安全 描述符。 如果此成员为 NULL,则设备对象将接收默认安全设置。 这是一个只读成员,尽管可以通过 ZwSetSecurityObject函数修改该成员。
DeviceLock
由 I/O 管理器分配的同步事件对象。 I/O 管理器在将装载或装载验证请求调度到文件系统驱动程序之前获取其事件对象。 这是一个不透明的成员。
SectorSize
如果设备对象不表示卷,则此成员设置为零。 如果设备对象表示卷,则此成员指定卷的扇区大小(以字节为单位)。 I/O 管理器使用此成员来确保在禁用中间缓冲时发出的所有读取操作、写入操作和设置文件位置操作都正确对齐。 创建设备对象时,将使用默认的系统每扇区字节值,但是文件系统驱动程序;更罕见的是,旧版和微筛选器驱动程序可以在装载发生时更新此值,该值基于基础卷硬件的几何图形。 其他驱动程序不应修改此成员。
Spare1
预留给系统使用。 这是一个不透明的成员。
DeviceObjectExtension
指向设备对象扩展的指针,I/O 管理器和 PnP 管理器使用该扩展来存储有关设备状态的信息。 这是一个不透明的成员。
Reserved
预留给系统使用。 这是一个不透明的成员。
注解
操作系统按设备对象表示设备。 有关详细信息,请参阅 设备对象和设备堆栈 主题。
驱动程序使用 IoCreateDevice 和 IoCreateDeviceSecure 例程创建设备对象。 有关如何创建设备对象的详细信息,请参阅 创建设备对象。
设备对象部分不透明。 除非另有说明,否则驱动程序不会直接设置设备对象的成员。 有关驱动程序可以直接修改的成员的详细信息,请参阅 初始化设备对象。 有关其他设备对象属性的信息,请参阅 设备对象的属性。
设备对象中的不透明成员必须被视为不可访问。 随着时间的推移,依赖于对象成员位置或访问不透明成员的驱动程序可能无法保持可移植和与其他驱动程序的互操作。
系统提供的视频端口驱动程序设置它代表 视频微型端口驱动程序创建的设备对象的字段。
系统提供的 SCSI 端口驱动程序设置它代表 SCSI 微型端口驱动程序创建的设备对象的字段。
系统提供的 NDIS 库设置它代表 NDIS 微型端口驱动程序创建的设备对象的字段。
要求
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h) |