Конференция "WinAPI" » USB Flash Drive + CreateFile() [D6, WinXP]
 
  • Дмитрий (28.05.09 11:03) [0]
    Доброго времени суток, мастера !
    Пытаюсь открыть нужный мне (из нескольких подключенных) USB Flash Drive как файл для последующего посекторного чтения. При помощи SetupDiGetClassDevs(@GUID_CLASS_USB_DEVICE,,,,), SetupDiEnumDeviceInterfaces(h_DevInfo, nil, GUID_CLASS_USB_DEVICE,,), SetupDiGetInterfaceDeviceDetail () получаю devicepath вида \\?\usb#vid_0000&pid_0000#00000000000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}. При подстановке в CreateFile(pchar('\\?\usb#vid_0000&pid_0000#00000000000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}'),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_FLAG_RANDOM_ ACCESS,0); хэндл получается правильный, но секторы не читаются. Если в CreateFile подставить \\?\STORAGE#RemovableMedia#7&18e1babe&0&RM#{53f5630a-b6bf-11d0-94f2-00a0c91efb8b} все читается нормально. Экспериментировал с RegisterDeviceNotification с фильтром dbcc_devicetype:=DBT_DEVTYP_DEVICEINTERFACE - получаю то же самое \\?\usb#vid_0000&pid_0000... только "в динамике", при включении накопителя.
    Что из вышеупомянутых строк считается Symbolic Link ? Какой функцией получить \\?\STORAGE#RemovableMedia... ?
  • Игорь Шевченко © (28.05.09 11:20) [1]
    через GUID тома открыть ?
    например,
    \\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\
  • Дмитрий (28.05.09 13:11) [2]
    Пробовал открывать
    \\?\Volume{A5DCBF10-6530-11D2-901F-00C04FB951ED}\  (GUID_CLASS_USB_DEVICE)
    \\?\Volume{4D36E967-E325-11CE-BFC1-08002BE10318}\  (GUID_DEVCLASS_DISKDRIVE), результат - INVALID_HANDLE_VALUE.
  • Rouse_ © (28.05.09 13:14) [3]
    А ты их через ZwCreateFile открывай а не через CreateFile
  • Дмитрий (28.05.09 13:54) [4]
    Попробую. Но пока не понимаю, как откроется нужный мне флэш драйв (с заранее известным VID, PID, s/n). Как я уже говорил, флэш драйвов может быть несколько и нехорошо было бы лезть в тот, который мне не нужен. Букву "прибывшего в систему" диска можно получить, если отловить сообщение (Msg=WM_DEVICECHANGE)
         and((wParam=DBT_DEVICEARRIVAL)or(wParam=DBT_DEVICEREMOVECOMPLETE)) и прочитать структуру PDevBroadcastVolume.
    Путь \\?\STORAGE#RemovableMedia#7&18e1babe&0&RM#{53f5630a-b6bf-11d0-94f2-00a0c91efb8b} тоже можно получить через WM_DEVICECHANGE, правда пока еще не разобрался через какую структуру. Но это только когда "прибыло, блин". А желательно "когда захочу", как SetupDiGetInterfaceDeviceDetail, например...
  • Игорь Шевченко © (28.05.09 18:09) [5]
    Дмитрий   (28.05.09 13:11) [2]

    открывать надо не через GUID класса, а через GUID тома. Это разные GUID-ы.

    Пользоваться FindFirstVolume, FindNextVolume и т.п. функциями
    На худой конец посмотреть в реестре в HLKM\System\CurrentControlSet\MountedDevices - там все Volumes перечислены
  • Дмитрий (29.05.09 07:22) [6]
    Спасибо, будем пробовать.
  • Михаил (08.07.09 16:30) [7]
    Столкнулся с такой же проблемой.
    Если ещё актуально, то решилась она так:
    вместо '?' поставил знак '.', т.е.
    \\.\usb#vid_0000&pid_0000#00000000000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
    и всё заработало.
  • Дмитрий (13.07.09 09:30) [8]
    Пока на время отложил, но актуально :-) Попробую.
  • Дмитрий (31.07.09 08:14) [9]
    Попробовал. CreateFile возвращает хэндл. Вроде бы все хорошо, да, но : не читаются сектора у фешки.


    SetFilePointer(DevHandle, 512*CurrSector, nil, 0);
    ReadFile(DevHandle, a, sizeof(a), readed, nil);



    readed постоянно нулевой. Если в CreateFile подставляю \\?\STORAGE#RemovableMedia#7&18e1babe&0&RM#{53f5630a-b6bf-11d0-94f2-00a0c91efb8b} - все нормально.
 
Конференция "WinAPI" » USB Flash Drive + CreateFile() [D6, WinXP]
Есть новые Нет новых   [134434   +28][b:0][p:0.001]