特定のアロケーターのフィルター処理
オンボード メモリまたはその他のデバイスに依存するストレージ メソッドにアロケーターを必要とするフィルターでは、アロケーターのプロパティとメソッドをサポートすることで、特定のアロケーターを提供できます。 詳細については、「KSPROPERTY_STREAM_ALLOCATOR」を参照してください。
フィルターは、アロケーターのフレーム オプションを指定する KSCREATE_REQUEST_ALLOCATOR 種類の IRP_MJ_CREATE を受け取ります。 ミニドライバーのアロケーター作成ルーチンは、KsValidateAllocatorCreateRequest を呼び出して作成要求を検証します。 呼び出しが成功した場合、このルーチンは関連する KSALLOCATOR_FRAMING 構造体へのポインターを返します。
フィルターがフレーム要件を満たすことができない場合は、IRP に応答してエラー コードを返します。 それ以外の場合、フィルターは構造体へのポインターをファイル オブジェクトの FsContext メンバーにアタッチし、結果のアロケーター要求を処理します。
ストリーミング インターフェイスに渡されたバッファーをフィルターによってその場で変更する必要がある場合、ユーザー モード クライアントは、関連するKSALLOCATOR_FRAMING 構造体に KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER フラグを設定します。
アロケーターで使用できるインターフェイスは 2 つあります。 1 つは、すべてのアロケーターが IRP ベースの KSMETHODSETID_StreamAllocator をサポートする必要があります。 このメカニズムを使用するアロケーターは、割り当てられたフレームの最大数に制限されます。 この制限を超えてフレームを割り当てる要求は、保留中としてマークされます。
2 つ目に、割り当てプールの種類が DISPATCH_LEVEL で処理できる場合、ミニドライバーは、関数テーブルへのアクセスをサポートできます。 関数テーブルへのアクセスの提供は省略可能です。 これを行うには、KSPROPSETID_StreamAllocator のプロパティをサポートします。
DISPATCH_LEVEL インターフェイスは次のように動作します。
割り当て要求がアロケーターに送信されると、フレームが使用可能な場合、アロケーターはフレームへのポインターを返します。 そうでない場合は、すぐに NULL が返されます。
空き要求がアロケーターに送信されると、アロケーターは、空きフレームが使用可能であることをクライアントに通知する、ストリーム アロケーターの "フリー フレーム" イベントを通知します。 さらに、完了を待機している割り当て要求 IRP がある場合、アロケーターは作業項目をスケジュールし (現在の IRQL が PASSIVE_LEVEL でない場合)、空きフレームで要求を完了する必要があります。
DISPATCH_LEVEL インターフェイスと IRP ベースのインターフェイスの両方で、フリー フレームの競合が発生する可能性があります。 KS は、キャンセル スピン ロックを使用してこのキューを同期します。