DBT_DEVICEQUERYREMOVEは、RegisterDeviceNotificationによるデバイス通知登録済みで、デバイス削除の要求が来た時に発生する。
DBT_DEVICEQUERYREMOVE イベント (Dbt.h) - Win32 apps | Microsoft Learn
デバイスを削除する要求の処理 - Win32 apps | Microsoft Learn
この時に、開いていたディレクトリハンドルを閉じれば、取り出し成功になる。
DBT_DEVICEQUERYREMOVE.cppで、
hDirectoryもstaticに。
デバイス通知登録の後、ここではハンドルを閉じない。
DBT_DEVICEQUERYREMOVEのDBT_DEVTYP_HANDLEで、ディレクトリハンドルを閉じる。
そうすると、取り出し成功(DBT_DEVICEREMOVECOMPLETE)となる。
閉じる前の部分に独自の処理、例えば使用中のアプリを終了する処理などを書いておく。
挿した時、

こうなる。
デバイス取り出しで、

こうなる。
DBT_DEVICEQUERYREMOVEのDBT_DEVTYP_HANDLEに来てるのがわかる。
ここで、ディレクトリハンドルを閉じている。