Конференция "WinAPI" » Определение типа устройства хранения данных [D7]
 
fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution sockets.php on line 83
fsockopen() [function.fsockopen]: unable to connect to www.delphimaster.ru:80 (php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution) sockets.php on line 83
php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution (0) sockets.php on line 85
fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution sockets.php on line 83
fsockopen() [function.fsockopen]: unable to connect to www.delphimaster.ru:80 (php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution) sockets.php on line 83
php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution (0) sockets.php on line 85
  • Dimaxx © (08.12.18 20:01) [0]
    Доброго времени суток!

    Открыть устройство через CreateFile('\\.\PhysicalDrive<номер>...) с конкретным номером для дальнейшей работы с ним через ReadFile/WrteFile  проблем не составляет. Но дальше этого не приходилось углубляться. Ведь кроме винтов в системе могут быть подключены, к примеру, карты памяти и/или виртуальные диски .vhd (в моем случае, прочая экзотика исключена). Возник вопрос - как определить что за устройство под указанным номером мы открываем? Мне нужно составить список устройств для выбора пользователем с каким устройством работать. К примеру:

    1 - HDD #1 (объем такой-то)
    2 - HDD #2 (объем такой-то)
    3 - виртуальный диск (объем такой-то)
    4 - карта памяти (объем такой-то)
    5 - USB-флэш (объем такой-то)

    Порылся в добрых ламповых IOCTL-кодах - по коду IOCTL_STORAGE_GET_MEDIA_TYPES_EX в возвращаемой структуре есть поле типа девайсов, где для него определено море всяческих типов (включая виртуальные диски и mass storage). Но для винтов, USB-флэшек и подключенных vhd возращает всегда FILE_DEVICE_DISK (0х7). А по IOCTL_STORAGE_GET_MEDIA_TYPES в структуре DISK_GEOMETRY винт/vhd имеет тип 12 (FixedMedia), а флэшка - 11 (RemovableMedia), что мало информативно.

    1) Есть еще какие-то способы получения более подробной информации?
    2) Как программно можно распознать примонтирован ли vhd в системе по пути и имени файла?
  • Styx © (09.12.18 11:11) [1]
    Никогда такого не делал, но отвечу из общих соображений - искать нужно на другом уровне абстракции. Если в Device manager-е Вы видите в разделе "диски" нужную информацию, можно попробовать использовать SetupDI API. Но вообще, как я понимаю, идея виртуальных дисков именно в том, чтобы для пользователя они выглядели как физические, поэтому, вполне вероятно, что решение проблемы может быть не очень простым.
  • Dimaxx © (09.12.18 12:01) [2]
    В SetupDI API уже параллельно копаюсь, но для меня там пока темный лес - ни разу не приходилось сталкиваться.
  • Styx © (09.12.18 12:36) [3]
    Так а в Device mabager-то виртуальный диск как выглядит?
  • Dimaxx © (10.12.18 00:22) [4]
    Как "Msft Virtual Disk SCSI Disk Device" в разделе дисковых накопителей.
  • Pavia © (11.12.18 20:19) [5]
    https://yadi.sk/d/y_A6Xqb_xr2T2w
    Вот код определяет USB диски, всё что не USB то виртуальный диск.


    > 4 - карта памяти (объем такой-то)
    > 5 - USB-флэш (объем такой-то)

    Эти только геометрическими размерами отличаются логически или цифровые интерфейсы у них одинаковые и вы их не отличите.  Вы можете попробовать считать 0 сектор если не читается то это картиридер либо сломаная флешка
 
Конференция "WinAPI" » Определение типа устройства хранения данных [D7]
Есть новые Нет новых   [103733   +63][b:0.001][p:0.001]