ScsiPortGetDeviceBase 函数 (srb.h)
ScsiPortGetDeviceBase 例程返回映射的逻辑基址,该地址可用于与 HBA 通信。 每个微型端口驱动程序都必须将映射的逻辑访问范围地址传递给 ScsiPort。端口Xxx 和 ScsiPort。注册Xxx 例程以与其 HBA () 通信。
语法
SCSIPORT_API PVOID ScsiPortGetDeviceBase(
[in] PVOID HwDeviceExtension,
[in] INTERFACE_TYPE BusType,
[in] ULONG SystemIoBusNumber,
[in] SCSI_PHYSICAL_ADDRESS IoAddress,
[in] ULONG NumberOfBytes,
[in] BOOLEAN InIoSpace
);
参数
[in] HwDeviceExtension
指向硬件设备扩展的指针。 这是端口驱动程序代表微型端口驱动程序分配和初始化的每个 HBA 存储区域。 微型端口驱动程序通常在此扩展中存储特定于 HBA 的信息,例如 HBA 的状态和 HBA 的映射访问范围。 在微型端口驱动程序调用 ScsiPortInitialize 后,HBA 设备对象的 DeviceExtension-HwDeviceExtension> 成员中的微型端口驱动程序可以使用此区域。 端口驱动程序在删除设备时释放此内存。
[in] BusType
指定 HBA 连接的 I/O 总线的接口类型。 微型端口驱动程序的 HwScsiFindAdapter 例程从输入PORT_CONFIGURATION_INFORMATION的 AdapterInterfaceType 成员获取此参数的值。
[in] SystemIoBusNumber
指定 HBA 连接的 I/O 总线的系统分配编号。 HwScsiFindAdapter 例程从输入PORT_CONFIGURATION_INFORMATION的 SystemIoBusNumber 成员获取此参数的值。
[in] IoAddress
指定 HBA 使用的范围的总线相对基址。 如果端口驱动程序提供范围配置信息, 则 HwScsiFindAdapter 例程将从PORT_CONFIGURATION_INFORMATION中的 AccessRanges 元素之一获取此参数的值。 否则,此地址可以是 ScsiPortGetBusData 返回的值,也可以是微型端口驱动程序提供的默认值。 避免使用零基址,因为其成功返回状态可能会与 null) 错误状态 (冲突 。
[in] NumberOfBytes
指定映射应涵盖的范围的大小(以字节为单位)。 如果端口驱动程序提供范围配置信息,则 HwScsiFindAdapter 例程从与 IoAddress 相同的 AccessRanges 元素获取此参数的值。 否则,此值可由 ScsiPortGetBusData 或微型端口驱动程序提供的默认值返回。 在任何情况下,驱动程序都不得访问返回的映射范围以外的硬件。
[in] InIoSpace
TRUE 表示要映射的范围在 I/O 空间中,微型端口驱动程序会将此范围内的映射地址传递给 ScsiPort...用于与 HBA 通信的端口 Xxx。 HwScsiFindAdapter 例程从与 IoAddress 相同的 AccessRanges 元素获取此参数的值。 请注意,微型端口驱动程序必须先在ACCESS_RANGE类型元素中反转 InMemorySpace 成员的值,然后才能将其作为 InIoSpace 参数传递给 ScsiPortGetDeviceBase。 FALSE 表示要映射的范围在内存空间中。
返回值
如果 ScsiPortGetDeviceBase 成功将给定范围从 IoAddress 映射到 NumberOfBytes,则它返回给定 IoAddress 的映射逻辑基址。 如果无法映射给定范围, ScsiPortGetDeviceBase 将返回 NULL。
注解
基于 NT 的操作系统平台可以有多个类型的 I/O 总线和多个相同类型的 I/O 总线。 此外,HAL 可以将 I/O 空间映射到某些平台的内存。
因此,微型端口驱动程序无法使用相对于总线的访问范围地址与其 HBA 通信。 若要在基于 CISC 和 RISC 的计算机之间保持微型端口驱动程序可移植性,必须使用 ScsiPortGetDeviceBase 转换用于访问 HBA 的地址。
每个微型端口驱动程序都必须使用由 ScsiPortGetDeviceBase 映射的系统空间逻辑范围地址来与其 HBA () 通信。 调用 ScsiPort...端口/注册Xxx 例程需要这些映射的逻辑地址。
ScsiPortGetDeviceBase 可以多次调用,具体取决于微型端口驱动程序支持的 HBA 数量以及每个 HBA 所需的访问范围数。 每个映射范围对应于 AccessRanges 数组的 ACCESS_RANGE 类型元素中指定的一系列相对于总线的设备地址。
当控件类型为 ScsiSetRunningConfig 时,只能从微型端口驱动程序的 HwScsiFindAdapter 例程或 HwScsiAdapterControl 调用 ScsiPortGetDeviceBase。 来自其他微型端口驱动程序例程的调用将导致系统故障或调用方操作不正确。
请遵循以下准则调用 ScsiPortGetDeviceBase:
- 如果 HwScsiFindAdapter 使用微型端口驱动程序提供的一组默认总线相对访问范围或 ScsiPortGetBusData 返回的值,则应在尝试调用 ScsiPortGetDeviceBase 之前调用 ScsiPortValidateRange。
- 如果 HwScsiFindAdapter 确定特定 HBA 不是微型端口驱动程序支持的特定 HBA,则必须调用 ScsiPortFreeDeviceBase 以释放映射 () 它设置为与该 HBA 通信。
ScsiPortGetDeviceBase 使用 SCSI_PHYSICAL_ADDRESS 表示总线相对地址。
typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
SCSI_PHYSICAL_ADDRESS类型是一种与操作系统无关的数据类型,SCSI 微型端口驱动程序使用该数据类型来表示物理地址或相对于总线的地址。
要求
要求 | 值 |
---|---|
目标平台 | 桌面 |
标头 | srb.h (包括 Miniport.h、Scsi.h) |
Library | Scsiport.lib |