次の方法で共有


UMDF ドライバーでの Kernel-Mode クライアントのサポート

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

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

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

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

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

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

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

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