Форум: "WinAPI";
Текущий архив: 2011.07.17;
Скачать: [xml.tar.bz2];
ВнизUSB Flash Drive + CreateFile() Найти похожие ветки
← →
Дмитрий (2009-05-28 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... ?
← →
Игорь Шевченко © (2009-05-28 11:20) [1]через GUID тома открыть ?
например,
\\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\
← →
Дмитрий (2009-05-28 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_ © (2009-05-28 13:14) [3]А ты их через ZwCreateFile открывай а не через CreateFile
← →
Дмитрий (2009-05-28 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, например...
← →
Игорь Шевченко © (2009-05-28 18:09) [5]Дмитрий (28.05.09 13:11) [2]
открывать надо не через GUID класса, а через GUID тома. Это разные GUID-ы.
Пользоваться FindFirstVolume, FindNextVolume и т.п. функциями
На худой конец посмотреть в реестре в HLKM\System\CurrentControlSet\MountedDevices - там все Volumes перечислены
← →
Дмитрий (2009-05-29 07:22) [6]Спасибо, будем пробовать.
← →
Михаил (2009-07-08 16:30) [7]Столкнулся с такой же проблемой.
Если ещё актуально, то решилась она так:
вместо "?" поставил знак ".", т.е.
\\.\usb#vid_0000&pid_0000#00000000000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
и всё заработало.
← →
Дмитрий (2009-07-13 09:30) [8]Пока на время отложил, но актуально :-) Попробую.
← →
Дмитрий (2009-07-31 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} - все нормально.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2011.07.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c