DBT_DEVICEREMOVEPENDING

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