次の方法で共有


ScsiPortValidateRange 関数 (srb.h)

ScsiPortValidateRange ルーチンは、指定したアクセス範囲の値が別のドライバーによってレジストリに既に要求されているかどうかを示します。

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

構文

SCSIPORT_API BOOLEAN ScsiPortValidateRange(
  [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

HwScsiFindAdapter が呼び出されたときに、PORT_CONFIGURATION_INFORMATION構造体の AdapterInterfaceType メンバーの値を指定します。

[in] SystemIoBusNumber

HwScsiFindAdapter が呼び出されたときの構成情報の SystemIoBusNumber メンバーの値を指定します。

[in] IoAddress

ミニポート ドライバーの HwScsiFindAdapter ルーチンがそのアドレスでアダプターのアクセス範囲をマップする前に検証するポートまたはデバイス メモリの範囲のバス相対ベース アドレスを指定します。

[in] NumberOfBytes

範囲内の要素のサイズをバイト単位または数で指定します。

[in] InIoSpace

範囲がメモリ内ではなく I/O 領域にあることを TRUE にするタイミングを示します。 FALSE の場合、範囲はメモリ空間内にあります。

戻り値

HwScsiFindAdapter ルーチンがマップされた範囲を安全にマップして使用してアダプターにアクセスできる場合、ScsiPortValidateRangeTRUE を返します。 指定したアクセス範囲の値が別のドライバーによってレジストリに既に要求されている場合、ScsiPortValidateRangeFALSE を返します。

注釈

ScsiPortValidateRange は、ミニポート ドライバーの HwScsiFindAdapter ルーチンからのみ呼び出すことができます。 他のミニポート ドライバー ルーチンからの呼び出しでは、呼び出し元のシステムエラーまたは正しくない操作が発生します。

オペレーティング システム固有のポート ドライバーがミニポート ドライバーの HwScsiFindAdapter ルーチンを呼び出す前に、PORT_CONFIGURATION_INFORMATION構造体の AccessRanges 要素を初期化する場合、ミニポート ドライバーは指定された値を ScsiPortGetDeviceBase に渡し、範囲のマップされた論理アドレスを使用して HBA がサポートされているかどうかを判断する必要があります。

ポート ドライバーは、アダプターのバス相対アドレス範囲の完全な説明をACCESS_RANGE型の要素に入力するか、ポート ドライバーは要素のすべてのメンバーをゼロにします。

既定のゼロで設定された入力 AccessRanges 要素の場合、 HwScsiFindAdapter ルーチンは、指定された I/O バスでサポートされているアダプターの検索を試みることができます。 このような状況では、ミニポート ドライバーには通常、HBA の種類のドライバーによって決定された既定のアドレスのセットがあります。 ただし、以前に読み込まれたドライバーは、特に一部のデバイスが x86 実モードで初期化されている x86 専用システムでは、このミニポート ドライバーの既定のアドレス範囲のいずれかで初期化されたアダプターを既に使用している可能性があります。 このようなデバイスが誤って再プログラミングされるのを防ぐために、各ミニポート ドライバーの HwScsiFindAdapter ルーチンは 、ScsiPortValidateRange を呼び出してから、ドライバーが指定したアドレスを ScsiPortGetDeviceBase にマップしてから、マップされた論理アドレスを使用して I/O バス上のアダプターをインターロゲートする必要があります。

ScsiPortValidateRangeFALSE を返す場合、別のドライバーが既にレジストリ内の範囲を要求しているため、HwScsiFindAdapter は入力範囲アドレスのマップを試みてはいけません。

ScsiPortValidateRangeTRUE を返した場合、HwScsiFindAdapter は次の操作を安全に実行できます。

  1. ScsiPortGetDeviceBase を使用して、バス相対範囲アドレスをシステム空間の論理範囲アドレスにマップします。
  2. マップされた論理アドレスと ScsiPortRead/WriteXxx を 使用して、アダプターが実際にドライバーがサポートする HBA であるかどうかを判断します。
ミニポート ドライバーがサポートする HBA の ScsiPortValidateRange に正常に渡された範囲を使用する場合、そのドライバーは、PORT_CONFIGURATION_INFORMATIONの AccessRanges 要素の RangeInMemory メンバーを設定するときに InIoSpace 値を反転する必要があります。

ScsiPortValidateRange、バス 相対アドレスを表すために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

こちらもご覧ください

ACCESS_RANGE

HwScsiFindAdapter

PORT_CONFIGURATION_INFORMATION (SCSI)

ScsiPortGetDeviceBase

ScsiPortInitialize