2012-01-30 9 views
6

Zastanawiam się, czy ktoś może w ogóle pomóc, trochę problemu specjalistycznego.Zastąp sterownik Windows USB Class Driver niestandardowym sterownikiem?

Mam aplikację, która musi czytać i analizować wiele urządzeń USB (nie jednocześnie, każdy z nich jest uruchamiany w oddzielnych testach i teoretycznie może być uruchamiany na różnych urządzeniach).

Każde z urządzeń USB bazuje na klasie USB HID i są produkowane przez różne firmy, żadne z tych urządzeń USB nie jest zaprojektowane do pracy na komputerze, ale przeznaczone są dla innej platformy, jednak do celów testowanie urządzeń, które klient zażądał, aby aplikacja testowa była uruchamiana z komputera.

Niektóre urządzenia zostaną uruchomione, rozpoznane przez okna, które zainicjują je i uruchomią poprawnie, przy użyciu ogólnego sterownika klasy HID wbudowanego w okna, urządzenia zaczną wysyłać poprawne pakiety danych z testowanych danych.

Niektóre urządzenia zostaną uruchomione, będą rozpoznawane przez okna, które spróbują je uruchomić, ale nie zostaną całkowicie zainicjowane, pozostawiając je w stanie zainicjowanym w połowie. To jest w porządku, ponieważ mogę wykorzystać mój analizator protokołów Beagle do przechwytywania pakietów inicjalizacyjnych z platformy oryginalnej, a następnie użyć biblioteki LibUSBDotNet do replikacji pozostałych pakietów w sekwencji inicjalizacji i skłonić je do prawidłowego wysyłania pakietów.

Problem jaki mam jest związany z jednym konkretnym urządzeniem (chociaż jest ich jeszcze nie testowałem, więc jest całkiem możliwe, że jeden z nich może również wykazywać ten sam problem). Problem polega na tym, że sterownik klasy Windows HID rozpoznaje urządzenie i próbuje je zainicjować i uruchomić, działa to po pewnym czasie, a urządzenie rozpoczyna wysyłanie danych.

Problem polega na tym, że wysyłane dane różnią się od wysyłanych na platformę oryginalną (zawierającą tylko podzbiór pełnych danych). To tak, jakby system Windows zainicjował urządzenie w innym trybie.

Po przechwyceniu pakietów inicjalizacyjnych zarówno z komputera, jak i platformy za pomocą mojego analizatora protokołu USB, widzę, że system Windows wysyła nieco inne pakiety inicjalizacyjne. Użycie LibUSBDotNet do ponownego wysłania poprawnych pakietów po uruchomieniu systemu Windows wydaje się nie mieć żadnego efektu.

