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 HBA 裝置對象的成員使用。 埠驅動程式會在移除裝置時釋放此記憶體。
[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,以在呼叫 ScsiPortInitialize時,才能呼叫 HW_INITIALIZATION_DATA 中的 TRUE。
由於某些公交車的限制,例如 ISA,此例程傳回的地址不保證符合類似外部例程傳回的位址(例如 MmGetPhysicalAddress)。 迷你埠驅動程序應該只呼叫 ScsiPortXxx 例程才能移植。
ScsiPortGetPhysicalAddress 會使用 SCSI_PHYSICAL_ADDRESS 來代表實體位址。
typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
SCSI_PHYSICAL_ADDRESS 類型是作系統無關的數據類型,SCSI 迷你埠驅動程式用來表示實體位址或總線相對位址。
要求
要求 | 價值 |
---|---|
目標平臺 | 桌面 |
標頭 | srb.h (include Miniport.h, Scsi.h) |
連結庫 | Scsiport.lib |