поищите по форуму SURPRISE_REMOVAL, я как-то задавался таким вопросом)
правда так толком и не реализовал...
вроде нашел два варианта - через собственный Event и кажется через оконное сообщение, если не путаю.
Спасибо посмотрел, но к сожалению все это мало мне помогло. Проблем несколько, во первых я не могу вмешиваться в код приложений (это все приложения DirectShow, от AMCap до Adobe Premiere), во вторых все процедуры обработки IRP и многое другое скрыто в недрах USBCAMD.
В WDK об этом всего несколько строк:
Minidriver’s SRB_SURPRISE_REMOVAL handler
Component Action
Camera minidriver Call USBCAMD_AdapterReceivePacket.
USBCAMD2 Cancel pending data SRBs and return the SRBs with STATUS_CANCELLED.
USBCAMD2 Call the minidriver's CamStopCaptureEx and CamFreeBandwidthEx callback functions on all opened streams.
USBCAMD2 Return STATUS_CANCELLED on any read/write SRBs that come down after SRB_SURPRISE_REMOVAL.
Реально работает все не так, вернее так работает только если в приложении, например AMCap не включен Preview, в противном случае мне приходит SRB_SURPRISE_REMOVAL, а дальше если вызвать USBCAMD_AdapterReceivePacket тишина, CamStopCaptureEx и CamFreeBandwidthEx не приходят, приложение виснет, если его закрыть аварийно то дальше все штатно, драйвер завершается освобождая ресурсы.
Смотрел "фирменные" устройства и драйвера, половина также виснет, но есть и правильные. Боюсь, как бы это не была фича USBCAMD.
Пробовал менять SRB (HW_STREAM_REQUEST_BLOCK) вызывать StreamClassDeviceNotification и т.п, частично это помогает, приложение реагирует на это выдачей сообщения об ошибке, но не виснет, меня бы такое поведение устроило бы, но это не работает если устройство подключено к USB-хабу и выдергивать не устройство, а хаб.