DBT_DEVICEREMOVEPENDINGは、デバイス削除中に来る。
DBT_DEVICEREMOVEPENDING イベント (Dbt.h) - Win32 apps | Microsoft Learn
デバイスを削除する要求の処理 - Win32 apps | Microsoft Learn
ここでも、ディレクトリハンドルを閉じるように書いてあるが、果たして必要なのか。
D_DRP.cppで、
通知ハンドルをキー、ディレクトリハンドルを値とするmapNotifyDirectoryMapを追加。
デバイス通知登録とともに、両方のマップ登録。
DBT_DEVICEQUERYREMOVEで、ディレクトリハンドルを閉じるので、mapNotifyDirectoryMap[pDBHandle->dbch_hdevnotify]はNULL。
DBT_DEVICEQUERYREMOVEFAILEDに来たら、再度ディレクトリハンドル開くので、両方のマップに再登録。
DBT_DEVICEREMOVEPENDINGに来たら、mapNotifyDirectoryMap[pDBHandle->dbch_hdevnotify]がNULLでなければ閉じる処理とかNULLにするとかするけど、DBT_DEVICEQUERYREMOVEで既に閉じられてるからね。
DBT_DEVICEREMOVECOMPLETEなので、両方のマップから削除。

挿した時。

使用中取り出し。
再度ディレクトリハンドル開いて両方のマップに登録。

正常な取り出し。
DBT_DEVICEQUERYREMOVEで閉じてるので、DBT_DEVICEREMOVEPENDINGに来た時は閉じる必要がない。で両方のマップから削除。
やっぱり、DBT_DEVICEREMOVEPENDINGで、ディレクトリハンドルを閉じる必要ない気がするが。
Sample/winapi/DBT_DEVICEREMOVEPENDING/D_DRP/src/D_DRP at master · bg1bgst333/Sample · GitHub