ScsiPortGetDeviceBase 函数 (srb.h)

ScsiPortGetDeviceBase 例程返回可用于与 HBA 通信的映射逻辑基址。 每个微型端口驱动程序都必须将映射的逻辑访问范围地址传递给 ScsiPort。。端口XxxScsiPort.。注册Xxx 例程以与其 HBA(s) 通信。

注意 SCSI 端口驱动程序和 SCSI 微型端口驱动程序模型将来可能会更改或不可用。 相反,我们建议使用 Storport 驱动程序Storport 微型端口 驱动程序模型。
 

语法

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后,此区域可供 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 例程从 AccessRanges PORT_CONFIGURATION_INFORMATION 元素之一获取此参数的值。 否则,此地址可以是 ScsiPortGetBusData 或微型端口驱动程序提供的默认值返回的值。 避免使用零的基址,因为它的成功返回状态可能会与错误状态(NULL) 冲突。

[in] NumberOfBytes

指定映射应涵盖的范围的大小(以字节为单位)。 HwScsiFindAdapter 例程从与端口驱动程序提供范围配置信息时相同的 AccessRanges 元素获取此参数的值,IoAddress。 否则,可以通过 ScsiPortGetBusData 或微型端口驱动程序提供的默认值返回此值。 在任何情况下,驱动程序不得访问返回的映射范围之外的硬件。

[in] InIoSpace

TRUE 指示要映射的范围位于 I/O 空间中,微型端口驱动程序会将此范围中的映射地址传递到 ScsiPort...要与 HBA 通信的端口XxxHwScsiFindAdapter 例程从与 IoAddress 相同的 AccessRanges元素中获取此参数的值。 请注意,微型端口驱动程序 在ACCESS_RANGE类型元素中将 InMemorySpace 成员的值 反转为 ScsiPortGetDeviceBase 作为 inIoSpace 参数FALSE 指示要映射的范围位于内存空间中。

返回值

ScsiPortGetDeviceBase 返回给定 IoAddress 的映射逻辑基址(如果它已成功将给定范围从 IoAddress 映射到 NumberOfBytes)。 如果无法映射给定范围,ScsiPortGetDeviceBase 返回 NULL

言论

基于 NT 的作系统平台可以有多个类型的 I/O 总线和多个相同类型的 I/O 总线。 此外,HAL 可以将 I/O 空间映射到某些平台中的内存。

因此,微型端口驱动程序无法使用总线相对访问范围地址与其 HBA 通信。 若要在基于 CISC 和 RISC 的计算机之间保持微型端口驱动程序可移植性,必须使用 ScsiPortGetDeviceBase转换用于访问 HBA 的地址。

每个微型端口驱动程序都必须使用由 ScsiPortGetDeviceBase映射的系统空间逻辑范围地址来与其 HBA(s)通信。 对 ScsiPort 的调用...端口/注册Xxx 例程需要这些映射的逻辑地址。

ScsiPortGetDeviceBase 可以多次调用,具体取决于微型端口驱动程序支持的 HBA 数量以及每个 HBA 所需的访问范围数。 每个映射范围对应于在 AccessRanges 数组的 ACCESS_RANGE 类型元素中指定的一系列总线相对设备地址。

ScsiPortGetDeviceBase 只能从微型端口驱动程序的 HwScsiFindAdapter 例程或从 HwScsiAdapterControl 调用,当控制类型 ScsiSetRunningConfig时。 来自其他微型端口驱动程序例程的调用将导致系统故障或调用方作不正确。

按照以下准则调用 ScsiPortGetDeviceBase

  • 如果 HwScsiFindAdapter 使用的是 ScsiPortGetBusData返回的默认总线相对访问范围或值集,则在尝试调用 ScsiPortGetDeviceBase之前,它应调用 ScsiPortValidateRange
  • 如果 HwScsiFindAdapter 确定特定 HBA 不是微型端口驱动程序支持的 HBA,则必须调用 ScsiPortFreeDeviceBase 来释放它设置为与该 HBA 通信的映射(s)。
ScsiPortGetDeviceBase 返回的逻辑地址应用于对硬件进行的所有后续引用,但 不应 添加到PORT_CONFIGURATION_INFORMATION中的任何 AccessRanges 规范。 微型端口驱动程序编写器不应假设 ScsiPortGetDeviceBase返回的逻辑基址中使用了多少位。

ScsiPortGetDeviceBase 使用 SCSI_PHYSICAL_ADDRESS 来表示相对于总线的地址。

typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;

SCSI_PHYSICAL_ADDRESS 类型是作系统无关的数据类型,SCSI 微型端口驱动程序用于表示物理地址或总线相对地址。

注意 SCSI 端口驱动程序和 SCSI 微型端口驱动程序模型将来可能会更改或不可用。 相反,我们建议使用 Storport 驱动程序Storport 微型端口 驱动程序模型。
 

要求

要求 价值
目标平台 桌面
标头 srb.h (包括 Miniport.h、Scsi.h)
Scsiport.lib

另请参阅

ACCESS_RANGE

HwScsiFindAdapter

PORT_CONFIGURATION_INFORMATION (SCSI)

ScsiPortFreeDeviceBase

ScsiPortGetBusData

ScsiPortValidateRange