UMDF ドライバーでデバイス プールの使用
ユーザーモード ドライバー フレームワーク (UMDF) バージョン 1.11 および 2.0
ユーザーモード ドライバー フレームワーク (UMDF) ドライバーがバージョン 1.11 または 2.0 でビルドされ、Windows 8 以降で実行されている場合、フレームワークは複数のデバイス スタックをホストできる Wudfhost の単一インスタンスを作成します。 この手法は、デバイス プーリングと呼ばれます。 デバイス プールのメインの利点は、複数の UMDF デバイスを使用する環境でのメモリ消費量を減らすことです。
プールされたデバイスで障害が発生した場合、フレームワークは Wudfhost のインスタンスを終了し、プール内にあったすべてのデバイスの再起動を試みます。 プール中にデバイスが再度失敗した場合、フレームワークはデバイス用に個別の Wudfhost プロセスを作成し、デバイスの起動を再試行します。
デバイスが別のホスト プロセスで失敗した場合、フレームワークは最大 5 回再起動を試みます。 フレームワークは、前回のエラーから 30 分が経過すると、デバイス エラー数を 1 にリセットします。
システムが再起動されると、別のプロセスで実行中に失敗したデバイスを除き、フレームワークによってデバイスが再プールされます。
特定のデバイスのデバイス プールを無効にするには、INF の WDF 固有の DDInstall セクションで UmdfHostProcessSharing ディレクティブを使用します。 UmdfHostProcessSharing の詳細については、「INFファイル での WDF ディレクティブの指定」を参照してください。
ドライバーでダイレクト I/O を使用する場合は、UmdfHostProcessSharing を ProcessSharingDisabled に設定する必要があります。 そうしないと、ドライバーの起動に失敗する可能性があります。 WdfDeviceIoBufferedOrDirect が選択され、デバイスがプールされている場合、フレームワークはバッファー アクセス メソッドをバッファー I/O に変更します。 WdfDeviceIoBufferedOrDirect が選択され、デバイスがプールされていない場合、フレームワークはバッファー アクセス メソッドをダイレクト I/O に変更します。
バッファー アクセス メソッドを選択するには、ドライバーが IDriverEntry::OnDeviceAdd コールバック関数から IWDFDeviceInitialize2::SetIoTypePreference メソッドを呼び出す必要があります。 アクセス方法の詳細については、「UMDF ベースのドライバーでのデータ バッファーへのアクセス」を参照してください。
UMDF バージョン 1.9 以前
ドライバーが UMDF バージョン 1.9 以前でビルドされている場合、フレームワークはデバイス スタックごとにホスト プロセス (Wudfhost) の個別のインスタンスを作成します。
デバイスの起動に失敗した場合、フレームワークは最大 5 回再起動を試みます。 フレームワークは、前回のエラーから 30 分が経過すると、デバイス エラー数を 1 にリセットします。
プールされていない環境では、複数のデバイス スタックが同じ UMDF ドライバーを共有している場合:
- 各デバイス スタックは、個別の WudfHost プロセスで読み込まれます。
- フレームワークは、ドライバーの IDriverEntry::OnInitialize メソッドと IDriverEntry::OnDeinitialize メソッドをデバイス スタックごとに 1 回呼び出します。
- フレームワークは、デバイス スタックごとにドライバーの IDriverEntry::OnDeviceAdd メソッドを 1 回呼び出します。 各デバイス オブジェクトは、個別のドライバー オブジェクトに関連付けられています。
プールされた環境で、複数のデバイス スタックが同じユーザーモード ドライバーを共有する場合:
- 各デバイス スタックは、同じ WudfHost プロセスで読み込まれます。
- フレームワークは、ドライバーの IDriverEntry::OnInitialize メソッドと IDriverEntry::OnDeinitialize メソッドを 1 回だけ呼び出します。
- フレームワークは、デバイス スタックごとにドライバーの IDriverEntry::OnDeviceAdd メソッドを 1 回呼び出します。 各デバイス オブジェクトは、同じドライバー オブジェクトに関連付けられています。
プールされた構成にはドライバー オブジェクトが 1 つしかないため、ドライバーは、グローバル変数やデバイス間で共有されているオブジェクト (ドライバー コールバック オブジェクトなど) に、デバイスごとのコンテキストを格納しないでください。 代わりに、ドライバーは、デバイス スタック間で共有されていないオブジェクト (ドライバーのデバイス コールバック オブジェクトなど) にデバイスごとのコンテキストを格納する必要があります。