Отмонтированный файл usb всё ещё используется службой storsvc.

Вопрос или проблема

Я использую приложение, которое работает на платформе 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() также не приводят к успеху из-за недействительного дескриптора, что, вероятно, связано с уже удалённым устройством.

Применение

Вот несколько шагов, которые могут помочь в решении этой проблемы:

  1. Использование Process Explorer: скачать и использовать инструмент Process Explorer от Microsoft Sysinternals. Это позволит вам определить, какие процессы удерживают файловые дескрипторы на USB-устройстве. Обратите внимание, действительно ли проблема связана исключительно со storsvc.

  2. Изменение логики работы приложения: если возможно, избежать повторного использования USB без его перезапуска системы или пересоздания службы storsvc. Это может включать в себя кэширование ключа проверки на время сессии пользователя до отключения или выключения ПК.

  3. Проработка нюансов работы storsvc: если ваш контекст не позволяет отключить или модифицировать storsvc, рассмотрите возможность обращения к инженерной поддержке Microsoft для получения специфического совета или патча.

  4. Альтернативные методы управления устройством: рассмотреть другие библиотеки или методы управления USB-устройствами в Windows, которые могут предложить более гибкие способы программного управления подключением и отключением устройств.

  5. Разработка обходного решения: создание дополнительного маломощного программного компонента или скрипта, который при обнаружении подключения USB будет временно модифицировать поведение storsvc для предотвращения доступа к папке "System Volume Information".

Важно, чтобы какое-либо изменение или исправление были тщательно протестированы в безопасном окружении, прежде чем развёртывать их в производственной среде, ввиду возможного влияния на другие аспекты работы системы.

Оцените материал
Добавить комментарий

Капча загружается...