Определить является ли устройство removable

Тема в разделе "WASM.NT.KERNEL", создана пользователем Sheph, 30 июн 2008.

  1. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Всем доброго времени суток!
    У меня следующий вопрос: как из юзер мода определить относится ли устройство к removable device(не removable media), т.е к таким устройствам относятся: всё что втыкается в USB и FireWire, floppy, CD/DVD ну и хватит для начала.
    Как определить является ли устройство floppy, CD/DVD я знаю, но как определить что устройство воткнуто в USB ?
    Пробовал через SetupDi, но не всегда получается, например если воткнуть iPod, то для любого volume'а на iPod'е его парент будет являться usb storage device. Однако, если воткнуть USB'шный жёсткий диск, то его парент будет ROOT/FTDISK/XXX, т.е ничего сказать нельзя. Кроме как SetupDi способов не нашёл. Кто-нибудь знает как можно идентифицировать однозначно и для любого устройства ?
    P.S: Ну или хотя бы как это сделать из ядра ?
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Sheph
    может здесь что-то найдёшь:
    http://www.wasm.ru/article.php?article=usb_eject
     
  3. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Посмотри в сторону IOCTL_STORAGE_GET_HOTPLUG_INFO.
     
  4. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    reverser, не, не подходит, DeviceHotplug стоит в TRUE только если в окошке
    "Диск X:->Оборудование->Свойства->Политка" переключатель установлен в "Оптимизация для быстрого удаления", если я переключу его в "Оптимизация для выполнения", то поле DeviceHotplug становится FALSE как и у не-USB устройств, так что этим кэтээль кодом не определить является ли устройство внешним USB устройством.
    P.S: Ужас просто, казалось бы, такая простая задача, а решения всё ещё нет ( Уже не знаю куда копать...
    Причём в kernel'е такая же ситуация...
     
  5. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Есть правда одна мысль, можно вызвать SetupDiGetDeviceRegistryProperty с параметром SPDRP_REMOVAL_POLICY_HW_DEFAULT - это Removal Policy по умолчанию, т.е возможно для трушных USB устройств он всегда будет возвращать CM_REMOVAL_POLICY_EXPECT_SURPRISE_REMOVAL, только вот действительно ли это будет так ? Может кто знает ? ...
     
  6. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    Вобщем, вроде как проблема решилась, решение есть, оно достаточно грамоздкое (и не совсем красивое, но большего, как мне кажется, сделать нельзя, ну по крайней мере у меня не получилось сделать красивее), клаву зря сшёркивать не хочется, но если кому-то здесь интересно, я могу описать...
     
  7. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.733
    Drive_name db 'C:',0 ; Буффер для имени диска

    invoke GetDriveType, addr Drive_name ; Получаем тип носителя.
    cmp eax,DRIVE_REMOVABLE ; Проверяем является ли он сьемным
    jne no_disk
     
  8. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    asmlamo, не, не вариант, для USB жёсткого диска GetDriveType вернёт DRIVE_FIXED
     
  9. muxamor

    muxamor New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2008
    Сообщения:
    20
    А с директорией объектов уже никак?
     
  10. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    muxamor, а что с ней ?
    Вообще, я сделал так, получаю enumerator для диска из узла дерева PNP драйверов. Если он IDE, SATA и т.д, то считаю что устройство фиксированное, в противном случае - переносимое. Вообще, нормального способа выяснить это под виндой нет, можно лишь полагаться на какие-либо ориентиры, я вот полагаюсь на enumerator.
     
  11. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    А SATA вообще-то тоже hotplug поддерживает ;)
    Т.е. все SATA диски являются съёмными.
    Другой вопрос что внешних разъёмов SATA делают мало, а в корпус никто не полезет.
     
  12. Sheph

    Sheph New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    89
    cppasm, ага, вот в том то всё и дело, что определить "съёмное" ли устройство невозможно, можно лишь предпологать, вот я и предположил )