デバイス インターフェイスの到着とデバイスの削除の通知の登録

このトピックでは、ユーザー モードのアプリケーションまたはドライバーがデバイス インターフェイスの到着とデバイスの削除の通知を登録する方法について説明します。

通常、ユーザー モード コンポーネントはCM_Register_Notificationを呼び出してデバイス インターフェイスを検索し、I/O 要求をインターフェイスに送信します。 これを行うために、コンポーネントは、デバイス インターフェイスの到着とデバイスの削除を通知するために、CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACECM_NOTIFY_FILTER_TYPE_DEVICEHANDLEの両方に登録します。 呼び出しシーケンスは、次のようになります。

デバイス インターフェイスの到着とデバイスの削除の通知の登録

  1. CM_Register_NotificationCM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE で呼び出し、デバイス インターフェースの到着通知を登録します。 指定したクラスの将来のインターフェイスが到着すると、システムによってコンポーネントに通知されます。

  2. I/O を送信したいインタフェースがすでにシステム上に存在する可能性があるため、CM_Get_Device_Interface_List または SetupDiGetClassDevs を呼び出して既存のインタフェースのリストを取得します。 (注) 手順 1 と手順 2 の間にインターフェイスが到着した場合、手順 1 の登録と手順 2 のインターフェイスの一覧から、インターフェイスが 2 回表示されます。

  3. 目的のインターフェイスが見つかると、CreateFile を呼び出してデバイスのハンドルを開きます。

  4. 手順 3 でデバイス ハンドルが正常に作成されたら、もう一度 CM_Register_Notification を呼び出します。 今回は、 CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE 種類の通知に登録し、通知を受信するハンドルとして新しいデバイス ハンドルを指定します。 インターフェイスによって表されるデバイスがクエリ削除要求を受け取ると、システムはコンポーネントに通知します。

  5. デバイス ハンドル通知コールバックを実装するときは、次の表を使用します。

    コールバックが受け取るアクション値 コンポーネントで実行する必要がある操作
    CM_NOTIFY_ACTION_DEVICEQUERYREMOVE

    CloseHandle を呼び出してデバイス ハンドルを閉じます。 これを行わないと、開いているハンドルによって、このデバイスのクエリ削除が成功できなくなります。

    CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED

    クエリの削除に失敗したため、デバイスとそのインターフェイスは引き続き有効です。 インターフェイスへの I/O の送信を続けるには、新しいハンドルを開きます。

    まず、CM_Unregister_Notificationを呼び出して、古いハンドルの通知の登録を解除します。 登録解除する通知ハンドルの通知コールバックから CM_Unregister_Notification を呼び出すことができないため、遅延ルーチンからこれを行う必要があります。 詳細については、「解説」セクションを CM_Unregister_Notification から参照してください。

    次に、遅延ルーチンで続行するか、通知コールバックで戻るか、CreateFile を呼び出して新しいハンドルを作成します。 次に、 CM_Register_Notification を新しいハンドルと CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE を使用して呼び出します。

    CM_NOTIFY_ACTION_DEVICEQUERYREMOVE 通知の送信後にクエリを削除中のデバイスで通知に登録すると、最初に CM_NOTIFY_ACTION_DEVICEQUERYREMOVE 通知を受け取らずに CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED 通知を受け取る可能性があることに注意してください。

    CM_NOTIFY_ACTION_DEVICEREMOVEPENDING

    CM_Unregister_Notification を呼び出して、ハンドルの通知の登録を解除します。 遅延ルーチンから行う必要があります。 詳細については、「解説」セクションを CM_Unregister_Notification から参照してください。 まだデバイスのハンドルが開いている場合は、CloseHandle を呼び出してデバイス ハンドルを閉じます。

    CM_NOTIFY_ACTION_DEVICEREMOVECOMPLETE

    CM_Unregister_Notification を呼び出して、ハンドルの通知の登録を解除します。 遅延ルーチンから行う必要があります。 詳細については、「解説」セクションを CM_Unregister_Notification から参照してください。 まだデバイスのハンドルが開いている場合は、CloseHandle を呼び出してデバイス ハンドルを閉じます。

  6. デバイスの使用が完了したら、CM_Unregister_Notification を呼び出して、手順 1 で登録したインターフェイス通知コールバックの登録を解除します。

UMDF 2 ドライバーでこの手順に従っている場合は、デバイス「インターフェイスの使用」で、コード例の参照してください。 UMDF 2 ドライバーは、ドライバーの EvtDevicePrepareHardware コールバック ルーチンで手順 1 から 4 を実行し、ドライバーのデバイス削除コールバック ルーチンのいずれかで手順 6 を実行する場合があります。

CM_Register_Notification

CM_Unregister_Notification

デバイス インターフェイスの使用