UMDF ドライバーでのカーネルモード クライアントのサポート

このトピックでは、UMDF バージョン 2 以降、ユーザーモード ドライバー フレームワーク (UMDF) ドライバーがカーネルモード クライアントをサポートする方法について説明します。

カーネルモード クライアントは、UMDF ドライバーに I/O 要求を送信するカーネルモード ドライバーです。 カーネルモード ドライバーは、同じデバイス スタック内の UMDF ドライバーの上にあるか、別のデバイス スタックにある可能性があります。

カーネルモード ドライバーは、ユーザーモード アプリケーションから受信した I/O 要求を転送したり、新しい I/O 要求を作成してユーザーモード ドライバーに送信したりできます。

UMDF ドライバーでカーネルモード クライアントをサポートする方法

UMDF ドライバーによるカーネルモード クライアントのサポートを有効にするには、UMDF ドライバーの INF ファイルに、その INF の DDInstall WDF セクションに UmdfKernelModeClientPolicy ディレクティブを含める必要があります。

フレームワークには、カーネルモード クライアントをサポートするドライバーに役立つ 2 つのメソッドが用意されています。 ドライバーは、WdfRequestGetRequestorMode メソッドを呼び出して、I/O 要求がカーネルモードまたはユーザーモードから送信されたかどうかを判断できます。 I/O 要求がユーザーモードから送信された場合、ドライバーは WdfRequestIsFromUserModeDriver を呼び出して、要求がアプリケーションまたは別のユーザーモード ドライバーから送信されたかどうかを判断できます。

カーネルモード ドライバーに関する制限事項

UMDF ドライバーは、カーネルモード ドライバーが次の要件を満たしている場合にのみ、カーネルモード ドライバーからの I/O 要求を処理できます。

  • カーネルモード ドライバーは、I/O 要求を送信するときに IRQL = PASSIVE_LEVEL で実行されている必要があります。

  • ドライバーが UmdfFileObjectPolicy INF ディレクティブを AllowNullAndUnknownFileObjects に設定していない限り、カーネルモード ドライバーがユーザーモード ドライバーに送信する各 I/O 要求には、関連付けられているファイル オブジェクトが必要です。 I/O マネージャーがファイル オブジェクトを作成したことをフレームワークに事前に通知しておく必要があります。 (このような通知により、フレームワークはユーザーモード ドライバー EvtDeviceFileCreate コールバック関数を呼び出しますが、そのコールバック関数は省略可能です。)

  • I/O 要求に IRP_MJ_INTERNAL_DEVICE_CONTROL 関数コードを含めることはできません。

  • ユーザーモード ドライバーはポインターを逆参照できないため、I/O 要求のバッファーには追加情報へのポインターを含めることはできません。

  • I/O 要求に "どちらでもない" バッファー アクセス メソッドを指定する I/O 制御コードが含まれている場合、カーネルモード ドライバーは、I/O 要求を作成したアプリケーションのプロセス コンテキストで I/O 要求を送信する必要があります。 UMDF ドライバーで "どちらでもない" メソッドをサポートする方法の詳細については、「UMDF ドライバーでのバッファー アクセス メソッドの管理」を参照してください。

  • UMDF ドライバーは、ユーザーモードで I/O 要求の出力データを変更する場合があります。 したがって、カーネルモード ドライバーは、ユーザーモード ドライバーから受信するすべての出力データを検証する必要があります。

  • 通常、カーネルモード クライアントは、UMDF ドライバーが WdfRequestCompleteWithInformation に渡す情報値を検証する必要があります。 クライアントが KMDF ドライバーの場合は、WdfRequestGetCompletionParams を呼び出して、IO_STATUS_BLOCK 構造体でこの情報を取得できます。

    通常、フレームワークは、UMDF ドライバーが WdfRequestCompleteWithInformation に渡す情報値を検証しません。 (このパラメーターは通常、転送されたバイト数を指定します) フレームワークは、出力バッファーに対してのみ情報値を検証し、バッファー I/O データ アクセス メソッドに対してのみ検証します。 (たとえば、フレームワークは、アクセス メソッドがバッファー I/O である場合、転送されたバイト数が読み取り操作の出力バッファー サイズを超えていないことを確認します。)