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 例程的驱动程序的加载映像。 此成员由 I/O 管理器在成功调用 IoCreateDevice 或 IoCreateDeviceSecure 时设置。 这是一个只读成员。
NextDevice
指向由同一驱动程序创建的下一个设备对象的指针(如果有)。 每次成功调用 IoCreateDevice 或 IoCreateDeviceSecure 时,I/O 管理器都会更新此列表。
要卸载的非即插即用 (PnP) 驱动程序必须遍历 (“walk”) 其设备对象列表并将其删除。 PnP 驱动程序不必遍览此设备对象列表。 相反,PnP 驱动程序在设备删除 PnP 操作期间执行清理 (IRP_MN_REMOVE_DEVICE) 。
动态重新创建其设备对象的驱动程序也使用此成员。 这是一个读/写成员。
AttachedDevice
指向附加设备对象的指针。 如果没有附加的设备对象,则此成员为 NULL。 AttachedDevice 成员指向的设备对象通常是筛选器驱动程序的设备对象,该对象截获最初以设备对象表示的设备为目标的 I/O 请求。 有关详细信息,请参阅 IoAttachDevice 和 IoAttachDeviceByPointer 主题。 这是一个不透明的成员。
CurrentIrp
一个指向当前 IRP 的指针,如果驱动程序有一个 StartIo 例程,该例程的入口点是在驱动程序对象中设置的,并且驱动程序当前正在处理 IRP () 。 否则,此成员为 NULL。 有关详细信息,请参阅 IoStartPacket 和 IoStartNextPacket 主题。 这是一个只读成员。
Timer
指向计时器对象的指针。 这允许 I/O 管理器每秒调用驱动程序提供的计时器例程。 有关详细信息,请参阅 IoInitializeTimer。 这是一个读/写成员。
Flags
设备驱动程序使用以下一个或多个系统定义的值,在其新创建的设备对象中对此成员执行按位 OR 操作。
有关如何设置 Flags 成员的详细信息,请参阅 初始化设备对象。
值 | 含义 |
---|---|
DO_VERIFY_VOLUME (0x00000002) | 可移动媒体驱动程序在处理传输请求时设置此标志。 在传输任何数据之前,此类驱动程序还应在传输请求的目标中检查此标志。 有关详细信息,请参阅 支持可移动媒体 主题。 |
DO_BUFFERED_IO (0x00000004) | 指定 I/O 管理器对发送到设备堆栈的 I/O 请求使用的缓冲类型。 较高级别的驱动程序或此成员的值与堆栈中下一个较低级别的驱动程序相同,但可能对于最高级别的驱动程序除外。 |
DO_EXCLUSIVE (0x00000008) | 指示驱动程序为独占设备提供服务,例如视频、串行、并行或声音设备。 WDM 驱动程序不得设置此标志。 有关详细信息,请参阅 指定对设备对象的独占访问 主题。 |
DO_DIRECT_IO (0x00000010) | 请参阅 DO_BUFFERED_IO。 |
DO_MAP_IO_BUFFER (0x00000020) | 不再使用此标志。 驱动程序不应设置此标志。 |
DO_DEVICE_INITIALIZING (0x00000080) | I/O 管理器在创建设备对象时设置此标志。 设备函数驱动程序或筛选器驱动程序在其 AddDevice 例程中清除标志后: (1) 将设备对象附加到设备堆栈。 (2) 建立设备电源状态。 (3) 在有必要) 的情况下,使用其中一个电源标志 (对成员执行按位 OR 操作。 即插即用 (PnP) 管理器检查在 AddDevice 例程返回后标志是否清除。 |
DO_SHUTDOWN_REGISTERED (0x00000800) | 由 I/O 管理器用于指示驱动程序已注册设备对象以用于关闭通知。 驱动程序不应使用此标志。 |
DO_BUS_ENUMERATED_DEVICE (0x00001000) | 操作系统在每个物理设备对象 (PDO) 中设置此标志。 驱动程序不得修改此标志。 |
DO_POWER_PAGABLE (0x00002000) | 与 Microsoft Windows 2000 及更高版本的 Windows 兼容的可分页驱动程序不属于分页路径,并且不需要当前浪涌,必须设置此标志。 系统在 IRQL = PASSIVE_LEVEL 调用此类驱动程序。 驱动程序不能同时设置此标志和DO_POWER_INRUSH。 WDM、Microsoft Windows 98 和 Windows Millennium Edition 的所有驱动程序都必须设置DO_POWER_PAGABLE。 |
DO_POWER_INRUSH (0x00004000) | 打开设备时需要当前浪涌的设备的驱动程序必须设置此标志。 驱动程序无法同时设置此标志和DO_POWER_PAGABLE。 |
DO_DEVICE_TO_BE_RESET (0x04000000) | I/O 管理器将此标志设置为总线驱动程序重置设备的信号。 其他驱动程序不应使用此标志。 |
DO_DAX_VOLUME (0x10000000) | 指示卷是 DAX 卷。 |
Characteristics
指定一个或多个系统定义的常量(结合按位 OR 操作),这些常量提供有关驱动程序设备的其他信息。 这些常量包括以下内容:
值 | 含义 |
---|---|
FILE_AUTOGENERATED_DEVICE_NAME | 指示 I/O 管理器为设备生成名称,而不是调用方在调用此例程时指定 DeviceName 。 I/O 管理器确保名称是唯一的。 此特征通常由 PnP 总线驱动程序指定,用于为同一总线上的子设备生成物理设备对象 (PDO) 的名称。 |
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
由 IoCreateDevice 和 IoCreateDeviceSecure 使用为该例程的 DeviceType 参数指定的值进行设置。 有关详细信息,请参阅 指定设备类型 主题。
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 微型端口驱动程序创建的设备对象的字段。
要求
要求 | 值 |
---|---|
Header | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h) |