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 可用來建置散佈/收集清單,以用於跨越頁面的數據傳輸。 請注意,傳回的 Length 可以大於指定 SRB 中 DataBuffer 的大小。
如果傳遞非 NULL Srb,VirtualAddress 必須位於 SRB 的 DataBuffer 範圍內,或者必須是 SenseInfoBuffer 的指標。 否則,指定的 VirtualAddress 必須位於迷你埠驅動程式的未快取擴充功能、 SrbExtension 或 SenseInfoBuffer 中。
迷你埠驅動程式可以呼叫 ScsiPortGetPhysicalAddress,只有在該迷你埠驅動程式的 DriverEntry 例程將 NeedPhysicalAddresses 設定為 TRUE 時,才會在 HW_INITIALIZATION_DATA呼叫 ScsiPortInitialize 時呼叫 ScsiPortInitialize。
由於某些總線的條件約束,例如 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 |