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

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

構文

HW_STARTIO HwStartio;

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

パラメーター

DeviceExtension

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

Srb

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

戻り値

要求が正常に開始された場合、HwStorStartIoTRUE を返します。 それ以外の場合は、 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 ルーチンでは許可されません。 全二重モードでは、HwStorStartIo ルーチンで StorPortAllocatePoolStorPortAcquireSpinLock を使用できます。

    非仮想ミニポートが同時チャネルの最適化をサポートしている場合 ( 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 は 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 は、HW_INITIALIZATION_DATA構造体の HwStartIo メンバーに設定されたミニポート ルーチンを記述するプレースホルダーです。 この構造体は、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_については、「 関数の動作に注釈を付ける」を参照してください。

要件

要件
対象プラットフォーム ユニバーサル
Header storport.h (Storport.h を含む)
IRQL DISPATCH_LEVEL (「解説」セクションを参照)。

こちらもご覧ください

HwStorBuildIo

SCSI_REQUEST_BLOCK

STORAGE_REQUEST_BLOCK

StorPortInitialize