Mój problem polega na tym, że muszę zatrzymać system Windows przed próbą zainicjowania urządzenia przy użyciu standardowego sterownika klasy HID, próbowałem usunąć sterownik w Menedżerze urządzeń, ale nadal go inicjalizuje (a sterownik jest magicznie ponownie przypisywany w urządzeniu menedżer). Zrobiłem kilka badań i nie są możliwe alternatywy:

  1. stworzenia specjalnego sterownika, które okna będzie przypisany do konkretnego VID/PID urządzenia ale nie robi nic, to mogę używać LibUSBDotNet wysłać poprawny Inicjalizacja sekwencji do urządzenia z mojego własnego kodu.

  2. Zastosowanie coś WinUSB stworzyć odpowiedni sterownik dla urządzenia (ewentualnie stworzyć „martwy” sterownika podobnego 1.

Czy kierowca z konkretnego VID/PID zdefiniowano być wykorzystywane przez Windows zamiast wbudowanego sterownika USB HID? Jeśli nie, to traciłbym czas na tę trasę?

Uwaga, mój komputer Mac poprawnie inicjuje urządzenie powodujące problem, a ja zadałem pytanie klienta, czy aplikacja może zostać opracowana dla Maca, a ich odpowiedź była frustrująca tylko dla Windows.

Nie mam doświadczenia w pisaniu odpowiednich sterowników dla systemu Windows, chociaż mam doświadczenie w rozmowach z USB na stosunkowo niskim poziomie (więc część nie martwi się zbytnio). Czy ktokolwiek może zaproponować dobry sposób działania (zanim potencjalnie zmarnuję tygodnie, zastanawiając się, jak napisać sterowniki do komputera, tylko po to, aby znaleźć wybrany przeze mnie sposób działania, nie jest w stanie spełnić moich oczekiwań).

Każda pomoc lub sugestia bardzo ceniona.

Dzięki, Bogate


Dodane po wypróbowaniu sugestii poniżej:

Próbowałem za pomocą kreatora inf LibUsbDotNet stworzyć niezbędne pliki i zainstalować je i okazało się to do pracy - z pewnością urządzenie było teraz pojawia się w Menedżerze urządzeń jako urządzenie libusb-win32 - a nie urządzenie HID i powiązany sterownik to sterownik libusb. Nawet po wykonaniu tej czynności nadal wydaje się, że urządzenie zostało zainicjowane i rozpoczyna wysyłanie niewłaściwego rodzaju pakietów danych, chociaż teraz te pakiety nie są już obsługiwane przez sterownik klasy i są po prostu tracone.

Natknąłem się również na zadig, który ma podobnego kreatora infotworów dla WinUSB i miał dokładnie taki sam wynik.

Kolega zasugerował, że może to nie być samo okno, które przełącza urządzenie w ten tryb, a raczej urządzenie identyfikujące, że jest ono podłączone do komputera z systemem Windows i przełączające się w ten tryb. Podejrzewam, że tak jest, w którym to przypadku utknąłem - czas na kolejną rozmowę z klientem.

Wielkie dzięki za pomoc.

+1

Czy możesz sprawić, by to pytanie było bardziej zwięzłe? Wątpię, czy wiele osób przeczyta to wszystko. –

Odpowiedz

4

Używasz libusb-win32 jako sterownika filtra; oznacza to, że sterownik urządzenia HidUsb jest przypisany i załadowany dla twojego urządzenia, ale wtedy sterownik libusb-win32 jest załadowany na górze i daje ci nieograniczony dostęp do sprzętu.

Jeśli nie chcesz, aby sterownik HidUsb (lub inny sterownik klasy) wykonywał komunikację "w twoim imieniu", po prostu powiąż libusb-win32 jako sterownik urządzenia ze swoim sprzętem. W tym celu należy utworzyć plik .INF, który będzie kojarzył go z VID/PID/Revision każdego urządzenia USB. Jeśli dobrze pamiętam, libusb-win32 ma nawet narzędzie do generowania takich plików .INF.

Jeśli zainstalujesz ten plik .INF, np. z wersją PnpUtil.exe (dostępną w systemie Vista lub nowszym), nadal możesz napotkać problemy, które choć pasują lepiej niż ogólny sterownik HID, sterownik HID jest nadal wybrany.

Generyczny sterownik HID pasuje do urządzeń według ich zgodnych identyfikatorów (np. Przez klasę interfejsu USB), podczas gdy pasowałbyś do identyfikatorów sprzętowych (które mają wyższy priorytet). Jednak system Windows może dać pierwszeństwo innym aspektom, takim jak niepodpisany sterownik. Czytaj: How Windows Selects Drivers

Na szczęście, nawet w tym scenariuszu, podpisywanie sterowników z certyfikatem samoistnie (użyj CertUtil.exe, MakeCat.exe i SignTool.exe) nie jest zbyt trudne.

+0

Dzięki, jest tam bardzo dużo przydatnych informacji. Tak, używam filtra, który zainstalowałem przez LibUSBDotNet. Spróbuję, jak sugerujesz i zainstalujesz za pomocą pliku inf. Zbadam wszystkie twoje sugestie i dam ci znać, jak sobie radzę. –

+0

Zobacz powyższy komentarz powyżej, twoje rozwiązanie działa w taki sposób, że uniemożliwia załadowanie sterownika klasy i zatrzymuje późniejsze przetwarzanie przez sterownik klasy, niestety absolutne minimum, że Windows wymaga identyfikacji urządzenia i załadowania alternatywnego sterownika, wciąż wystarcza, aby wywołać problem . Dzięki za pomoc, było to bardzo przydatne ćwiczenie w poznawaniu sterowników urządzeń itp. –

+0

Na prostym urządzeniu, Windows robi tylko banalne "pobierz deskryptor urządzenia" i "uzyska deskryptor konfiguracji". Jeśli jest to urządzenie zespolone, uzyska się więcej deskryptorów. W żadnym wypadku system Windows nie odczytuje/zapisuje do punktów końcowych ani nie wykonuje dziwnych żądań sterowania na tym etapie. Kiedy mówisz "alternatywny sterownik", czy alternatywny sterownik faktycznie ładuje się do urządzenia, a jeśli tak, to jaki to jest sterownik? – Ilya