ScsiPortGetPhysicalAddress 函数 (srb.h)
ScsiPortGetPhysicalAddress 例程将给定的虚拟地址范围转换为 DMA 操作的物理地址范围。
语法
SCSIPORT_API SCSI_PHYSICAL_ADDRESS ScsiPortGetPhysicalAddress(
[in] PVOID HwDeviceExtension,
[in] PSCSI_REQUEST_BLOCK Srb,
[in] PVOID VirtualAddress,
[out] ULONG *Length
);
参数
[in] HwDeviceExtension
指向硬件设备扩展的指针。 这是端口驱动程序代表微型端口驱动程序分配和初始化的每个 HBA 存储区域。 微型端口驱动程序通常在此扩展中存储特定于 HBA 的信息,例如 HBA 的状态和 HBA 的映射访问范围。 在微型端口驱动程序调用 ScsiPortInitialize 后,HBA 设备对象的 DeviceExtension-HwDeviceExtension> 成员中的微型端口驱动程序可以使用此区域。 端口驱动程序在删除设备时释放此内存。
[in] Srb
如果要转换的 VirtualAddress 来自该 SRB 的 DataBuffer 成员,或者可能来自 SenseInfoBuffer,则指向 SCSI 请求块的指针。 否则,此参数必须为 NULL。
[in] VirtualAddress
指向要转换的基虚拟地址的指针。 如果此虚拟地址位于 SRB 提供的 DataBuffer 的范围内,则调用方还必须提供 Srb 指针。
[out] Length
返回映射的字节数,从返回的物理地址开始。
返回值
ScsiPortGetPhysicalAddress 返回给定 VirtualAddress 的相应物理地址。 如果无法转换给定地址,则返回 NULL。
注解
总线主 HBA 的微型端口驱动程序调用 ScsiPortGetPhysicalAddress ,以获取在 DMA 操作期间要使用的映射物理地址范围。 例如, ScsiPortGetPhysicalAddress 可用于为跨页面的数据传输生成散点/收集列表。 请注意,返回的 长度 可以大于给定 SRB 中 DataBuffer 的大小。
如果传递了非 NULLSrb , 则 VirtualAddress 必须在 SRB 的 DataBuffer 范围内,或者必须是 来自 SenseInfoBuffer 的指针。 否则,给定的 VirtualAddress 必须位于微型端口驱动程序的未缓存扩展、 SrbExtension 或 SenseInfoBuffer 中。
仅当微型端口驱动程序的 DriverEntry 例程在调用 ScsiPortInitialize 时在HW_INITIALIZATION_DATA中将 NeedPhysicalAddresses 设置为 TRUE 时,微型端口驱动程序才能调用 ScsiPortGetPhysicalAddress 来转换扩展地址。
由于某些总线(如 ISA)的约束,不保证此例程返回的地址与类似外部例程 ((如 MmGetPhysicalAddress) )返回的地址匹配。 微型端口驱动程序应仅调用要可移植的 ScsiPortXxx 例程。
ScsiPortGetPhysicalAddress 使用 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 |