![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Добрый вечер всем.
Есть такой девайс http://www.masterkit.ru/main/set.php?code_id=573112 В "комплекте" есть программа, но хочется переделать под себя. Windows при подключении говорит что оборудование установлено, драйвера нашлись. Для начала как его увидеть из своей проги? Возможно кто то любопытный уже занимался с таким чудом. Собранно устройство на микроконтроллер ATtiny45. Последний раз редактировалось fofka, 06.11.2012 в 19:18. |
#2
|
|||
|
|||
![]() с учетом того что силовых элементов там все равно нет проще и дешесле это сделать на банальном LPT порту
|
#3
|
||||
|
||||
![]() С ЮСБшником этим попробуй как с ком портом поработать.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 06.11.2012 в 21:39. |
#4
|
||||
|
||||
![]() Цитата:
Посмотри на девайс в диспетчере устройств винды. Если оно HID (Human Interface Device) - напишу, как работать с HID'ами. В противном случае только реверс изначальной проги. Да и в случае HID'а протокол придется восстанавливать. UPD: Судя по некоторым названиям функций, оно-таки HID, притом писали на делфе с использованием некого компонента. Поищи его (что-то вроде Jvhidcontrollerclass). Цитата:
UPD2: Видимо чтение так: Код:
bool __fastcall Jvhidcontrollerclass::TJvHidDevice::ReadFile(int a1, LPVOID lpBuffer, DWORD a3, LPDWORD lpNumberOfBytesRead) { void *v4; // edi@1 int v5; // esi@1 bool v6; // ebx@1 DWORD nNumberOfBytesToRead; // [sp+Ch] [bp-4h]@1 nNumberOfBytesToRead = a3; v4 = lpBuffer; v5 = a1; v6 = 0; if ( (unsigned __int8)Jvhidcontrollerclass::TJvHidDevice::OpenFile(a1) ) v6 = (unsigned int)ReadFile(*(HANDLE *)(v5 + 12), v4, nNumberOfBytesToRead, lpNumberOfBytesRead, 0) >= 1; return v6; } jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 06.11.2012 в 22:09. |
#5
|
||||
|
||||
![]() Bargest, в диспетчере при подключении появляется еще один Human Interface Device. Так что если подскажите как работать с usb буду благодарен. Попробовал "exe" декомпилировать, в приложении.
|
#6
|
||||
|
||||
![]() Раз оно HID - варианта два. Первый - использовать ту же библиотеку, что юзают разработчики (Jvhidcontrollerclass). Тут придется реверсить способ работы с этим компонентом (т.к. я особо по нему ничего в гугле не нашел, хотя не особо искал) и протокол.
Второй: Код:
procedure TfrmMultiMeter.tbConnectClick(Sender: TObject); var devSet: integer; i, uBytes: integer; spdt: SP_DEVICE_INTERFACE_DATA; begin if connected then begin MessageBoxA(0, 'Вы уже подключены к устройству.', 'Ошибка!', 0); exit; end; hHid := LoadLibrary('Hid.dll'); if hHid = 0 then begin MessageBoxA(0, 'Не удалось загрузить библиотеку Hid.dll', 'Ошибка!', 0); exit; end; hSetupAPI := LoadLibrary('SetupAPI.dll'); if hSetupAPI = 0 then begin DoDisconnect(); MessageBoxA(0, 'Не удалось загрузить библиотеку SetupAPI.dll', 'Ошибка!', 0); exit; end; HidD_GetHidGuid := GetProcAddress(hHid, 'HidD_GetHidGuid'); SetupDiGetClassDevsA := GetProcAddress(hSetupAPI, 'SetupDiGetClassDevsA'); SetupDiDestroyDeviceInfoList := GetProcAddress(hSetupAPI, 'SetupDiDestroyDeviceInfoList'); SetupDiEnumDeviceInterfaces := GetProcAddress(hSetupAPI, 'SetupDiEnumDeviceInterfaces'); SetupDiGetDeviceInterfaceDetailA := GetProcAddress(hSetupAPI, 'SetupDiGetDeviceInterfaceDetailA'); if (not assigned(HidD_GetHidGuid)) or (not assigned(SetupDiGetClassDevsA)) or (not assigned(SetupDiDestroyDeviceInfoList)) or (not assigned(SetupDiEnumDeviceInterfaces)) or (not assigned(SetupDiGetDeviceInterfaceDetailA)) then begin DoDisconnect(); MessageBoxA(0, 'Не удалось получить адрес функции.', 'Ошибка!', 0); exit; end; HidD_GetHidGuid(@Hg); devSet := SetupDiGetClassDevsA(@Hg, 0, 0, $12); if devSet = -1 then begin DoDisconnect(); MessageBoxA(0, 'Не получен список устройств.', 'Ошибка!', 0); exit; end; i := 0; spdt.cbSize := sizeof(spdt); while SetupDiEnumDeviceInterfaces(devSet, 0, @Hg, i, @spdt) do begin SetupDiGetDeviceInterfaceDetailA(devSet, @spdt, 0, 0, @uBytes, 0); if (uBytes <> 0) and (GetLastError() = 122) then begin GetMem(pSpDDT, uBytes); pSpDDT^.cbSize := 5; SetupDiGetDeviceInterfaceDetailA(devSet, @spdt, pSpDDT, uBytes, @uBytes, 0); if (pos('vid_0483&pid_5750', PAnsiChar(@(pSpDDT^.DevicePath))) <> 0) then break; FreeMem(pSpDDT); pSpDDT := 0; end; inc(i); end; SetupDiDestroyDeviceInfoList(devSet); if pSpDDT = nil then begin DoDisconnect(); MessageBoxA(0, 'Устройство vid_0483&pid_5750 не найдено.', 'Ошибка!', 0); exit; end; hMM := CreateFileA(PAnsiChar(@(pSpDDT^.DevicePath)), GENERIC_READ or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); if hMM = 0 then begin DoDisconnect(); MessageBoxA(0, 'Не удалось открыть устройство.', 'Ошибка!', 0); exit; end; hEvt := CreateEvent(0, true, false, 0); ResetEvent(hEvt); ovlp.Offset := 0; ovlp.OffsetHigh := 0; ovlp.hEvent := hEvt; reading := false; connected := true; tmRead.Enabled := true; end; Дальше все просто: чтение - ReadFile, запись - WriteFile, закрытие - CloseHandle. Тут опять же придется реверсить протокол обмена. Можно попробовать какой-нибудь USB-сниффер или реверсить код. Я бы со снифферами не связывался. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 07.11.2012 в 14:11. |