Share via


ストリーム ポインターと IRP のキャンセル

フレームを参照するロックされたストリーム ポインターがある場合、このフレームに対応する IRP をキャンセルすることはできません。 「ストリーム ポインターのロックとロック解除」を参照してください。

次の表に、ミニドライバーが IRP の取り消しをサポートするために使用できる手法の一覧を示します。 キャンセル戦略は、左端の列で説明されているように、ミニドライバーのストリーム アクセス要件に基づく必要があります。

必要な場合: アクション Comments

1 つのアクセス ポイントでストリーム データに簡単にアクセスする

状態パラメーターを KSSTREAM_POINTER_STATE_LOCKED に設定して KsPinGetLeadingEdgeStreamPointer を呼び出します。 次に、処理が完了した直後に KsStreamPointerUnlock または KsStreamPointerAdvanceOffsetsAndUnlock を呼び出します。

ポインターの取得とロック解除の間にスレッドがブロックしない限り、キャンセルに対する高速な応答性を提供します。

アクセス時間は無期限ですが、キャンセル コールバックのコンテキストで要求を放棄できます

KsStreamPointerClone を呼び出して、ロックされたストリーム ポインター (通常は先頭) を複製し、ロックを解除して CancelCallback に応答します。 コールバックは、キューのスピン ロックが保持された状態、つまり DISPATCH_LEVEL で発生します。 したがって、ベンダーが 提供する CancelCallback ルーチンは、キュー操作を実行したり、ミューテックスを取得する関数を呼び出したりすることはできません。 代わりに、コールバック ルーチンでは、ミニドライバーは、関連付けられているデータが後でアクセスされないことを確認し、KsStreamPointerDelete を呼び出します。

実装がより困難になる可能性がありますが、多くの場合、効率的なアクセスとキャンセルへの迅速な対応の最適なバランスを提供します。

フレームへの定期的なアクセスと、アクセス間のフレームの消失を許容できる

ロック解除された複製を保持し、KsStreamPointerLock を呼び出してアクセス時にロックします。 フレームがキャンセルされた場合、次にストリーム ポインターをロックしようとすると失敗し、ミニドライバーは KsStreamPointerDelete を呼び出すことができます。

最初のオプションと同様に、キャンセルに対する応答性は、ストリーム ポインターがロックされている時間の関数です。

アクセス時間が無期限であり、コールバックに応答して要求を放棄することはできません

キャンセルを防ぐために、ロックされたクローン ストリーム ポインターを任意の時間保持します。 クローン ストリーム ポインターを作成するには、KsStreamPointerClone を呼び出します。 次に、KsStreamPointerLockKsStreamPointerUnlock を呼び出して、複製をロックまたはロック解除します。

キャンセルに対する応答性が低い場合があります。 この手法では、ストリーム ポインターのタイムアウトを使用することを検討してください。

フレームにストリーム ポインターが参照されている場合、ミニドライバーは KsStreamPointerGetIrp を呼び出して、このフレームに対応する IRP にアクセスできます。 フレームに関連付けられているメモリ記述子リスト (MDL) を取得するには、KsStreamPointerGetMdl を呼び出します。