CM_PARTIAL_RESOURCE_DESCRIPTOR结构 (wdm.h)
CM_PARTIAL_RESOURCE_DESCRIPTOR 结构指定分配给设备的单个类型的一个或多个系统硬件资源。 此结构用于在 CM_PARTIAL_RESOURCE_LIST 结构中创建数组。
语法
typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
UCHAR Type;
UCHAR ShareDisposition;
USHORT Flags;
union {
struct {
PHYSICAL_ADDRESS Start;
ULONG Length;
} Generic;
struct {
PHYSICAL_ADDRESS Start;
ULONG Length;
} Port;
struct {
#if ...
USHORT Level;
USHORT Group;
#else
ULONG Level;
#endif
ULONG Vector;
KAFFINITY Affinity;
} Interrupt;
struct {
union {
struct {
USHORT Group;
USHORT Reserved;
USHORT MessageCount;
ULONG Vector;
KAFFINITY Affinity;
} Raw;
struct {
#if ...
USHORT Level;
USHORT Group;
#else
ULONG Level;
#endif
ULONG Vector;
KAFFINITY Affinity;
} Translated;
} DUMMYUNIONNAME;
} MessageInterrupt;
struct {
PHYSICAL_ADDRESS Start;
ULONG Length;
} Memory;
struct {
ULONG Channel;
ULONG Port;
ULONG Reserved1;
} Dma;
struct {
ULONG Channel;
ULONG RequestLine;
UCHAR TransferWidth;
UCHAR Reserved1;
UCHAR Reserved2;
UCHAR Reserved3;
} DmaV3;
struct {
ULONG Data[3];
} DevicePrivate;
struct {
ULONG Start;
ULONG Length;
ULONG Reserved;
} BusNumber;
struct {
ULONG DataSize;
ULONG Reserved1;
ULONG Reserved2;
} DeviceSpecificData;
struct {
PHYSICAL_ADDRESS Start;
ULONG Length40;
} Memory40;
struct {
PHYSICAL_ADDRESS Start;
ULONG Length48;
} Memory48;
struct {
PHYSICAL_ADDRESS Start;
ULONG Length64;
} Memory64;
struct {
UCHAR Class;
UCHAR Type;
UCHAR Reserved1;
UCHAR Reserved2;
ULONG IdLowPart;
ULONG IdHighPart;
} Connection;
} u;
} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
成员
Type
标识资源类型。 为 类型 指定的常量值指示 u 联合中的哪个结构有效,如下表所示。 (这些标志在 CM_PARTIAL_RESOURCE_DESCRIPTOR 和 IO_RESOURCE_DESCRIPTOR 结构中使用,除非另有说明。
类型值 | u 成员子结构 |
---|---|
CmResourceTypePort | u.Port |
CmResourceTypeInterrupt | u.Interrupt 或 u.MessageInterrupt。如果设置了 标志 的CM_RESOURCE_INTERRUPT_MESSAGE标志,请使用 u.MessageInterrupt;否则,请使用 u.Interrupt。 |
CmResourceTypeMemory | u.Memory |
CmResourceTypeMemoryLarge | u.Memory40、u.Memory48或 u.Memory64之一。标志 成员中设置的 CM_RESOURCE_MEMORY_LARGE_XXX 标志决定了使用哪个结构。 |
CmResourceTypeDma | u.Dma(如果未设置CM_RESOURCE_DMA_V3),或 u.DmaV3(如果设置了CM_RESOURCE_DMA_V3标志) |
CmResourceTypeDevicePrivate | u.DevicePrivate |
CmResourceTypeBusNumber | u.BusNumber |
CmResourceTypeDeviceSpecific | u.DeviceSpecificData(IO_RESOURCE_DESCRIPTOR中未使用) |
CmResourceTypePcCardConfig | u.DevicePrivate |
CmResourceTypeMfCardConfig | u.DevicePrivate |
CmResourceTypeConnection | u.Connection |
CmResourceTypeConfigData | 保留供系统使用。 |
CmResourceTypeNonArbitrated | 未使用。 |
ShareDisposition
指示是否可以共享所描述的资源。 下表中列出了有效的常量值:
价值 | 意义 |
---|---|
CmResourceShareDeviceExclusive | 设备需要独占使用资源。 |
CmResourceShareDriverExclusive | 驱动程序需要独占使用资源。 WDM 驱动程序不支持。 |
CmResourceShareShared | 资源可以不受限制地共享。 |
Flags
包含特定于资源类型的标志位,如下表所示(标志可以按位 ORed 组合在一起):
CmResourceTypePort 资源类型
旗 | 定义 |
---|---|
CM_RESOURCE_PORT_MEMORY | 设备在内存地址空间中访问。 |
CM_RESOURCE_PORT_IO | 设备在 I/O 地址空间中访问。 |
CM_RESOURCE_PORT_10_BIT_DECODE | 设备解码端口地址的 10 位。 |
CM_RESOURCE_PORT_12_BIT_DECODE | 设备解码端口地址的 12 位。 |
CM_RESOURCE_PORT_16_BIT_DECODE | 设备解码端口地址的 16 位。 |
CM_RESOURCE_PORT_POSITIVE_DECODE | 设备使用“正解码”而不是“减反解码”。 (一般情况下,PCI 设备使用正解码,ISA 总线使用减反解码。 |
CM_RESOURCE_PORT_PASSIVE_DECODE | 设备解码端口,但驱动程序不使用它。 |
CM_RESOURCE_PORT_WINDOW_DECODE | 保留供系统使用。 |
CmResourceTypeInterrupt 资源类型
旗 | 定义 |
---|---|
CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE | IRQ 行是级别触发的。 (这些 IRQ 通常是可共享的。 |
CM_RESOURCE_INTERRUPT_LATCHED | IRQ 行是边缘触发的。 |
CM_RESOURCE_INTERRUPT_MESSAGE | 如果设置了此标志,则中断是消息信号中断。 否则,中断是基于行的中断。 |
CM_RESOURCE_INTERRUPT_POLICY_INCLUDED | 不与 CM_PARTIAL_RESOURCE_DESCRIPTOR 结构一起使用。 有关此标志的详细信息,请参阅 IO_RESOURCE_DESCRIPTOR。 |
CM_RESOURCE_INTERRUPT_SECONDARY_INTERRUPT | 中断是辅助中断。 可以从 Windows 8 开始设置此标志。 有关辅助中断的详细信息,请参阅 GPIO 中断。 |
CM_RESOURCE_INTERRUPT_WAKE_HINT | 中断能够从低功率空闲状态或系统睡眠状态唤醒操作系统。 可以从 Windows 8 开始设置此标志。 有关唤醒功能的详细信息,请参阅 启用设备唤醒。 |
CmResourceTypeMemory 资源类型
旗 | 定义 |
---|---|
CM_RESOURCE_MEMORY_READ_WRITE | 内存范围可读且可写。 |
CM_RESOURCE_MEMORY_READ_ONLY | 内存范围为只读。 |
CM_RESOURCE_MEMORY_WRITE_ONLY | 内存范围是只写的。 |
CM_RESOURCE_MEMORY_PREFETCHABLE | 内存范围是可预提取的。 |
CM_RESOURCE_MEMORY_COMBINEDWRITE | 允许组合写入缓存。 |
CM_RESOURCE_MEMORY_24 | 设备使用 24 位寻址。 |
CM_RESOURCE_MEMORY_CACHEABLE | 内存范围是可缓存的。 |
CmResourceTypeMemoryLarge 资源类型
旗 | 定义 |
---|---|
CM_RESOURCE_MEMORY_LARGE_40 | 内存描述符使用 u.Memory40 成员。 |
CM_RESOURCE_MEMORY_LARGE_48 | 内存描述符使用 u.Memory48 成员。 |
CM_RESOURCE_MEMORY_LARGE_64 | 内存描述符使用 u.Memory64 成员。 |
CmResourceTypeDma 资源类型
旗 | 定义 |
---|---|
CM_RESOURCE_DMA_8 | 8 位 DMA 通道 |
CM_RESOURCE_DMA_16 | 16 位 DMA 通道 |
CM_RESOURCE_DMA_32 | 32 位 DMA 通道 |
CM_RESOURCE_DMA_8_AND_16 | 8 位和 16 位 DMA 通道 |
CM_RESOURCE_DMA_BUS_MASTER | 设备支持总线主 DMA 传输。 |
CM_RESOURCE_DMA_TYPE_A | 键入 A DMA |
CM_RESOURCE_DMA_TYPE_B | 类型 B DMA |
CM_RESOURCE_DMA_TYPE_F | 类型 F DMA |
CM_RESOURCE_DMA_V3 | 使用 DmaV3 成员,而不是 Dma 成员。 从 Windows 8 开始,DmaV3 成员可用。 |
u
定义 u 联合
u.Generic
未使用。
u.Generic.Start
未使用。
u.Generic.Length
未使用。
u.Port
使用以下成员指定 I/O 端口地址的范围。
适用于 Windows Vista 和更高版本的 Windows 操作系统的驱动程序可以使用 RtlCmDecodeMemIoResource 和 RtlCmEncodeMemIoResource 来读取和更新 u.Port 成员,而不是直接更新它。
u.Port.Start
对于原始资源:指定分配给设备的连续 I/O 端口地址范围最低的总线相对物理地址。
对于已转换的资源:指定分配给设备的连续 I/O 端口地址范围最低的系统物理地址。
有关原始资源和已翻译的资源的详细信息,请参阅“备注”。
u.Port.Length
分配的 I/O 端口地址范围的长度(以字节为单位)。
u.Interrupt
使用以下成员指定中断向量和级别:
u.Interrupt.Level
对于原始资源:指定设备的特定于总线的 IRQL(适用于平台和总线)。
对于已翻译的资源:指定分配给设备的 DIRQL。
有关原始资源和已翻译的资源的详细信息,请参阅“备注”。
u.Interrupt.Group
指定处理器组编号。 仅当编译时定义NT_PROCESSOR_GROUPS常量时,此成员才存在。 此成员只能在 Windows 7 及更高版本的 Windows 上为非零。 组 和 地缘 成员共同指定一个组相关性,指示设备可以中断的处理器。 若要指定任何组的相关性,请将 组 设置为ALL_PROCESSOR_GROUPS。
u.Interrupt.Vector
对于原始资源:指定设备的特定于总线的中断矢量(如果适合平台和总线)。
对于已翻译的资源:指定分配给设备的全局系统中断向量。
有关原始资源和已翻译的资源的详细信息,请参阅“备注”。
u.Interrupt.Affinity
包含一个 KAFFINITY类型的位掩码值,该值指示设备可以中断的处理器集。 若要指示设备可以中断任何处理器,此成员设置为 -1。
u.MessageInterrupt
指定消息信号中断。 此成员是一个联合。 将 u.MessageInterrupt.Raw 用于原始资源,u.MessageInterrupt.Translated 用于已翻译的资源。 此类型的资源仅在 Windows Vista 和更高版本的 Windows 操作系统上返回。
有关原始资源和已翻译的资源的详细信息,请参阅“备注”。
u.MessageInterrupt.DUMMYUNIONNAME
定义 DUMMYUNIONNAME 联合。
u.MessageInterrupt.DUMMYUNIONNAME.Raw
定义 Raw 结构。
u.MessageInterrupt.DUMMYUNIONNAME.Raw.Group
指定处理器组号。 仅当编译时定义NT_PROCESSOR_GROUPS时,此成员才存在。 此成员只能在 Windows 7 及更高版本的 Windows 上为非零。 组 和 地缘 成员共同指定一个组相关性,指示哪些处理器可以接收设备的中断。 若要指定任何组的相关性,请将 组 设置为ALL_PROCESSOR_GROUPS。
u.MessageInterrupt.DUMMYUNIONNAME.Raw.Reserved
未使用。
u.MessageInterrupt.DUMMYUNIONNAME.Raw.MessageCount
指定为此驱动程序生成的消息信号中断数。
u.MessageInterrupt.DUMMYUNIONNAME.Raw.Vector
指定设备的中断向量。
u.MessageInterrupt.DUMMYUNIONNAME.Raw.Affinity
指定一个 KAFFINITY 值,该值指示接收设备的中断的处理器。
u.MessageInterrupt.DUMMYUNIONNAME.Translated
u.MessageInterrupt.Translated 成员具有以下成员:
u.MessageInterrupt.DUMMYUNIONNAME.Translated.Level
指定分配给设备的中断的设备 IRQL (DIRQL)。
指定分配给设备的中断的设备 IRQL (DIRQL)。
u.MessageInterrupt.DUMMYUNIONNAME.Translated.Group
指定处理器组号。 仅当编译时定义NT_PROCESSOR_GROUPS时,此成员才存在。 此成员只能在 Windows 7 及更高版本的 Windows 上为非零。 Translated.Group 和 Translated.Affinity 成员共同指定一个组相关性,指示哪些处理器可以接收设备的中断。 若要指定任何组的相关性,请将 Translated.Group 设置为ALL_PROCESSOR_GROUPS。
u.MessageInterrupt.DUMMYUNIONNAME.Translated.Vector
指定设备的中断向量。
u.MessageInterrupt.DUMMYUNIONNAME.Translated.Affinity
指定一个 KAFFINITY 值,该值标识接收设备的中断的处理器。
u.Memory
使用以下成员指定内存地址范围。
适用于 Windows Vista 和更高版本的 Windows 操作系统的驱动程序可以使用 RtlCmDecodeMemIoResource 和 RtlCmEncodeMemIoResource 来读取和更新 u.Memory 成员,而不是直接更新它。
u.Memory.Start
对于原始资源:指定分配给设备的连续内存地址范围中最低的总线相对物理地址。
对于已翻译的资源:指定分配给设备的连续内存地址范围最低的系统物理地址。
有关原始资源和已翻译的资源的详细信息,请参阅“备注”。
u.Memory.Length
指定分配的内存地址范围的长度(以字节为单位)。
u.Dma
使用以下成员之一指定 DMA 设置:
u.Dma.Channel
指定设备可以使用的系统 DMA 控制器上的 DMA 通道数。
u.Dma.Port
指定 MCA 类型设备可以使用的 DMA 端口数。
u.Dma.Reserved1
未使用。
u.DmaV3
指定使用 DMA_OPERATIONS 结构版本 3 的驱动程序的 DMA 设置。
从 Windows 8 开始,u.DmaV3 成员可用。
u.DmaV3.Channel
指定分配给设备的系统 DMA 控制器上的 DMA 通道数。
u.DmaV3.RequestLine
指定分配给设备的系统 DMA 控制器上的请求行数。
u.DmaV3.TransferWidth
指定分配给设备的系统 DMA 控制器用于向设备传输数据或从设备传输数据的宽度(以位为单位)。
u.DmaV3.Reserved1
未使用。
u.DmaV3.Reserved2
未使用。
u.DmaV3.Reserved3
未使用。
u.DevicePrivate
保留供系统使用。
u.DevicePrivate.Data[3]
u.BusNumber
使用以下成员指定总线编号:
u.BusNumber.Start
指定分配给设备的连续总线范围的最小编号。
u.BusNumber.Length
指定分配给设备的总线数。
u.BusNumber.Reserved
未使用。
u.DeviceSpecificData
指定追加到 CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的末尾的设备特定的专用结构的大小。 如果使用 u.DeviceSpecificData,则 CM_PARTIAL_RESOURCE_DESCRIPTOR 结构必须是 CM_PARTIAL_RESOURCE_LIST 数组中的最后一个结构。
特定于设备的结构的示例包括 CM_FLOPPY_DEVICE_DATA、CM_KEYBOARD_DEVICE_DATA、CM_SCSI_DEVICE_DATA和 CM_SERIAL_DEVICE_DATA。
u.DeviceSpecificData.DataSize
指定追加到 CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的末尾的字节数。
u.DeviceSpecificData.Reserved1
未使用。
u.DeviceSpecificData.Reserved2
未使用。
u.Memory40
使用以下成员指定内存地址范围。
u.Memory40 成员仅适用于 Windows Vista 和更高版本的 Windows 操作系统。 驱动程序必须使用 RtlCmDecodeMemIoResource 和 RtlCmEncodeMemIoResource 来读取和更新此成员,而不是直接更新它。
u.Memory40.Start
对于原始资源:指定分配给设备的连续内存地址范围中最低的总线相对物理地址。
对于已转换的资源:指定分配给设备的连续内存地址范围最低的系统物理地址。
有关原始资源和已翻译的资源的详细信息,请参阅“备注”。
u.Memory40.Length40
包含 40 位长度的 32 位高(以字节为单位)的已分配内存地址范围。 最低 8 位被视为零。
u.Memory48
使用以下成员指定内存地址范围。
u.Memory48 成员仅适用于 Windows Vista 和更高版本的 Windows 操作系统。 驱动程序必须使用 RtlCmDecodeMemIoResource 和 RtlCmEncodeMemIoResource 来读取和更新此成员,而不是直接更新它。
u.Memory48.Start
对于原始资源:指定分配给设备的连续内存地址范围中最低的总线相对物理地址。
对于已转换的资源:指定分配给设备的连续内存地址范围最低的系统物理地址。
有关原始资源和已翻译的资源的详细信息,请参阅“备注”。
u.Memory48.Length48
包含 48 位长度(以字节为单位)的 32 位高分配内存地址范围。 最低 16 位被视为零。
u.Memory64
使用以下成员指定内存地址范围。
u.Memory64 成员仅适用于 Windows Vista 和更高版本的 Windows 操作系统。 驱动程序必须使用 RtlCmDecodeMemIoResource 和 RtlCmEncodeMemIoResource 来读取和更新此成员,而不是直接更新它。
u.Memory64.Start
对于原始资源:指定分配给设备的连续内存地址范围中最低的总线相对物理地址。
对于已转换的资源:指定分配给设备的连续内存地址范围最低的系统物理地址。
有关原始资源和已翻译的资源的详细信息,请参阅“备注”。
u.Memory64.Length64
包含 64 位长度(以字节为单位)的 32 位高分配内存地址范围。 最低 32 位被视为零。
u.Connection
指定连接到 串行总线 或 串行端口,或连接到一组或一组 常规用途 I/O (GPIO) 引脚。 以下成员描述了此连接。
从 Windows 8 开始,u.Connection 成员可用。
u.Connection.Class
指定连接类。 此成员设置为以下值之一:
价值 | 意义 |
---|---|
CM_RESOURCE_CONNECTION_CLASS_GPIO | 通过 GPIO 控制器上的一个或多个引脚访问设备。 |
CM_RESOURCE_CONNECTION_CLASS_SERIAL | 通过串行总线或串行端口访问设备。 |
u.Connection.Type
指定连接类型。
如果 类 = CM_RESOURCE_CONNECTION_CLASS_GPIO,则 类型 设置为以下值:
价值 | 意义 |
---|---|
CM_RESOURCE_CONNECTION_TYPE_GPIO_IO | 通过为 I/O 配置的 GPIO 引脚访问设备。 |
配置为中断请求输入的 GPIO 引脚作为普通中断资源(CmResourceTypeInterrupt) 访问。
如果 类 = CM_RESOURCE_CONNECTION_CLASS_SERIAL,则 类型 设置为以下值之一:
价值 | 意义 |
---|---|
CM_RESOURCE_CONNECTION_TYPE_SERIAL_I2C | 设备连接到 I2C 总线。 |
CM_RESOURCE_CONNECTION_TYPE_SERIAL_SPI | 设备连接到 SPI 总线。 |
CM_RESOURCE_CONNECTION_TYPE_SERIAL_UART | 设备连接到串行端口。 |
u.Connection.Reserved1
未使用。
u.Connection.Reserved2
未使用。
u.Connection.IdLowPart
包含 64 位连接 ID 的低 32 位。
u.Connection.IdHighPart
包含 64 位连接 ID 的上 32 位。
言论
CM_PARTIAL_RESOURCE_DESCRIPTOR 结构可以描述原始(总线相对)资源或已转换的(系统物理)资源,具体取决于所使用的例程或 IRP。 有关详细信息,请参阅 原始和翻译的资源 和 IRP_MN_START_DEVICE。
只能 1DeviceSpecificData 块。 它必须位于完整描述符块中所有资源描述符的末尾。
要求
要求 | 价值 |
---|---|
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Wudfwdm.h) |