次の方法で共有


HW_STARTIO コールバック関数 (storport.h)

Storport ドライバーは、HwStorStartIo ルーチンを受信 I/O 要求ごとに 1 回呼び出します。

構文

HW_STARTIO HwStartio;

BOOLEAN HwStartio(
  PVOID DeviceExtension,
  PSCSI_REQUEST_BLOCK Srb
)
{...}

パラメーター

DeviceExtension

HBA 記憶域ごとのミニポート ドライバーへのポインター。

Srb

開始する SCSI 要求ブロックへのポインター。

戻り値

HwStorStartIo は、要求が正常に開始された場合 TRUE を返します。 それ以外の場合は、FALSE 返します。

備考

HwStorStartIo I/O 操作を開始します。 StorPort は、HwStorBuildIo で準備され、DeviceExtension または Srb->SrbExtension に格納されるミニポートのプライベート データを使用するように設計されています。 HwStorBuildIo はスピン ロックなしで呼び出されるため、最適なドライバー パフォーマンスは、HwStorBuildIoでできるだけ多くのデータを準備することによって実現されます。

Storport は、次 方法で HwStorStartIo を呼び出します。

  • PORT_CONFIGURATION_INFORMATIONで設定 SynchronizationModel の値に応じて、記憶域の非仮想ミニポート ドライバーの場合、Storport は常に同じ IRQL HwStorStartIo を呼び出し、内部スピン ロックを使用して I/O 要求が順番に開始されるようにします。 IRQL は、DISPATCH_LEVEL (全二重モード) または DIRQL (半二重モード) のいずれかです。

    半二重モードで I/O を処理する場合、HwStorStartIo ルーチンは、独自のスピン ロックを取得する必要はありません。 また、StorPortAllocatePool を使用したメモリ割り当てと、StorPortAcquireSpinLock による相互除外は、HwStorStartIo ルーチンでは許可されません。 全二重モードでは、StorPortAllocatePool と storPortAcquireSpinLock HwStorStartIo ルーチンで使用できます。

    非仮想ミニポートが同時実行チャネルの最適化をサポートしている場合 (StorPortInitializePerfOptsによって設定STOR_PERF_CONCURRENT_CHANNELS)、HwStorStartIo を同時に 複数呼び出しできます。 この場合、ミニポートは、共有リソースがロックによって保護されていることを確認する必要があります。 このパフォーマンスの最適化により、Storport は HwStorStartIo 呼び出す前に StartIo ロックを取得せず、ミニポートは必要に応じて独自のロックを提供する必要があります。

  • ストレージ仮想ミニポート ドライバーの場合、Storport は IRQL <= DISPATCH_LEVEL で HwStorStartIo 呼び出し、内部スピン ロックを使用しません。 HwStorStartIo ルーチンは、StorPortAcquireSpinLock呼び出すことによって、独自のスピン ロックを取得できます。 また、StorPortAllocatePoolへの呼び出しは、ストレージ仮想ミニポート ドライバーの HwStorStartIo ルーチンで許可されます。

SCSI 状態を受信すると、SRB が完了することが予想されます。 Storport ドライバーが、RequestCompleteNotificationType を使用して StorPortNotification呼び出すことによって SRB を完了すると、Srb の SrbStatus フィールドに次のいずれかの値が返されることが期待されます。

  • SRB_STATUS_SUCCESS

    • Srb が送信され、SCSI 状態 (場合によってはデータあり) が返されたことを示します。
    • Storport は、データと状態を呼び出し元に返します。
    • ミニポート アクションは、HwStorDpcRoutineから、RequestCompleteStorPortNotification を使用して要求を完了する以外は何もありません。
  • SRB_STATUS_BUSY

    • Srb の送信に一時的な問題があることを示します (アダプター レジスタやバッファーがビジー状態など)。
    • Storport は、Srb->SrbExtension が指 元の Srb 拡張機能を破棄し、新しい拡張機能を発行します。 Storport は、以降の呼び出しで新しく発行された Srb 拡張機能を使用して元の Srb を送信し、HwStorBuildIo し、HwStorStartIo します。 元の Srb 拡張機能内のすべてのデータが失われます。
    • ミニポートは、Srb の DataTransferLengthを更新しないでください。
    • 新しい Srb 拡張機能が発行されるため、ミニポートは SCSI トランザクションの途中でSRB_STATUS_BUSYを発行しないようにする必要があります。 トランザクションが開始されたら、完了または取り消す必要があります。 トランザクション中のハードウェアビジー状態は、ミニポート ドライバーによって処理される必要があります。

HwStorStartIo 名前は、HwStartIo 構造体のメンバーに設定されているミニポート ルーチンを記述 HW_INITIALIZATION_DATA プレースホルダーです。 この構造体は、StorPortInitializeHwInitializationData パラメーター渡されます。 このルーチンの実際のプロトタイプは、Storport.h で次のように定義されています。

typedef
BOOLEAN
(*PHW_STARTIO) (
  _In_ PVOID  DeviceExtension,
  _In_ PSCSI_REQUEST_BLOCK  Srb
  );

Windows 8 以降では、Srb パラメーターは、SCSI_REQUEST_BLOCK または STORAGE_REQUEST_BLOCKを指すことができます。 Srb Function フィールドの関数識別子SRB_FUNCTION_STORAGE_REQUEST_BLOCK場合、SRB は STORAGE_REQUEST_BLOCK 要求構造体です。

HwStorStartIo コールバック ルーチンを定義するには、まず、次のコード例に示すように、静的ドライバー検証ツール (SDV) およびその他の検証ツールを する関数宣言を指定する必要があります。

HwStorStartIo コールバック関数を定義するには、まず、定義するコールバック関数の型を識別する関数宣言を指定する必要があります。 Windows には、ドライバーのコールバック関数の種類のセットが用意されています。 コールバック関数の種類を使用して関数を宣言すると、ドライバー のコード分析、静的ドライバー検証ツール (SDV)、およびその他の検証ツールをすると、エラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。

たとえば、MyHwStartIo という名前の HwStorStartIo コールバック ルーチン定義するには、HW_STARTIO 型を使用し、次のようにコールバック ルーチンを実装します。

HW_STARTIO MyHwStartIo

BOOLEAN
MyHwStartIo (
  _In_ PVOID  DeviceExtension,
  _In_ PSCSI_REQUEST_BLOCK  Srb
  );
  {
      ...
  }

HW_STARTIO 関数の種類は、Storport.h ヘッダー ファイルで定義されます。 コード分析ツールの実行時にエラーをより正確に識別するには、_Use_decl_annotations_ annotation を関数定義に追加してください。 _Use_decl_annotations_ annotation により、ヘッダー ファイル内の HW_STARTIO 関数型に適用される注釈が使用されます。 関数宣言の要件の詳細については、「Storport ドライバーの関数ロール型を使用して関数を宣言する」を参照してください。 _Use_decl_annotations_の詳細については、「関数の動作 に注釈を付けるを参照してください。

必要条件

要件 価値
ターゲット プラットフォーム 万国
ヘッダー storport.h (Storport.h を含む)
IRQL DISPATCH_LEVEL (「解説」セクションを参照)。

関連項目

HwStorBuildIo

SCSI_REQUEST_BLOCK

STORAGE_REQUEST_BLOCK

StorPortInitialize