Вопрос или проблема
Я использую приложение, которое работает на платформе Windows 10. Когда пользователь включает машину, приложение автоматически загружается, и пользователь не может получить доступ к рабочему столу системы. Чтобы получить доступ к рабочему столу, пользователю нужен ключ. Этот ключ хранится на USB-устройстве. Когда USB подключен, служба Windows, созданная на C++, проверяет и позволяет пользователю использовать рабочий стол. Нет возможности безопасного извлечения этого USB. Поэтому, когда я подключаю USB во второй раз, проверка ключа не проходит из-за следующей ошибки:
“boost::filesystem::remove: Процесс не может получить доступ к файлу, так как он используется другим процессом: “F:System Volume Information\WPSettings.dat”.
При анализе оказалось, что этот файл используется службой storsvc. Я перезапускаю эту службу программно в событии “DBT_DEVICEREMOVECOMPLETE” функции “DeviceEventNotify()”. Но служба не освобождает файл. Когда я пытался выполнить безопасное извлечение программно, используя devicecontrol(), createfile() возвращает недопустимый дескриптор. Возможно, это потому, что USB уже извлечен. Когда я отключаю storsvc, все работает нормально. Но на моей машине я не могу отключить его.
Как мне продолжить?
Ответ или решение
Для решения проблемы, описанной в вашем вопросе, необходимо тщательно разобраться в функционировании службы хранения Windows storsvc
и её взаимодействии с файлами на USB-устройстве. Давайте разберёмся подробнее.
Теория
Служба Storage Service (storsvc) в Windows отвечает за управление хранилищем и может взаимодействовать с различными файлами на устройствах хранения, включая USB. Когда USB-устройство подключается к системе, storsvc
может получить доступ к системной информации этого устройства, например, к папке "System Volume Information", и оставлять открытые файловые дескрипторы.
В вашем случае, проблема возникает, поскольку файл WPSettings.dat
остаётся открытым службой storsvc
, что делает невозможным его удаление. Это вызывает сбой ключевой проверки при повторном подключении USB.
Пример
Вы упомянули, что программа на C++ пытается перезапустить storsvc
в событии DBT_DEVICEREMOVECOMPLETE
, но это не решает проблему, поскольку служба продолжает удерживать файл. Попытки безопасного отключения с помощью devicecontrol()
также не приводят к успеху из-за недействительного дескриптора, что, вероятно, связано с уже удалённым устройством.
Применение
Вот несколько шагов, которые могут помочь в решении этой проблемы:
-
Использование Process Explorer: скачать и использовать инструмент Process Explorer от Microsoft Sysinternals. Это позволит вам определить, какие процессы удерживают файловые дескрипторы на USB-устройстве. Обратите внимание, действительно ли проблема связана исключительно со
storsvc
. -
Изменение логики работы приложения: если возможно, избежать повторного использования USB без его перезапуска системы или пересоздания службы
storsvc
. Это может включать в себя кэширование ключа проверки на время сессии пользователя до отключения или выключения ПК. -
Проработка нюансов работы
storsvc
: если ваш контекст не позволяет отключить или модифицироватьstorsvc
, рассмотрите возможность обращения к инженерной поддержке Microsoft для получения специфического совета или патча. -
Альтернативные методы управления устройством: рассмотреть другие библиотеки или методы управления USB-устройствами в Windows, которые могут предложить более гибкие способы программного управления подключением и отключением устройств.
-
Разработка обходного решения: создание дополнительного маломощного программного компонента или скрипта, который при обнаружении подключения USB будет временно модифицировать поведение
storsvc
для предотвращения доступа к папке "System Volume Information".
Важно, чтобы какое-либо изменение или исправление были тщательно протестированы в безопасном окружении, прежде чем развёртывать их в производственной среде, ввиду возможного влияния на другие аспекты работы системы.