miniport.h) (IO_RESOURCE_DESCRIPTOR 结构
IO_RESOURCE_DESCRIPTOR结构描述了设备可以使用的一种类型的原始硬件资源范围。 每个IO_RESOURCE_LIST结构中包含一个IO_RESOURCE_DESCRIPTOR结构数组。
语法
typedef struct _IO_RESOURCE_DESCRIPTOR {
UCHAR Option;
UCHAR Type;
UCHAR ShareDisposition;
UCHAR Spare1;
USHORT Flags;
USHORT Spare2;
union {
struct {
ULONG Length;
ULONG Alignment;
PHYSICAL_ADDRESS MinimumAddress;
PHYSICAL_ADDRESS MaximumAddress;
} Port;
struct {
ULONG Length;
ULONG Alignment;
PHYSICAL_ADDRESS MinimumAddress;
PHYSICAL_ADDRESS MaximumAddress;
} Memory;
struct {
ULONG MinimumVector;
ULONG MaximumVector;
#if ...
IRQ_DEVICE_POLICY AffinityPolicy;
USHORT Group;
#else
IRQ_DEVICE_POLICY AffinityPolicy;
#endif
IRQ_PRIORITY PriorityPolicy;
KAFFINITY TargetedProcessors;
} Interrupt;
struct {
ULONG MinimumChannel;
ULONG MaximumChannel;
} Dma;
struct {
ULONG RequestLine;
ULONG Reserved;
ULONG Channel;
ULONG TransferWidth;
} DmaV3;
struct {
ULONG Length;
ULONG Alignment;
PHYSICAL_ADDRESS MinimumAddress;
PHYSICAL_ADDRESS MaximumAddress;
} Generic;
struct {
ULONG Data[3];
} DevicePrivate;
struct {
ULONG Length;
ULONG MinBusNumber;
ULONG MaxBusNumber;
ULONG Reserved;
} BusNumber;
struct {
ULONG Priority;
ULONG Reserved1;
ULONG Reserved2;
} ConfigData;
struct {
ULONG Length40;
ULONG Alignment40;
PHYSICAL_ADDRESS MinimumAddress;
PHYSICAL_ADDRESS MaximumAddress;
} Memory40;
struct {
ULONG Length48;
ULONG Alignment48;
PHYSICAL_ADDRESS MinimumAddress;
PHYSICAL_ADDRESS MaximumAddress;
} Memory48;
struct {
ULONG Length64;
ULONG Alignment64;
PHYSICAL_ADDRESS MinimumAddress;
PHYSICAL_ADDRESS MaximumAddress;
} Memory64;
struct {
UCHAR Class;
UCHAR Type;
UCHAR Reserved1;
UCHAR Reserved2;
ULONG IdLowPart;
ULONG IdHighPart;
} Connection;
} u;
} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
成员
Option
指定此资源说明是必需、首选还是替代。 必须使用以下值之一:
值 | 含义 |
---|---|
0 | 除非还指定了备用范围,否则需要指定的资源范围。 |
IO_RESOURCE_PREFERRED | 指定的资源范围优先于任何备用范围。 |
IO_RESOURCE_ALTERNATIVE | 指定的资源范围是其前面的范围的替代项。 例如,如果一个 IO_RESOURCE_DESCRIPTOR 结构指定 IRQ 5,设置了IO_RESOURCE_PREFERRED,下一个结构指定 IRQ 3,并且设置了 IO_RESOURCE_ALTERNATIVE,则仅当 IRQ 5 不可用时,PnP 管理器才会将 IRQ 3 分配给设备。 (可以为每个资源指定多个替代项。可以设置IO_RESOURCE_ALTERNATIVE和IO_RESOURCE_PREFERRED,指示首选替代项。) |
IO_RESOURCE_DEFAULT | 未使用。 |
Type
标识资源类型。 有关有效值的列表,请参阅 CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的 Type 成员。
ShareDisposition
指示是否可以共享所描述的资源。 有关有效值的列表,请参阅 CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的 ShareDisposition 成员。
Spare1
未使用。
Flags
包含特定于资源类型的位标志。 下表显示了在 类型 = CmResourceTypeInterrupt 时有效的标志。
值 | 含义 |
---|---|
CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE | IRQ 线是级别触发的。 (这些 IRQ 通常是可共享的。) |
CM_RESOURCE_INTERRUPT_LATCHED | IRQ 线是边缘触发的。 |
CM_RESOURCE_INTERRUPT_MESSAGE | 如果设置了此标志,则中断是消息信号中断。 否则,中断是基于行的中断。 |
CM_RESOURCE_INTERRUPT_POLICY_INCLUDED | 如果设置了此标志,则 u.Interrupt 成员包含描述设备中断策略的数据。 |
CM_RESOURCE_INTERRUPT_SECONDARY_INTERRUPT | 中断是次要中断。 有关次要中断的详细信息,请参阅 GPIO 中断。 |
CM_RESOURCE_INTERRUPT_WAKE_HINT | 中断能够将操作系统从低功耗空闲状态或系统睡眠状态唤醒。 有关唤醒功能的详细信息,请参阅 启用设备唤醒。 |
有关其他资源类型的有效标志的列表,请参阅 CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的 Flags 成员的说明。
Spare2
未使用。
u
定义 u 联合。
u.Port
使用以下成员指定 I/O 端口地址的范围。
驱动程序必须使用 RtlIoDecodeMemIoResource 和 RtlIoEncodeMemIoResource 来读取和更新此成员,而不是直接更新它。
u.Port.Length
可分配的 I/O 端口地址范围的长度(以字节为单位)。
u.Port.Alignment
分配的起始地址必须遵循的对齐方式(以字节为单位)。 分配的起始地址必须是 Alignment 的整数倍数。
u.Port.MinimumAddress
可分配给设备的最小总线相对 I/O 端口地址。
u.Port.MaximumAddress
可分配给设备的最大总线相对 I/O 端口地址。
u.Memory
使用以下成员指定内存地址的范围:
驱动程序必须使用 RtlIoDecodeMemIoResource 和 RtlIoEncodeMemIoResource 来读取和更新此成员,而不是直接更新它。
u.Memory.Length
可分配内存地址范围的长度(以字节为单位)。
u.Memory.Alignment
分配的起始地址必须遵循的对齐方式(以字节为单位)。 分配的起始地址必须是 Alignment 的整数倍数。
u.Memory.MinimumAddress
可分配给设备的最小总线相对内存地址。
u.Memory.MaximumAddress
可分配给设备的最大总线相对内存地址。
u.Interrupt
使用以下成员指定中断向量范围:
u.Interrupt.MinimumVector
可分配给设备的最小总线相对向量。
u.Interrupt.MaximumVector
可分配给设备的最大总线相对向量。
如果设置了 CM_RESOURCE_INTERRUPT_MESSAGE 标志位, 则 MinimumVector 和 MaximumVector 成员的值具有特殊含义。 有关详细信息,请参阅 使用中断资源描述符。
u.Interrupt.AffinityPolicy
指定一个 IRQ_DEVICE_POLICY 值,该值指示系统应如何在处理器之间分配设备的中断。
指定一个 IRQ_DEVICE_POLICY 值,该值指示系统应如何在处理器之间分配设备的中断。
u.Interrupt.Group
指定处理器组编号。 组 是 u.Interrupt 的有效 (但可选的) 成员。 仅当在编译时定义NT_PROCESSOR_GROUPS时,此成员才存在。 如果 组 成员存在, 则 Group 和 TargetedProcessors 成员共同指定一个组相关性,用于标识应处理设备中断的处理器集。 若要指定特定组的相关性,请将 AffinityPolicy 设置为 IrqPolicySpecifiedProcessors ,并将 Group 设置为相应的组号。 此外, TargetedProcessors 必须在组中指定目标处理器。 如果将 AffinityPolicy 设置为 IrqPolicySpecifiedProcessors 以外的值,请将 “组 ”设置为“ALL_PROCESSOR_GROUPS”以指示驱动程序是组感知 (,旨在) 处理有关处理器组的信息。 如果 组 等于 ALL_PROCESSOR_GROUPS,则驱动程序无法指定目标处理器;将忽略此类目标规范。
u.Interrupt.PriorityPolicy
指定一个 IRQ_PRIORITY 值,该值指示系统调度设备中断时使用的优先级。
u.Interrupt.TargetedProcessors
指定 KAFFINITY 值,该值指示哪些处理器应处理设备的中断。 仅当 AffinityPolicy 为 IrqPolicySpecifiedProcessors 时,才使用此值。
u.Dma
使用以下成员之一指定 DMA 设置:
u.Dma.MinimumChannel
可分配给设备的最小总线相对 DMA 通道。
u.Dma.MaximumChannel
可分配给设备的最大总线相对 DMA 通道。
u.DmaV3
指定使用 DMA_OPERATIONS 结构版本 3 的驱动程序的 DMA 设置。
u.DmaV3 成员从 Windows 8 开始可用。
u.DmaV3.RequestLine
分配给设备的系统 DMA 控制器上的请求行数。
u.DmaV3.Reserved
未使用。
u.DmaV3.Channel
分配给设备的系统 DMA 控制器上的 DMA 通道数。
u.DmaV3.TransferWidth
指定分配给设备的系统 DMA 控制器用于将数据传入设备或从设备传输数据的数据总线的宽度(以位为单位)。
u.Generic
未使用。
u.Generic.Length
未使用。
u.Generic.Alignment
未使用。
u.Generic.MinimumAddress
未使用。
u.Generic.MaximumAddress
未使用。
u.DevicePrivate
预留给系统使用。
u.DevicePrivate.Data[3]
预留给系统使用。
u.BusNumber
使用以下成员指定总线编号:
u.BusNumber.Length
所需的总线编号数。
u.BusNumber.MinBusNumber
可分配给设备的最小总线相对总线编号。
u.BusNumber.MaxBusNumber
可分配给设备的最大总线相对总线数。
u.BusNumber.Reserved
未使用。
u.ConfigData
预留给系统使用。
u.ConfigData.Priority
预留给系统使用。
u.ConfigData.Reserved1
预留给系统使用。
u.ConfigData.Reserved2
预留给系统使用。
u.Memory40
使用以下成员指定内存地址的范围。
驱动程序必须使用 RtlIoDecodeMemIoResource 和 RtlIoEncodeMemIoResource 来读取和更新此成员,而不是直接更新它。
u.Memory40.Length40
可分配内存地址范围的 40 位长度(以字节为单位)的高 32 位。 较低的 8 位被视为零。
u.Memory40.Alignment40
分配的起始地址必须遵循的 40 位对齐方式的高 32 位(以字节为单位)。 较低的 8 位被视为零。 分配的起始地址将是对齐方式的倍数。
u.Memory40.MinimumAddress
可分配给设备的最小总线相对内存地址。
u.Memory40.MaximumAddress
可分配给设备的最大总线相对内存地址。
u.Memory48
使用以下成员指定内存地址的范围。
驱动程序必须使用 RtlIoDecodeMemIoResource 和 RtlIoEncodeMemIoResource 来读取和更新此成员,而不是直接更新它。
u.Memory48.Length48
可分配内存地址范围的 48 位长度(以字节为单位)的高 32 位。 较低的 16 位被视为零。
u.Memory48.Alignment48
分配的起始地址必须遵循的 48 位对齐方式的高 32 位(以字节为单位)。 较低的 16 位被视为零。 分配的起始地址将是对齐方式的倍数。
u.Memory48.MinimumAddress
可分配给设备的最小总线相对内存地址。
u.Memory48.MaximumAddress
可分配给设备的最大总线相对内存地址。
u.Memory64
使用以下成员指定内存地址的范围。
驱动程序必须使用 RtlIoDecodeMemIoResource 和 RtlIoEncodeMemIoResource 来读取和更新此成员,而不是直接更新它。
u.Memory64.Length64
可分配内存地址范围的 64 位长度(以字节为单位)的高 32 位。 较低的 32 位被视为零。
u.Memory64.Alignment64
分配的起始地址必须遵循的 64 位对齐方式的高 32 位(以字节为单位)。 较低的 32 位被视为零。 分配的起始地址将是对齐方式的倍数。
u.Memory64.MinimumAddress
可分配给设备的最小总线相对内存地址。
u.Memory64.MaximumAddress
可分配给设备的最大总线相对内存地址。
u.Connection
指定与 串行总线 或 串行端口的连接,或与一个或多个 常规用途 I/O (GPIO) 引脚的连接。
u.Connection 成员从Windows 8开始可用。
以下成员描述了此连接。
u.Connection.Class
连接类。 此成员设置为以下值之一:
值 | 含义 |
---|---|
CM_RESOURCE_CONNECTION_CLASS_GPIO | 通过 GPIO 控制器上的一个或多个引脚访问设备。 |
CM_RESOURCE_CONNECTION_CLASS_SERIAL | 通过串行总线或串行端口访问设备。 |
u.Connection.Type
连接类型。 如果 Class = CM_RESOURCE_CONNECTION_CLASS_GPIO, 则 Type 设置为以下值:
值 | 含义 |
---|---|
CM_RESOURCE_CONNECTION_TYPE_GPIO_IO | 通过为 I/O 配置的 GPIO 引脚访问设备。 |
配置为中断请求输入的 GPIO 引脚作为普通中断资源 (CmResourceTypeInterrupt) 进行访问。
如果 Class = CM_RESOURCE_CONNECTION_CLASS_SERIAL, 则 Type 设置为以下值之一:
值 | 含义 |
---|---|
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 位。
要求
要求 | 值 |
---|---|
Header | miniport.h (包括 Wdm.h、Ntddk.h、Ntifs.h、Miniport.h) |