Здравствуйте. Пишу WDF USB драйвер. Объект устройства можно открыть только один поток/процесс. Для этого в device extension поместил флажок, открыто устройство или нет. Для предотвращения удаления устройства: 1. в EvtDeviceFileCreate вызываю WdfDeviceSetStaticStopRemove(device, FALSE) (после полной инициализации) 2. в EvtFileClose - WdfDeviceSetStaticStopRemove(device, TRUE) (после полной очистки) 3. при ошибках с USB устройством вызываю WdfDeviceSetFailed(device, WdfDeviceFailedAttemptRestart) Всё работает замечательно, пока пользователь ручками не удалит устройство когда оно используется. В этом случае система вызывает DeviceRelease, не смотря на то, что устройство открыто. Затем приложение обнаруживает, что устройство не отвечает и закрывает его. Система вызывает EvtFileClose. Внутри этого обработчика происходит обращение к device extension. Иногда очистка происходит без ошибок. Но иногда в середине цикла очистки (далеко не первое обращение к device extension) система показывает синий экран с кодом DRIVER_PAGE_FAULT_IN_FREED_SPECIAL_POOL (verifier включён). При анализе дампа видно, что идёт обращение к device extension, но оно почему-то уже не доступно (дебаггер его не показывает). Получается, что device extension кто-то удаляет. Что я сделал не так? ps. Есть идея - завести event. EvtFileClose будет устанавливать его когда очистка завершена. А в DeviceRelease ожидать по этому событию. Законен ли этот способ? Может есть противопоказания?