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后,此区域可供 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中。
微型端口驱动程序只能调用 ScsiPortGetPhysicalAddress 来转换扩展地址,前提是该微型端口驱动程序的 DriverEntry 例程设置为 NeedPhysicalAddresses 在HW_INITIALIZATION_DATA中调用 ScsiPortInitialize时 TRUE。
由于某些总线(如 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) |
库 | Scsiport.lib |
另请参阅
SCSI 微型端口驱动程序 的 DriverEntry