次の方法で共有


特定のアロケーターをフィルター処理する

オンボード メモリまたはその他のデバイスに依存するストレージ メソッドにアロケーターを必要とするフィルターでは、アロケーターの プロパティメソッドをサポートすることで、特定のアロケーターを提供できます。 詳細については、「KSPROPERTY_STREAM_ALLOCATOR」 参照してください。

フィルターは、アロケーターのフレーム オプションを指定するKSCREATE_REQUEST_ALLOCATOR型のIRP_MJ_CREATEを受け取ります。 ミニドライバーのアロケーター作成ルーチンは、 KsValidateAllocatorCreateRequest を呼び出して作成要求を検証します。 呼び出しが成功した場合、このルーチンは、関連する KSALLOCATOR_FRAMING 構造体へのポインターを返します。

フィルターがフレーム要件を満たすことができない場合は、IRP に応答してエラー コードを返します。 それ以外の場合、フィルターは構造体へのポインターをファイル オブジェクトの FsContext メンバーにアタッチし、結果のアロケーター要求を処理します。

ストリーミング インターフェイスに渡されたバッファーをフィルターによってインプレースで変更する必要がある場合、ユーザー モード クライアントは、関連するKSALLOCATOR_FRAMING構造体に KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER フラグを設定します。

アロケーターで使用できるインターフェイスは 2 つあります。 まず、すべてのアロケーターが IRP ベースの KSMETHODSETID_StreamAllocatorをサポートする必要があります。 このメカニズムを使用するアロケーターは、割り当てられたフレームの最大数に制限されます。 この制限を超えてフレームを割り当てる要求は、保留中としてマークされます。

次に、ミニドライバーは、割り当てプールの種類をDISPATCH_LEVELで処理できる場合、関数テーブルへのアクセスをサポートできます。 関数テーブルへのアクセスの提供は省略可能です。 これを行うには、 KSPROPSETID_StreamAllocatorのプロパティをサポートします。

DISPATCH_LEVEL インターフェイスは次のように動作します。

割り当て要求がアロケーターに送信されると、フレームが使用可能な場合、アロケーターはフレームへのポインターを返します。 そうでない場合は、すぐに NULL が返されます。

空き要求がアロケーターに送信されると、アロケーターは、空きフレームが使用可能であることをクライアントに通知するストリーム アロケーターの "フリー フレーム" イベントを通知します。 さらに、完了を待機している割り当て要求のIRPがある場合、アロケーターはワーカー項目をスケジュールし(現在のIRQLがPASSIVE_LEVELでない場合)、その要求を空きフレームで完了する必要があります。

DISPATCH_LEVEL インターフェイスと IRP ベースのインターフェイスの両方で、フリー フレームの競合が発生する可能性があります。 KS は、キャンセル スピン ロックを使用してこのキューを同期します。