このトピックでは、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 である場合)。