Написал сервис для отключения HDD. Сначала размонтирую раздел (FSCTL_LOCK_VOLUME -> FSCTL_DISMOUNT_VOLUME -> FSCTL_UNLOCK_VOLUME). Затем отключаю устройство. В ситауции когда диск занят какой-то другой софтиной, всё обламывается на FSCTL_LOCK_VOLUME. Можно размонтировать и без FSCTL_LOCK_VOLUME, но тогда отключить HDD не получится. Точнее оно отключается, но ему необходима перезагрузка, т.к. есть "отложенная запись". Этот вариант не подходит. Для того чтобы FSCTL_LOCK_VOLUME работал всегда написал софт для закрытия всех хэндлов которые ссылаются на раздел и блокирующий в этот момент доступ к разделу всем кроме самого себя. Результат не 100%. Подскажите, что ещё можно сделать, ибо силы меня уже покидают
Maveric, , могу ошибться, но в данном случаем, проблемой может быть кэш, потому как в нем остаються часть объектов(файловых), которые могут ссылаться на тот раздел который ты пытаешь демонтировать, попробуй принудительный сброс кэша, только не спрашивай как это сделать потому как я не знаю, это просто предположение.
Сброс кэша это хорошо Сам мечтаю узнать как это сделать. Единственный способ который я знаю это FSCTL_LOCK_VOLUME.
способы есть, проблема только в том, чтобы корректно сбросить из кэша какой-либо объект, у тебя должны быть экслюзивные права на него , в протвном случае BSOD или ничего, по крайней мере я так понял.
Закрываю все хендлы которые являются ссылками на объект типа "File". А чтобы во время этого процесса никто не открыл новые хэндлы фильтрую NtCreateFile и NtOpenFile. Если что-то не так, то большая просьба объяснить.
Если кого интереисует, то вот ответ из Редмонда: Только есть загвоздочка: Код (Text): hVolume = CreateFile(VolumeName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING | FLAG_WRITE_THROUGH, NULL); Эта конструкция работает только под отладчиком. Иначе облом. "SeDebugPrivilege" включена. В чём тут может быть дело ?
Дело скорее всего в том, что системе требуется время на сброс кэша Пока делаю несколько попыток с интервалом 1 сек. Максимум со второй срабатывает. Может кто-то знает как получить инф-ию о кол-ве кэшированных данных ?