ScsiPortGetDeviceBase 関数 (srb.h)
ScsiPortGetDeviceBase ルーチンは、HBA との通信に使用できるマップされた論理ベース アドレスを返します。 すべてのミニポート ドライバーは、マップされた論理アクセス範囲のアドレスを ScsiPort に渡す必要があります 。ポートXxx と ScsiPort..Xxx ルーチンを登録して HBA と通信します。
構文
SCSIPORT_API PVOID ScsiPortGetDeviceBase(
[in] PVOID HwDeviceExtension,
[in] INTERFACE_TYPE BusType,
[in] ULONG SystemIoBusNumber,
[in] SCSI_PHYSICAL_ADDRESS IoAddress,
[in] ULONG NumberOfBytes,
[in] BOOLEAN InIoSpace
);
パラメーター
[in] HwDeviceExtension
ハードウェア デバイス拡張機能へのポインター。 これは、ポート ドライバーが割り当て、ミニポート ドライバーの代わりに初期化する HBA ごとの記憶域です。 ミニポート ドライバーは通常、HBA の状態や HBA のマップされたアクセス範囲など、この拡張機能に HBA 固有の情報を格納します。 この領域は、ミニポート ドライバーが ScsiPortInitialize を呼び出した直後に、HBA のデバイス オブジェクトの DeviceExtension-HwDeviceExtension> メンバーのミニポート ドライバーで使用できます。 ポート ドライバーは、デバイスを削除すると、このメモリを解放します。
[in] BusType
HBA が接続されている I/O バスのインターフェイスの種類を指定します。 ミニポート ドライバーの HwScsiFindAdapter ルーチンは、入力PORT_CONFIGURATION_INFORMATIONの AdapterInterfaceType メンバーからこのパラメーターの値を取得します。
[in] SystemIoBusNumber
HBA が接続されている I/O バスのシステム割り当て番号を指定します。 HwScsiFindAdapter ルーチンは、入力PORT_CONFIGURATION_INFORMATIONの SystemIoBusNumber メンバーからこのパラメーターの値を取得します。
[in] IoAddress
HBA で使用される範囲のバス相対ベース アドレスを指定します。 HwScsiFindAdapter ルーチンは、ポート ドライバーが範囲構成情報を提供する場合、PORT_CONFIGURATION_INFORMATIONの AccessRanges 要素の 1 つからこのパラメーターの値を取得します。 それ以外の場合、このアドレスは 、ScsiPortGetBusData によって返される値またはミニポート ドライバーが提供する既定値にすることができます。 成功した戻り値の状態がエラー状態 (NULL) と競合する可能性があるため、ベース アドレス 0 を使用しないでください。
[in] NumberOfBytes
マッピングでカバーする範囲のサイズをバイト単位で指定します。 HwScsiFindAdapter ルーチンは、ポート ドライバーが範囲構成情報を提供する場合、IoAddress と同じ AccessRanges 要素からこのパラメーターの値を取得します。 それ以外の場合、この値は ScsiPortGetBusData またはミニポート ドライバーが提供する既定値で返すことができます。 いずれの場合も、ドライバーは、返されたマップされた範囲外のハードウェアにアクセスすることはできません。
[in] InIoSpace
TRUE は 、マップする範囲が I/O 領域であることを示し、ミニポート ドライバーは、この範囲のマップされたアドレスを ScsiPort に渡します。ポートXxx を使用して HBA と通信します。 HwScsiFindAdapter ルーチンは、IoAddress と同じ AccessRanges 要素からこのパラメーターの値を取得します。 ミニポート ドライバーは、InIoSpace 引数として ScsiPortGetDeviceBase に渡される前に、ACCESS_RANGE型要素の InMemorySpace メンバーの値を反転する必要があることに注意してください。 FALSE は 、マップする範囲がメモリ空間にあることを示します。
戻り値
ScsiPortGetDeviceBase は、IoAddress から NumberOfBytes に指定された範囲が正常にマップされた場合、指定された IoAddress のマップされた論理ベース アドレスを返します。 特定の範囲をマップできない場合、 ScsiPortGetDeviceBase は NULL を返します。
注釈
NT ベースのオペレーティング システム プラットフォームでは、複数の種類の I/O バスと同じ種類の複数の I/O バスを使用できます。 さらに、HAL は I/O 領域を一部のプラットフォームのメモリにマップできます。
したがって、ミニポート ドライバーは、バス相対アクセス範囲アドレスを使用してその HBA と通信することはできません。 CISC ベースと RISC ベースのマシン間でミニポート ドライバーの移植性を維持するには、HBA へのアクセスに使用するアドレスを ScsiPortGetDeviceBase で変換する必要があります。
すべてのミニポート ドライバーは、システム空間の論理範囲アドレスを使用する必要があります、 ScsiPortGetDeviceBase によってマップされ、その HBA と通信します。 ScsiPort を呼び出します...Xxx ルーチンのポート/登録には、これらのマップされた論理アドレスが必要です。
ミニポート ドライバーがサポートする HBA の数と、各 HBA で必要なアクセス範囲の数に応じて、ScsiPortGetDeviceBase を複数回呼び出すことができます。 マップされた各範囲は、 AccessRanges 配列のACCESS_RANGE型要素で指定されたバス相対デバイス アドレスの範囲に対応します。
ScsiPortGetDeviceBase は、ミニポート ドライバーの HwScsiFindAdapter ルーチンから、またはコントロールの種類が ScsiSetRunningConfig の場合は HwScsiAdapterControl からのみ呼び出すことができます。 他のミニポート ドライバー ルーチンからの呼び出しは、システムエラーまたは呼び出し元の不適切な操作になります。
ScsiPortGetDeviceBase を呼び出すには、次のガイドラインに従います。
- HwScsiFindAdapter がミニポート ドライバーによって提供される既定のバス相対アクセス範囲または ScsiPortGetBusData によって返される値のセットを使用している場合は、ScsiPortGetDeviceBase を呼び出す前に ScsiPortValidateRange を呼び出す必要があります。
- HwScsiFindAdapter が特定の HBA がミニポート ドライバーがサポートする HBA でないと判断した場合は、ScsiPortFreeDeviceBase を呼び出して、その HBA と通信するように設定したマッピングを解放する必要があります。
ScsiPortGetDeviceBase は 、バス 相対アドレスを表すためにSCSI_PHYSICAL_ADDRESSを使用します。
typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
SCSI_PHYSICAL_ADDRESSの種類は、物理アドレスまたはバス相対アドレスを表すために SCSI ミニポート ドライバーが使用するオペレーティング システムに依存しないデータ型です。
要件
要件 | 値 |
---|---|
対象プラットフォーム | デスクトップ |
Header | srb.h (Miniport.h、Scsi.h を含む) |
Library | Scsiport.lib |