-
Доброго времени суток, мастера ! Пытаюсь открыть нужный мне (из нескольких подключенных) 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... ?
-
через GUID тома открыть ? например, \\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\
-
Пробовал открывать \\?\Volume{A5DCBF10-6530-11D2-901F-00C04FB951ED}\ (GUID_CLASS_USB_DEVICE) \\?\Volume{4D36E967-E325-11CE-BFC1-08002BE10318}\ (GUID_DEVCLASS_DISKDRIVE), результат - INVALID_HANDLE_VALUE.
-
А ты их через ZwCreateFile открывай а не через CreateFile
-
Попробую. Но пока не понимаю, как откроется нужный мне флэш драйв (с заранее известным 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 13:11) [2]
открывать надо не через GUID класса, а через GUID тома. Это разные GUID-ы.
Пользоваться FindFirstVolume, FindNextVolume и т.п. функциями На худой конец посмотреть в реестре в HLKM\System\CurrentControlSet\MountedDevices - там все Volumes перечислены
-
Спасибо, будем пробовать.
-
Столкнулся с такой же проблемой. Если ещё актуально, то решилась она так: вместо '?' поставил знак '.', т.е. \\.\usb#vid_0000&pid_0000#00000000000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed} и всё заработало.
-
Пока на время отложил, но актуально :-) Попробую.
-
Попробовал. 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} - все нормально.
|