デバイス インターフェイス変更イベントの処理
ドライバーまたはユーザー モード コンポーネントがデバイス インターフェイス インスタンスを有効または無効にすると、PnP マネージャーは、デバイス インターフェイス クラスの EventCategoryDeviceInterfaceChange イベントに登録されているすべての通知コールバック ルーチンを呼び出します。 通知の理由を示すため、PnP マネージャーは、コールバック ルーチンの NotificationStructure パラメーターの Event メンバーを GUID_DEVICE_INTERFACE_ARRIVAL または GUID_DEVICE_INTERFACE_REMOVAL に設定します。
GUID_DEVICE_INTERFACE_ARRIVAL イベントを処理するとき、通知コールバック ルーチンは次の操作を行う必要があります。
新しいインターフェイスを処理するためのドライバー定義タスクを実行します。
通常、通知コールバック ルーチンは、コールバックのコンテキストでデバイスを直接開きます。 ただし、デバイスを開くと後続の PnP イベント (子デバイスの列挙など) が発生する可能性がある場合、コールバック ルーチンは代わりにワーカー ルーチンをキューに入れ、デバイスを開く必要があります。そうしないと、デッドロックが発生する可能性があります。
コールバック ルーチンは、新しいインターフェイスの可用性に応じて独自のインターフェイスを有効にする場合があります。
GUID_DEVICE_INTERFACE_REMOVAL イベントを処理するとき、通知コールバック ルーチンは次の操作を行う必要があります。
- インターフェイスが有効になったとき、実行した操作を元に戻します。 インターフェイス到着イベントに応答して開かれたファイル ハンドルをすべて閉じます。
EventCategoryDeviceInterfaceChange に加えて、ドライバーも EventCategoryTargetDeviceChange に登録し、GUID_TARGET_DEVICE_QUERY_REMOVE イベント コールバックからファイル ハンドルを閉じる必要があります。 ファイル ハンドルを開いたままにすると、削除プロセスが拒否され、順番に削除が取り消されます。