PORT_CONFIGURATION_INFORMATION 结构 (srb.h)
PORT_CONFIGURATION_INFORMATION (SCSI) 包含 HBA 的配置信息。 特定于 OS 的端口驱动程序分配和初始化此结构,提供尽可能多的特定于 HBA 的配置信息,并将结构传递给微型端口驱动程序的 HwScsiFindAdapter 例程。 端口驱动程序从微型端口驱动程序的HW_INITIALIZATION_DATA结构获取此结构的一些信息。 微型端口驱动程序的 HwScsiFindAdapter 例程负责确定微型端口驱动程序是否可以支持 HBA,如果是,则用于填充PORT_CONFIGURATION_INFORMATION结构中相关的剩余信息。
注意
SCSI 端口驱动程序和 SCSI 微型端口驱动程序模型将来可能会更改或不可用。 请改用 Storport 驱动程序 和 Storport 微型端口 驱动程序模型。
语法
typedef struct _PORT_CONFIGURATION_INFORMATION {
ULONG Length;
ULONG SystemIoBusNumber;
INTERFACE_TYPE AdapterInterfaceType;
ULONG BusInterruptLevel;
ULONG BusInterruptVector;
KINTERRUPT_MODE InterruptMode;
ULONG MaximumTransferLength;
ULONG NumberOfPhysicalBreaks;
ULONG DmaChannel;
ULONG DmaPort;
DMA_WIDTH DmaWidth;
DMA_SPEED DmaSpeed;
ULONG AlignmentMask;
ULONG NumberOfAccessRanges;
ACCESS_RANGE( ) *AccessRanges[];
PVOID Reserved;
UCHAR NumberOfBuses;
UCHAR InitiatorBusId[8];
BOOLEAN ScatterGather;
BOOLEAN Master;
BOOLEAN CachesData;
BOOLEAN AdapterScansDown;
BOOLEAN AtdiskPrimaryClaimed;
BOOLEAN AtdiskSecondaryClaimed;
BOOLEAN Dma32BitAddresses;
BOOLEAN DemandMode;
BOOLEAN MapBuffers;
BOOLEAN NeedPhysicalAddresses;
BOOLEAN TaggedQueuing;
BOOLEAN AutoRequestSense;
BOOLEAN MultipleRequestPerLu;
BOOLEAN ReceiveEvent;
BOOLEAN RealModeInitialized;
BOOLEAN BufferAccessScsiPortControlled;
UCHAR MaximumNumberOfTargets;
UCHAR ReservedUchars[2];
ULONG SlotNumber;
ULONG BusInterruptLevel2;
ULONG BusInterruptVector2;
KINTERRUPT_MODE InterruptMode2;
ULONG DmaChannel2;
ULONG DmaPort2;
DMA_WIDTH DmaWidth2;
DMA_SPEED DmaSpeed2;
ULONG DeviceExtensionSize;
ULONG SpecificLuExtensionSize;
ULONG SrbExtensionSize;
UCHAR Dma64BitAddresses;
BOOLEAN ResetTargetSupported;
UCHAR MaximumNumberOfLogicalUnits;
BOOLEAN WmiDataProvider;
} PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION;
成员
Length
指定此结构的大小(以字节为单位)。 实际上,此成员(始终由特定于 OS 的端口驱动程序初始化)指示端口驱动程序使用的此结构的版本。
SystemIoBusNumber
指定 HBA 连接到的 I/O 总线的系统分配编号。 特定于 OS 的端口驱动程序始终初始化此成员。 其值是系统分配的,因为平台可能具有给定 AdapterInterfaceType 的多个 I/O 总线。
AdapterInterfaceType
标识 I/O 总线接口。 特定于 OS 的端口驱动程序始终将此成员设置为 HW_INITIALIZATION_DATA (SCSI) 结构中的微型端口驱动程序指定的值。
BusInterruptLevel
指定总线相对中断请求级别。 特定于 OS 的端口驱动程序不会假设 HBA 的中断使用情况,因此默认值为零。 根据给定的 AdapterInterfaceType 和 HBA,为此成员设置的值可以对应于总线的 IRQL,例如 Isa 和 MicroChannel 类型总线。 如果适配器配置为级别敏感中断, Eisa HBA 的驱动程序必须将此值设置为 HBA 的总线相对 IRQL。
BusInterruptVector
指定 HBA 返回的总线相对向量。 特定于 OS 的端口驱动程序不会假设 HBA 的中断使用情况,因此默认值为零。 此成员与为其 HBA 设置 BusInterruptLevel 成员的驱动程序无关。 它与使用中断向量(例如 PCIBus)的 I/O 总线类型上的 HBA 相关。
InterruptMode
指定 HBA 是使用 LevelSensitive 还是 闩锁 (有时称为“边缘触发”) 中断。 特定于 OS 的端口驱动程序将此成员初始化为总线和设备的适当值,例如 PCIBus 的 LevelSensitive。 如果适配器配置为级别敏感中断, Eisa HBA 的驱动程序必须重置此值,在使用级别敏感中断的 I/O 总线(如 MicroChannel 类型总线)上的 HBA 驱动程序也必须重置此值。
MaximumTransferLength
指定 HBA 在单个传输操作中可以传输的最大字节数。 默认情况下,此成员的值SP_UNINITIALIZED_VALUE,这表示最大传输大小不受限制。 如果 HBA 具有更有限的传输支持,微型端口驱动程序必须根据 HBA 的传输容量重置此成员。 如果微型端口驱动程序的 HwScsiInterrupt 例程无法禁用 HBA 上的中断,则可以在驱动程序开发期间调整此成员,以确保在该微型端口驱动程序的 ISR 中花费的时间不会导致鼠标“跳转”或串行/并行吞吐量下降到用户明显的级别。
NumberOfPhysicalBreaks
指定如果 HBA 支持散点/收集,则数据缓冲区可以具有的最大地址范围之间的间隔数。 换句话说,散点/收集列表的数目减 1。 默认情况下,此成员的值为 SP_UNINITIALIZED_VALUE,这表示 HBA 可以支持无限数量的物理不和谐。 如果端口驱动程序为此成员设置值,微型端口驱动程序可以调整该值的较低值,但不能调高。 如果此成员SP_UNINITIALIZED_VALUE,微型端口驱动程序必须根据 HBA 的散点/收集容量重置此成员,零表示没有散点/收集支持。
DmaChannel
指定从属 HBA 使用的 DMA 通道。 默认情况下,此成员的值SP_UNINITIALIZED_VALUE。 如果 HBA 使用系统 DMA 控制器,并且给定的 AdapterInterfaceType 是 除 MicroChannel 之外的任何值,则微型端口驱动程序必须重置此成员。
DmaPort
指定从属 HBA 使用的 DMA 端口。 默认情况下,此成员的值SP_UNINITIALIZED_VALUE。 如果 HBA 使用系统 DMA 控制器,并且给定的 AdapterInterfaceType 为 MicroChannel,则微型端口驱动程序必须设置此成员。
DmaWidth
指定 HBA 使用 DMA 时 DMA 传输的宽度。 默认情况下,此成员的值为零。 如果 HBA 执行 DMA,微型端口驱动程序必须将此成员重置为以下选项之一: Width8Bits、 Width16Bits 或 Width32Bits。
DmaSpeed
指定 Eisa HBA 的 DMA 数据传输速度。 默认情况下,此成员的值指定兼容性计时。 此成员的可接受值为以下任一值: Compatible、 TypeA、 TypeB 或 TypeC。
AlignmentMask
包含一个掩码,指示 HBA 传输操作所需的缓冲区的对齐限制。 有效掩码值还受不同版本 Windows 上的内存管理器特征的限制。 Windows 95 或 Windows 98 下允许的掩码值为 0 (字节对齐) 、1 个 (单词对齐) 或 3 个 (DWORD 对齐) 。 在 Windows NT 和 Windows 2000 下,有效掩码值为 0 (字节对齐) 、1 个 (字) 对齐、3 (DWORD 对齐) 和 7 (双 DWORD 对齐) 。 如果 HBA 支持散点/收集,微型端口驱动程序应设置此掩码。
NumberOfAccessRanges
指定数组中 AccessRanges 元素的数目,如下所述。 当微型端口驱动程序名为 ScsiPortInitialize 时,特定于 OS 的端口驱动程序始终将此成员设置为在 HW_INITIALIZATION_DATA 结构中传递的值。
AccessRanges
Reserved
保留供系统使用,不能供微型端口驱动程序使用。
NumberOfBuses
指定由 HBA 控制的 SCSI 总线数。 默认情况下,此成员的值为零。
InitiatorBusId[8]
指示发起程序总线 ID。 如果输入 InitiatorBusId[0] 的值为零,则如果微型端口驱动程序的 HBA 不需要使用通过查询 HBA 确定的特定值 (s) ,则可以分配默认值。 否则,微型端口驱动程序应尽可能使用端口驱动程序分配的任何非零值。 如果需要,每个微型端口驱动程序都必须更新 InitiatorBusId 规范,以匹配其 HBA 使用的内容,以确定 () 的适当值。
微型端口驱动程序必须为 HBA 支持的每个 SCSI 总线设置一个条目,如 NumberOfBuses 值所示。
ScatterGather
指示 HBA 何时为 TRUE 支持散点/收集。 如果 为 FALSE ,则 HBA 不支持散点/收集。 默认情况下,此成员的值为 FALSE。
Master
指示 HBA 为总线主节点时 为 TRUE 。 如果 为 FALSE,则 HBA 不是总线主机。 默认情况下,此成员的值为 FALSE。
CachesData
指示 HBA 在外围设备上缓存数据或保持缓存状态时 为 TRUE 。 当 为 FALSE 时,HBA 不会缓存数据或在外围设备上保持缓存状态。 默认情况下,此成员的值为 FALSE。 如果此值重置为 TRUE,则发生某些系统事件(例如文件系统缓存刷新和系统关闭)时,特定于 OS 的端口驱动程序会通知微型端口驱动程序。 例如,如果总线上的控制器镜像两个磁盘,微型端口驱动程序通常会将此成员设置为 TRUE。
AdapterScansDown
指示当 HBA 的 BIOS 扫描 SCSI 总线目标从 7 到 0 时 为 TRUE 。 如果 为 FALSE,HBA 的 BIOS 会查找 SCSI 总线目标,从 ID 0 开始,向上扫描到 (但不包括) MaximumTargetIds。 默认情况下, AdapterScansDown 的值为 FALSE。
AtdiskPrimaryClaimed
指示另一个驱动程序在其设备的注册表中声明了与 WD1003 兼容的主“AT” () 磁盘地址范围(0x1F0 0x1FF)何时为 TRUE 。 特定于 OS 的端口驱动程序始终初始化此成员。 如果此成员的输入值为 TRUE,微型端口驱动程序应假定已加载的驱动程序已声明设备范围。 如果输入值为 FALSE,微型端口驱动程序可以声明模拟“AT”磁盘控制器并将此成员重置为 TRUE 的 HBA 的地址范围,从而阻止“AT”磁盘驱动程序或随后加载的微型端口驱动程序访问此范围。
AtdiskSecondaryClaimed
指示当另一个驱动程序为其设备在注册表中声明辅助 AT 磁盘地址范围(0x170到 0x17F)时为 TRUE 。 如果 为 FALSE ,其他驱动程序尚未在注册表中声明辅助 AT 磁盘地址范围。 特定于 OS 的端口驱动程序始终初始化此成员。 微型端口驱动程序应将此成员视为 AtdiskPrimaryClaimed。
Dma32BitAddresses
指示 何时为 TRUE ,表示 HBA 有 32 个地址行,并且可以访问物理地址大于 0x00FFFFFF 的内存。 当 为 FALSE 时,HBA 具有除 32 以外的 DMA 地址行数。 默认情况下,此成员的值为 FALSE。 如果微型端口驱动程序设置了 Dma64BitAddresses,则此成员必须为 FALSE。
DemandMode
指示何时 TRUE 应针对需求模式(而不是单周期操作)对系统 DMA 控制器进行编程。 如果 HBA 不是从属设备,则此成员应为 FALSE。
MapBuffers
指示数据缓冲区必须映射到系统虚拟地址范围何时 为 TRUE 。 如果 为 FALSE ,则数据缓冲区不必映射到系统虚拟地址。 当微型端口驱动程序称为 ScsiPortInitialize 时,特定于 OS 的端口驱动程序始终将此成员设置为在 HW_INITIALIZATION_DATA (SCSI) 结构中传递的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。 如果 为 FALSE,微型端口驱动程序不得直接访问 Srb.DataBuffer 。
NeedPhysicalAddresses
指示如果 为 TRUE ,微型端口驱动程序必须按照 HBA 的要求将虚拟地址转换为物理地址。 如果 为 FALSE,微型端口驱动程序不必将虚拟地址转换为物理地址。 当微型端口驱动程序称为 ScsiPortInitialize 时,特定于 OS 的端口驱动程序始终将此成员设置为在 HW_INITIALIZATION_DATA (SCSI) 结构中传递的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。
TaggedQueuing
指示何时 为 TRUE ,表示 HBA 支持使用 SCSI 标记排队多个请求。 如果 为 FALSE,则 HBA 不支持 SCSI 标记的队列。 当微型端口驱动程序称为 ScsiPortInitialize 时,特定于 OS 的端口驱动程序始终将此成员设置为在 HW_INITIALIZATION_DATA (SCSI) 结构中传递的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。
AutoRequestSense
指示 HBA 何时为 TRUE 支持自动请求感知。 如果 为 FALSE ,则 HBA 不支持自动请求感知。 当微型端口驱动程序称为 ScsiPortInitialize 时,特定于 OS 的端口驱动程序始终将此成员设置为在 HW_INITIALIZATION_DATA (SCSI) 结构中传递的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。 在总线主 HBA 的驱动程序调用 ScsiPortGetUncachedExtension 之前,必须将此成员设置为 TRUE。
MultipleRequestPerLu
指示何时 为 TRUE ,表示 HBA 支持每个逻辑单元的多个请求。 如果 为 FALSE ,则 HBA 不支持每个逻辑单元的多个请求。 适配器缓存请求的机制是适配器定义的。 当微型端口驱动程序称为 ScsiPortInitialize 时,特定于 OS 的端口驱动程序始终将此成员设置为在 HW_INITIALIZATION_DATA (SCSI) 结构中传递的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。
ReceiveEvent
指示 HBA 何时为 TRUE 支持 SCSI 接收事件操作。 如果 为 FALSE,HBA 不支持 SCSI 接收事件操作。 当微型端口驱动程序称为 ScsiPortInitialize 时,特定于 OS 的端口驱动程序始终将此成员设置为在 HW_INITIALIZATION_DATA (SCSI) 结构中传递的值。 微型端口驱动程序可以为它控制的任何特定 HBA 重置此值。
RealModeInitialized
指示 true 表示仅 (x86) 实模式驱动程序已初始化 HBA。 如果 为 FALSE ,则 HBA 之前尚未由实模式驱动程序初始化。 依赖于 OS 的端口驱动程序始终初始化此成员。 如果此值设置为 TRUE,则如果驱动程序的初始化序列与实模式 HBA 初始化相同,微型端口驱动程序不得初始化其 HBA;在这种情况下,如果不重新初始化 HBA,微型端口驱动程序的加载速度要快得多。 此成员的值与在基于 x86 的平台上以受保护模式运行时始终初始化其 HBA 的任何微型端口驱动程序以及无论它们是在基于 CISC 的平台上运行还是基于 RISC 的平台上运行都无关紧要的所有微型端口驱动程序无关。
BufferAccessScsiPortControlled
指示 如果为 TRUE ,微型端口驱动程序始终调用 ScsiPortXxx 来访问 SDB 中的数据缓冲区和/或请求感知信息,从而允许特定于 OS 的端口驱动程序优化 I/O 请求处理。 如果 为 FALSE ,微型端口驱动程序无需调用 ScsiPortXxx 例程即可访问数据缓冲区或请求感知信息。 将此成员设置为 FALSE 可能会降低 HBA 的 I/O 性能。 调用 ScsiPortXxx 以外的例程会使微型端口驱动程序跨 Microsoft 操作系统不可移植。
MaximumNumberOfTargets
指定 HBA 可以控制的目标外设数。 默认情况下,此成员的值根据 SCSI 标准SCSI_MAXIMUM_TARGETS。 如果 HBA 具有更有限的功能或更大的值,则微型端口驱动程序可以将此成员重置为较小的值,这表示 HBA 具有 wide-SCSI 或光纤通道功能。 此值限制为 SCSI_MAXIMUM_TARGETS_PER_BUS。
ReservedUchars[2]
保留供系统使用,不能供微型端口驱动程序使用。
SlotNumber
指定 HBA 的槽号,其值与在名为 ScsiPortInitialize 的 HW_INITIALIZATION_DATA (SCSI) 结构中指定的 VendorId 和 DeviceId 匹配的值。
BusInterruptLevel2
保留供系统使用,不能供微型端口驱动程序使用。
BusInterruptVector2
保留供系统使用,不能供微型端口驱动程序使用。
InterruptMode2
保留供系统使用,不能供微型端口驱动程序使用。
DmaChannel2
保留供系统使用,不能供微型端口驱动程序使用。
DmaPort2
保留供系统使用,不能供微型端口驱动程序使用。
DmaWidth2
保留供系统使用,不能供微型端口驱动程序使用。
DmaSpeed2
保留供系统使用,不能供微型端口驱动程序使用。
DeviceExtensionSize
指定微型端口驱动程序为其每个 HBA 设备扩展处理大于 64K 的数据传输所需的大小(以字节为单位),这可能需要比此驱动程序注册表中定义的大小更大的散点/收集列表。
SpecificLuExtensionSize
指定微型端口驱动程序处理大于 64K 的数据传输所需的每个逻辑单元存储(如果有)所需的大小(以字节为单位)。 如果微型端口驱动程序不维护需要存储的每个 LU 信息,请将此成员设置为零。 此值基于以下假设:HBA 能够接收 32 位地址,而不管控制器实际支持什么。 如果在 LUN 或 SRB 扩展中需要额外的空间来处理 64 位地址,则必须对此值进行适当的调整,然后再将其与例程(如 ScsiPortGetUncachedExtension)配合使用。
SrbExtensionSize
指定微型端口驱动程序为其每个请求存储(如果有)处理大于 64K 的数据传输所需的大小(以字节为单位)。 在调用 ScsiPortGetUncachedExtension 之前设置此成员,以基于 NumberOfPhysicalBreaks 更改每个请求存储的大小。 如果微型端口驱动程序不维护需要存储的每个 SRB 信息,请将此成员设置为零。 此值基于以下假设:HBA 能够接收 32 位地址,而不管控制器实际支持什么。 如果在 LUN 或 SRB 扩展中需要额外的空间来处理 64 位地址,则必须对此值进行适当的调整,然后再将其与例程(如 ScsiPortGetUncachedExtension)配合使用。
Dma64BitAddresses
指示 HBA 能够访问大于 4 GB 的地址,如果 Dma64BitAddresses 包含值SCSI_DMA64_MINIPORT_SUPPORTED,则0x0FFFFFFFF。 在 Windows 2000 之前,ScsiPort 基于 HW_INITIALIZATION_DATA (SCSI) 的内容设置此值。 这种情况不会再出现。 在 Windows 2000 中 ,Dma64BitAddresses 的值由微型端口驱动程序回调 HwScsiFindAdapter 单独确定。 如果操作系统支持 64 位地址空间,则端口驱动程序会将 SCSI_DMA64_SYSTEM_SUPPORTED 值传递给此成员中的微型端口驱动程序。 如果 PORT_CONFIGURATION_INFORMATION 描述的 HBA 也支持大于 32 位的地址空间,则需要端口/微型端口驱动程序来支持完整的 64 位寻址,微型端口驱动程序的回调 HwScsiFindAdapter 通过向 Dma64BitAddresses 分配值 SCSI_DMA64_MINIPORT_SUPPORTED 来指示这一点,并写入端口驱动程序分配的任何先前值。 在微型端口驱动程序调用 ScsiPortGetUncachedExtension 之前,必须将正确的值分配给 Dma64BitAddresses 成员。
ResetTargetSupported
已过时。 ScsiPort 驱动程序不再向其微型端口驱动程序发送SRB_FUNCTION_RESET_DEVICE请求。 请勿使用此成员。
MaximumNumberOfLogicalUnits
指定 HBA 可以控制的每个目标的最大逻辑单元数。 默认情况下,此成员的值为SCSI_MAXIMUM_LOGICAL_UNITS。 如果 HBA 具有更有限的功能或更大的值,则微型端口驱动程序可以将此成员重置为较小的值,这表示 HBA 具有 SCSI-3 功能。
WmiDataProvider
指示微型端口 驱动程序何时响应 Windows Management Instrumentation (WMI) 请求。 如果 为 FALSE ,微型端口驱动程序不会响应 Windows Management Instrumentation (WMI) 请求。 默认情况下,此成员的值为 FALSE。
注解
初始化的特定成员取决于 HBA 微型端口驱动程序和特定于 OS 的端口驱动程序可用的配置信息。 特定于 OS 的端口驱动程序在无法向微型端口驱动程序的 HwScsiFindAdapter 例程提供配置信息的所有成员中设置默认值。
如果特定于 OS 的端口驱动程序未传入所有初始化值,则所有 HBA 微型端口驱动程序应至少有一组默认值用于相关成员。
HwScsiFindAdapter 例程必须更新与驱动程序支持的 HBA 相关的所有成员。
Windows NT存储类驱动程序(其加载时间晚于微型端口驱动程序)取决于每个微型端口驱动程序的 HwScsiFindAdapter 例程提供的信息来设置其后续 I/O 请求。 例如,每个微型端口驱动程序提供的 MaximumTransferLength 和 NumberOfPhysicalBreaks 值控制类驱动程序是否必须将大型传输请求拆分为一组部分传输以满足 HBA 的限制。
不应再将 PORT_CONFIGURATION_INFORMATION 的 Dma64BitAddresses 成员视为 BOOLEAN 值。 值为 SCSI_DMA64_SYSTEM_SUPPORTED 表示需要端口/微型端口驱动程序才能支持 64 位寻址,但 ScsiPortGetUncachedExtension 例程仍会将 Dma64BitAddresses 的任何非零值解释为指示需要 64 位支持。 这意味着 ,ScsiPortGetUncachedExtension 在由将 BOOLEAN 值分配给 Dma64BitAddresses 的旧驱动程序调用时仍然正常运行。
除了 Dma64BitAddresses,PORT_CONFIGURATION_INFORMATION 和 HW_INITIALIZATION_DATA 都有一对名为 SpecificLuExtensionSize 和 SrbExtensionSize 的成员,其值现在必须以不同的方式处理。 微型端口驱动程序必须基于 HBA 能够接收 32 位地址的假设,计算 HW_INITIALIZATION_DATA 中的 SpecificLuExtensionSize 和 SrbExtensionSize 的初始值,而不管控制器实际支持什么。 PORT_CONFIGURATION_INFORMATION 中的 SpecificLuExtensionSize 和 SrbExtensionSize 的默认值也将基于 32 位寻址的假设,因为 PORT_CONFIGURATION_INFORMATION 中的值派生自 HW_INITIALIZATION_DATA 中的值。
这意味着,如果微型端口驱动程序需要 LUN 扩展或 SRB 扩展中的额外空间才能处理 64 位物理地址,则必须修改 PORT_CONFIGURATION_INFORMATION 中的 SpecificLuExtensionSize 和 SrbExtensionSize 的值,以便在将PORT_CONFIGURATION_INFORMATION传递到 ScsiPortGetUncachedExtension 之前对此进行解释。
要求
要求 | 值 |
---|---|
Header | srb.h (包括 Srb.h、Storport.h、Strmini.h) |