отключение HDD

Тема в разделе "WASM.WIN32", создана пользователем Maveric, 7 дек 2005.

  1. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Написал сервис для отключения HDD. Сначала размонтирую раздел (FSCTL_LOCK_VOLUME -> FSCTL_DISMOUNT_VOLUME -> FSCTL_UNLOCK_VOLUME). Затем отключаю устройство. В ситауции когда диск занят какой-то другой софтиной, всё обламывается на FSCTL_LOCK_VOLUME. Можно размонтировать и без FSCTL_LOCK_VOLUME, но тогда отключить HDD не получится. Точнее оно отключается, но ему необходима перезагрузка, т.к. есть "отложенная запись". Этот вариант не подходит.

    Для того чтобы FSCTL_LOCK_VOLUME работал всегда написал софт для закрытия всех хэндлов которые ссылаются на раздел и блокирующий в этот момент доступ к разделу всем кроме самого себя.

    Результат не 100%.

    Подскажите, что ещё можно сделать, ибо силы меня уже покидают :)
     
  2. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Maveric,
    , могу ошибться, но в данном случаем, проблемой может быть кэш, потому как в нем остаються часть объектов(файловых), которые могут ссылаться на тот раздел который ты пытаешь демонтировать, попробуй принудительный сброс кэша, только не спрашивай как это сделать потому как я не знаю, это просто предположение.
     
  3. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    :)

    Сброс кэша это хорошо :) Сам мечтаю узнать как это сделать. Единственный способ который я знаю это FSCTL_LOCK_VOLUME.
     
  4. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    способы есть, проблема только в том, чтобы корректно сбросить из кэша какой-либо объект, у тебя должны быть экслюзивные права на него :), в протвном случае BSOD или ничего, по крайней мере я так понял.
     
  5. serious

    serious New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    33
    Адрес:
    Russia
    Maveric

    А ты уверен, что ВСЕ хэндлы закрываешь?
     
  6. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Закрываю все хендлы которые являются ссылками на объект типа "File". А чтобы во время этого процесса никто не открыл новые хэндлы фильтрую NtCreateFile и NtOpenFile.

    Если что-то не так, то большая просьба объяснить.
     
  7. serious

    serious New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    33
    Адрес:
    Russia
    А как ты эти хэндлы получаешь? NtQuerySystemInformation/NtQueryObject?
     
  8. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Maveric, есть еще один момент, это количество ссылок на объект, т.е. ObDereferenceObject(объект)==0
     
  9. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90


    Именно так.

    2LuckyDevil: может ты и прав. Кол-во ссылок не обязательно равно кол-ву хэндлов.
     
  10. serious

    serious New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    33
    Адрес:
    Russia
    Может дело в открытых ключах реестра? Попробуй замочить заодно их :)))
     
  11. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Если кого интереисует, то вот ответ из Редмонда:



    Только есть загвоздочка:
    Код (Text):
    1. hVolume = CreateFile(VolumeName,
    2.                                              GENERIC_WRITE,
    3.                                              0,
    4.                                              NULL,
    5.                                              OPEN_EXISTING,
    6.                                              FILE_FLAG_NO_BUFFERING | FLAG_WRITE_THROUGH,
    7.                                              NULL);


    Эта конструкция работает только под отладчиком. Иначе облом. "SeDebugPrivilege" включена. В чём тут может быть дело ?
     
  12. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Дело скорее всего в том, что системе требуется время на сброс кэша :) Пока делаю несколько попыток с интервалом 1 сек. Максимум со второй срабатывает.

    Может кто-то знает как получить инф-ию о кол-ве кэшированных данных ?