UMDF ベースのドライバーでのデバイス インターフェイスの使用
"デバイス インターフェイス" は、アプリケーションがデバイスにアクセスする際に使用できるプラグ アンド プレイ (PnP) デバイスへのシンボリック リンクです。**ユーザー モード アプリケーションは、インターフェイスのシンボリック リンク名を API 要素 (Microsoft Win32 の CreateFile 関数など) に渡すことができます。デバイス インターフェイスのシンボリック リンク名を取得するために、ユーザー モード アプリケーションは SetupDi 関数を呼び出すことができます。SetupDi 関数の詳細については、「SetupDi デバイス インターフェイス関数」(英語の可能性あり) を参照してください。
各デバイス インターフェイスは、"デバイス インターフェイス クラス" に属しています。**たとえば、CD-ROM デバイスのドライバー スタックは、GUID_DEVINTERFACE_CDROM クラスに属するインターフェイスを提供できます。CD-ROM デバイスのドライバーの 1 つが、GUID_DEVINTERFACE_CDROM クラスのインスタンスを登録し、システムおよびアプリケーションに CD-ROM デバイスが使用可能であることを通知します。デバイス インターフェイス クラスの詳細については、「デバイス インターフェイスの概要」(英語の可能性あり) を参照してください。
デバイス インターフェイスの登録
デバイス インターフェイス クラスのインスタンスを登録するために、UMDF ベースのドライバーは IWDFDevice::CreateDeviceInterface を IDriverEntry::OnDeviceAdd コールバック関数から呼び出すことができます。ドライバーがインターフェイスの複数のインスタンスをサポートしている場合、各インスタンスに一意の参照文字列を割り当てることができます。
デバイス インターフェイスの有効化および無効化
ドライバーが IWDFDevice::CreateDeviceInterface を呼び出した後、デバイスが作業状態 (D0) に移行すると、フレームワークはすべてのデバイス インターフェイスを自動的に有効にします。デバイスが作業状態から別の状態に移行すると、フレームワークはインターフェイスを無効にします。
また、ドライバーは、必要に応じてデバイス インターフェイスを無効にして再び有効にできます。たとえば、デバイスが応答を停止しているとドライバーが判断した場合、ドライバーは IWDFDevice::AssignDeviceInterfaceState を呼び出して、デバイスのインターフェイスを無効にし、アプリケーションがインターフェイスへの新しいハンドルを取得できないようにすることができます (インターフェイスへの既存のハンドルには影響しません)。後でデバイスが使用可能になったら、ドライバーは IWDFDevice::AssignDeviceInterfaceState を再び呼び出して、インターフェイスを再び有効にすることができます。
デバイス インターフェイスへのアクセス要求の受信
アプリケーションがドライバーのデバイス インターフェイスへのアクセスを要求すると、フレームワークはドライバーの IQueueCallbackCreate::OnCreateFile コールバック関数を呼び出します。ドライバーは IWDFFile::RetrieveFileName を呼び出して、アプリケーションがアクセスしているデバイスまたはファイルの名前を取得できます。ドライバーがデバイス インターフェイスを登録するときに参照文字列を指定した場合、オペレーティング システムは、IWDFFile::RetrieveFileName が返すファイル名またはデバイス名にその参照文字列を含めます。
デバイス イベントの作成
UMDF ベースのドライバーで IWDFDevice::PostEvent を呼び出すと、デバイス固有のカスタム イベント ("デバイス イベント"**) を作成できます。デバイスのインターフェイスを使用するように登録したドライバーは、デバイスのカスタム イベントの通知を受け取ることができます。UMDF ベースのドライバーでこの通知を受け取るには、IRemoteInterfaceCallbackEvent::OnRemoteInterfaceEvent コールバック関数を提供します。
カスタム イベントは、デバイスに固有のイベントです。イベントを作成するドライバーの開発者と、イベントを受け取るドライバーの開発者の双方が、イベントの意味を理解している必要があります。
別のドライバーのデバイス インターフェイスへのアクセス
UMDF ベースのドライバーで、別のドライバーが提供しているデバイス インターフェイスに I/O 要求を送信するには、そのデバイス インターフェイスを表すリモート I/O ターゲットを作成します。
まず、デバイス インターフェイスが使用可能になったら通知されるように登録する必要があります。次の手順で設定してください。
ドライバーで IWDFDriver::CreateDevice を呼び出すときに、IPnpCallbackRemoteInterfaceNotification インターフェイスを指定します。このインターフェイスの IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival コールバック関数により、デバイス インターフェイスが使用可能になるとドライバーに通知されます。
IWDFDriver::CreateDevice を呼び出した後、ドライバーで使用する各デバイス インターフェイスについて IWDFDevice2::RegisterRemoteInterfaceNotification を呼び出します。
これにより、指定したデバイス インターフェイスが使用可能になるたびにドライバーの IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival コールバック関数が呼び出されます。このコールバック関数で IWDFRemoteInterfaceInitialize::GetInterfaceGuid および IWDFRemoteInterfaceInitialize::RetrieveSymbolicLink を呼び出すと、どのデバイス インターフェイスが使用可能になったのかを確認できます。
ドライバーの IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival コールバック関数では、通常、次の操作を行う必要があります。
IWDFDevice2::CreateRemoteInterface を呼び出して、リモート インターフェイス オブジェクトを作成します。その際、必要に応じて IRemoteInterfaceCallbackEvent インターフェイスと IRemoteInterfaceCallbackRemoval インターフェイスを指定します。
IWDFDevice2::CreateRemoteTarget を呼び出して、リモート ターゲット オブジェクトを作成します。その際、必要に応じて IRemoteTargetCallbackRemoval インターフェイスを指定します。
IWDFRemoteTarget::OpenRemoteInterface を呼び出して、デバイス インターフェイスをリモート ターゲットに接続します。
SWENUM ソフトウェア デバイス列挙子によって作成されたデバイス インターフェイスの場合は、作業項目から OpenRemoteInterface を呼び出す必要があります (例については、Windows SDK の QueueUserWorkItem 関数を参照してください)。
これで、ドライバーで I/O 要求をフォーマットしてリモート I/O ターゲットに送信できるようになりました。
UMDF ベースのドライバーでデバイス インターフェイス イベントの通知を受け取るには、IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival コールバック関数のほかに次の 2 つのコールバック関数も使用できます。
IRemoteInterfaceCallbackRemoval::OnRemoteInterfaceRemoval コールバック関数は、デバイス インターフェイスが削除されるとドライバーに通知します。
IRemoteInterfaceCallbackEvent::OnRemoteInterfaceEvent コールバック関数は、デバイスのカスタム イベントが発生するとドライバーに通知します。