ScsiPortGetPhysicalAddress 関数 (srb.h)

ScsiPortGetPhysicalAddress ルーチンは、指定された仮想アドレス範囲を DMA 操作の物理アドレス範囲に変換します。

メモ SCSI ポート ドライバーと SCSI ミニポート ドライバー モデルは、今後変更または使用できない可能性があります。 代わりに、 Storport ドライバー モデルと Storport ミニポート ドライバー モデルを使用することをお勧めします。
 

構文

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 のミニポート ドライバーは、DMA 操作中に使用されるマップされた物理アドレス範囲を取得するために ScsiPortGetPhysicalAddress を呼び出します。 たとえば、 ScsiPortGetPhysicalAddress を使用して、ページにまたがるデータ転送用の散布/収集リストを作成できます。 返される 長さは 、特定の SRB 内の DataBuffer のサイズより大きくなる可能性があることに注意してください。

NULL 以外の Srb が渡された場合、VirtualAddress は SRB の DataBuffer の範囲内であるか、SenseInfoBuffer からのポインターである必要があります。 それ以外の場合、指定された VirtualAddress は、ミニポート ドライバーのキャッシュされていない拡張機能、 SrbExtension、または SenseInfoBuffer 内にある必要があります。

ミニポート ドライバーは、ScsiPortGetPhysicalAddress を呼び出して、そのミニポート ドライバーの DriverEntry ルーチンが ScsiPortInitialize を呼び出したときにHW_INITIALIZATION_DATAで NeedPhysicalAddressesTRUE に設定した場合にのみ、拡張アドレスを変換できます。

ISA などの一部のバスの制約により、このルーチンによって返されるアドレスが、類似する外部ルーチン ( MmGetPhysicalAddress など) によって返されるアドレスと一致することは保証されません。 ミニポート ドライバーは、移植可能な ScsiPortXxx ルーチンのみを呼び出す必要があります。

ScsiPortGetPhysicalAddress では 、SCSI_PHYSICAL_ADDRESS を使用して物理アドレスを表します。

typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;

SCSI_PHYSICAL_ADDRESS型は、SCSI ミニポート ドライバーが物理アドレスまたはバス相対アドレスを表すために使用するオペレーティング システムに依存しないデータ型です。

メモ SCSI ポート ドライバーと SCSI ミニポート ドライバー モデルは、今後変更または使用できない可能性があります。 代わりに、 Storport ドライバー モデルと Storport ミニポート ドライバー モデルを使用することをお勧めします。
 

要件

要件
対象プラットフォーム デスクトップ
Header srb.h (Miniport.h、Scsi.h を含む)
Library Scsiport.lib

こちらもご覧ください

SCSI ミニポート ドライバーの DriverEntry

HW_INITIALIZATION_DATA (SCSI)

SCSI_REQUEST_BLOCK

ScsiPortGetUncachedExtension

ScsiPortGetVirtualAddress