DBT_DEVICEQUERYREMOVEFAILED

DBT_DEVICEQUERYREMOVEというデバイス削除要求に対し、失敗した時にDBT_DEVICEQUERYREMOVEFAILEDに来る。

DBT_DEVICEQUERYREMOVEFAILED event (Dbt.h) - Win32 apps | Microsoft Learn

ここに来た時は、

デバイスを削除する要求の処理 - Win32 apps | Microsoft Learn

再度ディレクトリハンドルを開くようにするらしい。
D_DQRF.cppで、

通知ハンドルをキー、ドライブマスクを値とするマップmapNotifyDriveMapを用意。

DBT_DEVICEARRIVALのDBT_DEVTYP_VOLUMEで、デバイス通知登録後に、mapNotifyDriveMapにも登録。

DBT_DEVICEQUERYREMOVEFAILEDのDBT_DEVTYP_VOLUMEで、mapNotifyDriveMapで通知ハンドルからドライブマスクを取得し、ディレクトリを開きなおす。
この時に来るpDBHandle->dbch_handleは、既にDBT_DEVICEQUERYREMOVEでCloseHandle済みの古いものであり、DBT_DEVICEQUERYREMOVEでdbch_handleを更新しても、DBT_DEVICEQUERYREMOVEFAILEDの時には反映されない模様。
なので、いったんデバイス通知解除し、再び新しいファイルハンドルでデバイス通知登録している。もちろん、mapNotifyDriveMapのキーも変わるので、再登録。

通知解除もちょっと面倒くさくなってるけど。

挿した時
挿した時

挿した時。
で、USBの中で、適当にファイルを開いて編集中にすれば、使用中ってことになる。

タスクトレイから取り出し
タスクトレイから取り出し

タスクトレイから取り出し。

こういうエラーが出て、DBT_DEVICEQUERYREMOVEFAILEDも出てる。
こういうエラーが出て、DBT_DEVICEQUERYREMOVEFAILEDも出てる。

こういうエラーが出て、DBT_DEVICEQUERYREMOVEFAILEDも出てる。
ディレクトリの開きなおしに加えて、通知登録もしなおしてるから、hDevNotifyは変わってる。

編集をやめて、取り出しをすると、今度は成功。
編集をやめて、取り出しをすると、今度は成功。

編集をやめて、取り出しをすると、今度は成功。
Otherがまだ出ているのだが、これはDBT_XXX系イベントがもう一つあるということ。

Sample/winapi/DBT_DEVICEQUERYREMOVEFAILED/D_DQRF/src/D_DQRF at master · bg1bgst333/Sample · GitHub