GUID_TARGET_DEVICE_QUERY_REMOVE イベントの処理
PnP マネージャーは、IRP_MN_QUERY_REMOVE_DEVICE IRP をデバイスのドライバーに送信する前に、デバイス上の EventCategoryTargetDeviceChange に登録されている通知コールバック ルーチンを呼び出します。 PnP マネージャーは、GUID_TARGET_DEVICE_QUERY_REMOVE の NotificationStructure.Event を指定します。
コールバック ルーチンは、このような通知に応答して、システムを中断せずにデバイスを削除できるかどうかを決定します。
デバイスを削除しない場合、コールバック ルーチンは STATUS_UNSUCCESSFUL を返します。 PnP マネージャーは、このステータスに応じて、クエリ削除処理を中止します。デバイスは削除されません。
デバイスを削除できる場合、コールバック ルーチンは、デバイスで開いているハンドルを閉じるなど (可能な場合)、デバイスの削除を準備するための適切な操作を実行する必要があります。 ハンドルがデバイスで開いたままになっている場合、PnP マネージャーはデバイスを削除できず、PnP マネージャーはクエリ削除処理を中止します。
GUID_TARGET_DEVICE_QUERY_REMOVE イベントを正常に処理したら、通知コールバック ルーチンは次の操作を行う必要があります。
デバイスへの開いているハンドルを閉じます。
ドライバーにファイル オブジェクトの未処理の参照がある場合、ファイル オブジェクトを逆参照します。
今後の EventCategoryTargetDeviceChange 通知に登録されたままになります。 間近の削除操作はキャンセルされる可能性があるため、これは重要です。
デバイスへのハンドルを閉じても、PnP ターゲット デバイス変更通知のドライバーの登録はキャンセルされません。 PnP マネージャーは引き続きドライバーの通知コールバック ルーチンを呼び出すことができますが、このような呼び出しでは、NotificationStructure のファイル オブジェクトは無効です。