ScsiPortNotification 関数 (srb.h)
ScsiPortNotification ルーチンは、ミニポート ドライバーが要求を完了したときや、別の SRB を開始する準備ができている場合や、ホスト バス アダプター (HBA) が操作中に発生した特定の SCSI エラー状態を示す場合など、オペレーティング システム固有のポート ドライバーに特定のイベントを通知します。
注意
SCSI ポート ドライバーと SCSI ミニポート ドライバー モデルは、今後変更または使用できない可能性があります。 代わりに、 Storport ドライバー と Storport ミニポート ドライバー モデルを使用することをお勧めします。
構文
SCSIPORT_API VOID ScsiPortNotification(
SCSI_NOTIFICATION_TYPE NotificationType,
PVOID HwDeviceExtension,
...
);
パラメーター
NotificationType
通知の種類を指定します。 「解説」を参照してください。
HwDeviceExtension
ハードウェア デバイス拡張機能へのポインター。 これは、ポート ドライバーが割り当て、ミニポート ドライバーの代わりに初期化する HBA ごとの記憶域です。 ミニポート ドライバーは通常、HBA の状態や HBA のマップされたアクセス範囲など、この拡張機能に HBA 固有の情報を格納します。 この領域は、ミニポート ドライバーが ScsiPortInitialize を呼び出した直後に、HBA のデバイス オブジェクトの DeviceExtension-HwDeviceExtension> メンバーのミニポート ドライバーで使用できます。 ポート ドライバーは、デバイスを削除すると、このメモリを解放します。
...
このルーチンの可変個引数。 引数の数と型は NotificationType によって異なります。 「解説」を参照してください。
戻り値
なし
解説
ScsiPortNotification ルーチンには、各 NotificationType に関連付けられているさまざまなオプション パラメーターのセットがあります。 NotificationType に使用できる値の一覧と、各値の説明が続きます。
NotificationType = RequestComplete
指定された Srb が完了したことを示します。 この値が設定されている場合、 ScsiPortNotification には、SRB のアドレスという 1 つの追加パラメーターが必要です。 この通知の後、オペレーティング システム固有のポート ドライバーが要求を所有します。 ミニポート ドライバーは Srb にアクセスできません。また、 Srb を別のルーチン ( ScsiPortLogError など) に渡してはなりません。
構文:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // RequestComplete _In_ PVOID HwDeviceExtension, _In_opt_ PSCSI_REQUEST_BLOCK Srb );
NotificationType = NextRequest
ミニポート ドライバーが現在ビジー状態ではないターゲットへの別の要求の準備ができていることを示します。 この通知は、ドライバーが別の要求の準備ができたらすぐにミニポート ドライバーから送信する必要があります。 通常、この通知は HwScsiStartIo ルーチンから送信されますが、 場合によっては HwScsiInterrupt (または HwScsiEnableInterruptsCallback) ルーチンから送信されます。
NotificationType = NextLuRequest
指定された論理ユニットに対する別の要求に対して HBA の準備ができていることを示します。 この値が設定されている場合、 ScsiPortNotification には、(1) パス ID、(2) ターゲット ID、(3) 論理ユニット番号の 3 つの追加パラメーターが必要です。 この値は、HBA が複数の要求をキューに入れることができ、自動要求センスまたはタグ付きキューをサポートできる場合にのみ使用する必要があります。
構文:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // NextLuRequest _In_ PVOID HwDeviceExtension, _In_opt_ PathId, _In_opt_ TargetId, _In_opt_ Lun );
NotificationType = ResetDetected
HBA が SCSI バスでリセットを検出したことを示します。 この通知後も、ミニポート ドライバーはアクティブな要求を完了する必要があります。 SCSI ポート ドライバーは、必要なすべてのバス リセット遅延を管理します。
NotificationType = CallEnableInterrupts
ミニポート ドライバーがミニポート ドライバーの HwScsiEnableInterruptsCallback ルーチンを呼び出すためにオペレーティング システム固有のポート ドライバーが必要であることを示します。 この値が設定されている場合、 ScsiPortNotification には追加のパラメーター ( HwScsiEnableInterruptsCallback のエントリ ポイント) が必要です。 ミニポート ドライバーの HwScsiInterrupt ルーチンは、HBA で割り込みを無効に した後 、この呼び出しを行い、HBA が ISR でポーリングまたは停止する必要がある場合に、割り込み駆動型 I/O 処理を延期します。 コールバックの実行中、システム割り込みは有効なままですが、ミニポート ドライバーの HwScsiInterrupt ルーチンは呼び出されません。 HwScsiEnableInterruptsCallback は、遅延 I/O 処理を完了し、CallDisableInterrupts とミニポート ドライバーの HwScsiDisableInterruptsCallback エントリ ポイントを使用して ScsiPortNotification を再度呼び出す役割を担います。
構文:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // CallEnableInterrupts _In_ PVOID HwDeviceExtension, _In_opt_ PHW_INTERRUPT HwScsiXxxInterruptsCallback );
NotificationType = CallDisableInterrupts
ミニポート ドライバーがミニポート ドライバーの HwScsiDisableInterruptsCallback ルーチンを呼び出すためにオペレーティング システム固有のポート ドライバーが必要であることを示します。 この値が設定されている場合、 ScsiPortNotification には追加のパラメーター ( HwScsiDisableInterruptsCallback のエントリ ポイント) が必要です。 このコールバックの実行中は、HBA よりも優先度の高い割り込みがあるデバイスを除き、割り込みによって割り込むことはできません。 このコールバックでは、ミニポート ドライバーは HBA の割り込みを再び可能にします。
構文:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // CallDisableInterrupts _In_ PVOID HwDeviceExtension, _In_opt_ PHW_INTERRUPT HwScsiXxxInterruptsCallback );
NotificationType = RequestTimerCall
ミニポート ドライバーが、要求されたマイクロ秒数でミニポート ドライバーの HwScsiTimer ルーチンを呼び出すために、オペレーティング システム固有のポート ドライバーが必要であることを示します。 この値が設定されている場合、 ScsiPortNotification には 2 つの追加パラメーターが必要です。(1) ミニポート ドライバーの HwScsiTimer ルーチンのエントリ ポイントと (2) MiniportTimerValue 間隔 (マイクロ秒単位)。 システム タイマーの解像度は約 10 ミリ秒であることに注意してください。
構文:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // RequestTimerCall _In_ PVOID HwDeviceExtension, _In_opt_ PHW_TIMER HwScsiTimer, _In_opt_ ULONG MiniportTimerValue );
NotificationType = BusChangeDetected
ターゲット デバイスが動的バスに追加または削除された可能性があることを示します。 この値が設定されている場合、 ScsiPortNotification には追加のパラメーター (変更が検出されたバスのパス ID) が必要です。 この通知の後、ポート ドライバーは INQUIRY コマンドを発行してバスを再び有効化します。 バス列挙は時間がかかり、バスを結び付けるので、ミニポート ドライバーはこの通知を不必要に送信しないでください。
構文:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // BusChangeDetected _In_ PVOID HwDeviceExtension, _In_opt_ UCHAR PathId );
NotificationType = WMIEvent
ミニポート ドライバーが 1 つ以上の WMI データ コンシューマーが登録されているイベントを検出したことを示します。 この値が設定されている場合、 ScsiPortNotification には、少なくとも 3 つの追加引数が必要です。(1) WMI イベント構造へのポインター、(2) イベント構造のサイズ、(3) デバイスからイベントが発生した場合はターゲット デバイスのパス ID、またはイベントがアダプターから発生した場合は0xFF。 (3) がパス ID の場合、 ScsiPortNotification には、(4) ターゲット ID と (5) ターゲット デバイスの論理ユニット番号 (LUN) の 2 つの追加引数が必要です。
PathId != 0xFFの構文
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIEvent _In_ PVOID HwDeviceExtension, _In_opt_ PVOID WMIEvent, _In_opt_ UCHAR PathId, // != 0xFF _In_opt_ UCHAR TargetId, _In_opt_ UCHAR Lun );
PathId の構文 = 0xFF
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIEvent _In_ PVOID HwDeviceExtension, _In_opt_ PVOID WMIEvent, _In_opt_ UCHAR PathId // 0xFF );
NotificationType = WMIReregister
ミニポート ドライバーが 、IoWMIRegistrationControl を呼び出して以前に登録された特定のデータ ブロックのデータ項目またはインスタンスの数を変更したことを示します。 WMIReregister が設定されている場合、ScsiPortNotification には、少なくとも 2 つの追加引数が必要です。(1) ターゲット デバイスのパス ID をそのデバイスに再登録するか、アダプターを再登録0xFF。 (1) がパス ID の場合、 ScsiPortNotification には、(2) ターゲット ID と (3) ターゲット デバイスの論理ユニット番号 (LUN) の 2 つの追加引数が必要です。
PathId != 0xFFの構文
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIReregister _In_ PVOID HwDeviceExtension, _In_opt_ UCHAR PathId, // != 0xFF _In_opt_ UCHAR TargetId, _In_opt_ UCHAR Lun );
PathId の構文 = 0xFF
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIReregister _In_ PVOID HwDeviceExtension, _In_opt_ UCHAR PathId // 0xFF );
ミニポート ドライバーは、ミニポート ドライバーが正常に完了する SRB を使用してミニポート ドライバーの HwScsiStartIo ルーチンの呼び出しごとに ScsiPortNotification を 2 回呼び出す必要があります。 最初に、ミニポート ドライバーは、ミニポート ドライバーが LU ごとにタグ付きキューまたは複数の要求をサポートしている場合は、NextRequest の NotificationType または NextLuRequest を使用して ScsiPortNotification を呼び出します。 次に、ミニポート ドライバーは、RequestComplete の NotificationType と、それが満たした要求を使用して ScsiPortNotification を呼び出します。
ミニポート ドライバーの HwScsiInterrupt ルーチンは、ResetDetected の NotificationType を使用して ScsiPortNotification を呼び出す可能性が最も高いです。
HBA でミニポート ドライバーが 1 ミリ秒を超える処理割り込み駆動型 I/O 操作を使用する必要がある場合、その HwScsiInterrupt ルーチンは HBA の割り込みを無効にし、CallEnableInterrupts およびドライバー提供の HwScsiEnableInterruptsCallback ルーチンを使用して ScsiPortNotification を呼び出す必要があります。 次に、このルーチンは、CallDisableInterrupts および対応するドライバー提供の HwScsiDisableInterruptsCallback を使用して ScsiPortNotification を呼び出します。
WMI データ プロバイダーとして登録されているミニポート ドライバーは、WMIEvent で ScsiPortNotification を呼び出して、以前に有効化要求を受信したイベントを投稿できます。 ポート ドライバーは、下位 IRQL で後で処理するためにミニポート ドライバーのデバイス拡張機能の割り込みデータ領域でイベントをキューに入れます。 一度にキューに登録できるイベントの数は限られているため、ミニポート ドライバーは WMIEvent を使用して、ルーチン状態ではなく例外的な通知を行う必要があります。また、イベントが失われるのを防ぐために、ポート ドライバーにポスト間のDISPATCH_LEVELに戻る時間を与える必要があります。
要件
要件 | 値 |
---|---|
対象プラットフォーム | ユニバーサル |
Header | srb.h (Miniport.h、Scsi.h を含む) |
Library | Scsiport.lib;Storport.lib |
IRQL | (「解説」セクションを参照) |
こちらもご覧ください
HwScsiDisableInterruptsCallback