UMDF ドライバーに対するセッション 0 のガイドライン
Windows Vista 以降、オペレーティング システムはサービスとシステム プロセスをセッション 0 に分離し、アプリケーションは後続の上位番号のセッションで実行されるようになりました。 UMDF ホスト プロセス (WUDFHost.exe) はセッション 0 で実行されるシステム プロセスの 1 つであるため、UMDF ドライバーはアプリケーションから分離されます。 その結果、ドライバーを開発するときは、次のガイドラインを使用する必要があります。
ダイアログ ボックスなどのユーザー インターフェイス (UI) 要素を作成したり、ユーザーによる入力に依存したりしないでください。 ユーザーはセッション 0 で実行されていないため、UI を表示させたり、応答することができません。
UI 要素も操作しないでください。 たとえば、UMDF ドライバーは、ユーザーのセッション内のウィンドウを列挙できません。
ドライバーがサービスと通信する必要がある場合は、リモート プロシージャ コール (RPC) や名前付きパイプなどのクライアント/サーバー メカニズムを使用します。
Windows API で関数を呼び出すときは注意が必要です。 一部の関数では、UI 要素を操作したり、ユーザーのセッションで名前付きオブジェクトにアクセスしようとしたりすることがあります。 ユーザー モード サービスから呼び出さない Windows 関数は呼び出さないでください。 一般に、UMDF ドライバーは、kernel32.dll でエクスポートされる関数を安全に呼び出すことができますが、user32.dll でエクスポートされた関数は呼び出しません。
UMDF ドライバーは、次のタスクを実行する Windows 関数を呼び出す可能性があります。
ドライバーが SetupDiXxx 関数を呼び出して、プラグ アンド プレイ デバイス プロパティを取得する場合があります。 たとえば、UMDF Sample Driver for OSR USB Fx2 学習キットは SetupDiGetDeviceRegistryProperty を呼び出して、デバイスのバスの種類の GUID を取得します。 注: UMDF ドライバーは、SetupDiXxx 関数の多くを安全に呼び出すことはできませんが、デバイス ノードのプロパティを取得する関数を呼び出しても安全です。
手動キューから I/O 要求を取得するドライバーは、定期的なタイマーを作成してキューをポーリングする場合があります。 たとえば、WudfVhidmini サンプルでは、CreateThreadpoolTimer を呼び出してタイマー コールバック ルーチンを登録し、SetThreadpoolTimer を呼び出して定期的なタイマーを設定します。 注: バージョン 1.11 以降、UMDF は作業項目をサポートするようになりました。 詳細については、「作業項目の使用」を参照してください。
フレームワークの外部でシステム サービスを使用する方法の詳細については、Orwick、Peny、Guy Smith の第 14 章 (「フレームワークを超える」) を参照してください。 Windows Driver Foundation でのドライバーの開発 Redmond, WA: Microsoft Press, 2007 年.
セッション 0 の分離の詳細については、「セッション 0 の分離が Windows のサービスとドライバに与える影響」を参照してください。