次の方法で共有


UMDF ドライバーでのバッファー アクセス メソッドの管理

UMDF ドライバーを記述する場合は、読み取りおよび書き込み要求、およびデバイス I/O 制御要求にフレームワークが使用するバッファー アクセス メソッド基本設定を指定できます。 UMDF ドライバーが提供する値は基本設定のみであり、フレームワークで使用される保証はありません。

優先バッファー アクセス方法の指定

UMDF バージョン 2.0 以降、UMDF ドライバーは WdfDeviceInitSetIoTypeEx を呼び出して、読み取り/書き込み要求とデバイス I/O 制御要求の優先アクセス メソッドを登録します。

ドライバーが WdfDeviceInitSetIoTypeEx を呼び出さない場合、UMDF は、このデバイスへの I/O 要求にバッファーされたメソッドを使用します。

フレームワークでは、次の規則を使用して、使用するアクセス方法を決定します。

  • ドライバー スタック内のすべての UMDF ドライバーは、デバイスのバッファーにアクセスするために同じメソッドを使用する必要があります。フレームワークは、バッファーに格納された I/O を優先します。

    一部のドライバーがデバイスに対してバッファー I/O またはダイレクト I/O のいずれかを優先し、他のドライバーがデバイスのバッファー I/O のみを優先すると判断した場合、UMDF はすべてのドライバーにバッファー I/O を使用します。 1 つ以上のスタックのドライバーがバッファー I/O のみを優先し、他のドライバーが直接 I/O のみを優先する場合、UMDF はシステム イベント ログにイベントを記録し、ドライバー スタックを開始しません。

    ドライバーは 、WdfDeviceGetDeviceStackIoType を呼び出して、UMDF がデバイスの読み取り/書き込み要求と I/O 制御要求に割り当てたバッファー アクセス メソッドを決定できます。

  • 場合によっては、UMDF はダイレクト I/O をデバイスに割り当てますが、最適なパフォーマンスを得るために、1 つ以上のデバイスの要求にバッファー I/O を使用します。 たとえば、UMDF は、データをドライバーのバッファーに直接アクセスするバッファーをマップするよりも高速にコピーできる場合、バッファー I/O を小さなバッファーに使用します。

    必要に応じて、ドライバーは WdfDeviceInitSetIoTypeEx を呼び出すときに DirectTransferThreshold 値を提供できます。 フレームワークでは、この値を使用して、フレームワークが直接 I/O を使用する最小のバッファー サイズを決定します。 フレームワークでは最適なパフォーマンスを提供する設定が使用されるため、通常、この値を指定する必要はありません。

  • UMDF は、メモリ ページの境界で開始および終了するバッファー領域にのみ、直接 I/O を使用します。 バッファーの先頭または末尾がページ境界上にない場合、UMDF はバッファーのその部分にバッファー I/O を使用します。 つまり、UMDF では、複数の I/O 要求で構成される大規模なデータ転送に、バッファー I/O と直接 I/O の両方を使用できます。

  • デバイス I/O 制御要求の場合、UMDF は、I/O 制御コード (IOCTL) が直接 I/O を指定する場合にのみ、およびそのデバイスのすべての UMDF ドライバーが直接アクセス メソッドを指定するために WdfDeviceInitSetIoTypeEx を呼び出した場合にのみ、ダイレクト I/O を使用します。

I/O 要求のアクセス方法の取得

ドライバーは、バッファー アクセス メソッドに関係なく、データ バッファーにアクセスするために同じ要求オブジェクト メソッドのセットを使用します。 そのため、ほとんどのドライバーは通常、UMDF がバッファー I/O または I/O 要求に直接 I/O を使用しているかどうかを認識する必要はありません。

場合によっては、I/O 要求のアクセス方法がわかっている場合は、ドライバーのパフォーマンスを向上させることができます。 たとえば、通常はダイレクト I/O を使用する高スループットデバイスを考えてみましょう。 ドライバーは、I/O 要求を受信すると、検証のために共有バッファー領域からローカル ドライバー メモリにデータをコピーします。

ただし、ドライバーは、バッファード I/O を使用するバッファーを受け取ることがあるかもしれません。 I/O マネージャーは既にこのデータを中間バッファーにコピーしているため、ドライバーはパラメーターをローカルにコピーする必要はありません。 コピー操作を回避することで、ドライバーのパフォーマンスが向上します。

UMDF ドライバーは 、WdfRequestGetEffectiveIoType を呼び出して、I/O 要求のバッファー アクセス メソッドを取得します。 前述のように、特定の要求の I/O の種類は、デバイスのフレームワークによって割り当てられた I/O の種類の設定とは異なる場合があります。

バッファーI/O でもダイレクトI/O でもない状態からの変換

UMDF ドライバーでは、"どちらの" メソッドも使用できません。

ただし、一部のデバイス I/O 制御コード (IOCTL) の 定義 では、要求で "どちらの" メソッドも使用されません。 必要に応じて、UMDF ドライバーは、このようなデバイス I/O 制御要求のバッファー アクセス方法をバッファー I/O または直接 I/O に変換できます。 次の手順に従います。

  1. ドライバーの INF ファイルの INF DDInstall セクションUmdfMethodNeitherAction ディレクティブを含めます。 このディレクティブの値を設定して、UMDF が「いずれの」アクセス メソッドも使用しないデバイス I/O 制御要求をドライバーに渡すように指定できます。 (それ以外の場合、UMDF はエラー状態値を使用してこれらの I/O 要求を完了します)。

  2. UMDF が提供するオブジェクト メソッドを利用して、バッファード I/O またはダイレクト I/O の I/O 要求のバッファーにアクセスします。

UMDF がアクセスメソッドをバッファー I/O またはダイレクト I/O に変換できる場合にのみ、"どちらの" メソッドも使用する IOCTL 要求のサポートを有効にする必要があります。 たとえば、「 I/O コントロール コードのバッファーの説明」で説明されているバッファー仕様規則に従っていないカスタマイズされた要求を IOCTL で指定した場合、UMDF はバッファーを変換できません。