Tworzenie wirtualnego urządzenia USB

Jestem nowicjuszem uczącym się pisania sterowników urządzeń WDM dla urządzeń USB i odkryłem, że dostępne materiały są zbyt trudne do zrozumienia(DDK online doc jest jednym z najtrudniejszych do odczytania, a książka sterowników urządzeń WDM Oney nie jest niczym lepszym).

Więc mam proste pytanie. Od czego zacząć, jeśli chcę utworzyć wirtualne urządzenie USB (na przykład wirtualną mysz USB, która wygląda jak prawdziwa mysz USB podłączona do portu USB) dla testowanie/uczenie się.

Jak na razie to co rozumiem to sterownik HIDClass (hidclass.sys) posiada minidriver dla magistrali usb (hidusb.sys), który wykonuje wyliczenie dołączonego sprzętu USB. Tak więc, jeśli chcę przejąć proces wyliczania sprzętu i stworzyć swój własny wirtualny sprzęt, czy powinienem dołączyć gdzieś sterownik filtra do przechwytywania niektórych IRP związanych z procesem wyliczania sprzętu?

Przepraszam, jeśli powyższe nie ma sensu, ponieważ jestem jeszcze na etapie uczenia się i jest to w rzeczywistości jedno z ćwiczeń, które moim zdaniem może pomóc mi lepiej nauczyć się pisania sterowników urządzeń USB.

Author: JavaMan, 2011-02-16

4 answers

Windows używa architektury Plug and Play. Po włożeniu urządzenia USB wysyła żądanie USB niskiego poziomu do urządzenia, a następnie na podstawie odpowiedzi Urządzenia decyduje, który sterownik należy załadować. Dopasowanie odbywa się poprzez porównanie ID dostawcy, ID produktu i etc do sekcji plików inf. Sterowniki występują w formie skompilowanego xxx.sys z pliku xxx. inf i jest ładowany do przestrzeni jądra. Windows decyduje, które xxx.sys aby załadować na podstawie *.plik inf dostarczany ze sterownikiem urządzenia.

Te pliki mają sekcje takie jak:

[Manufacturer]
%Manufacturer% = DeviceInstall

[DeviceInstall]
"some usb dev"=OTHER_SECTION_DEV, USB\Vid_XXXX&Pid_yyyy

# This is where windows learns to match this information
# to your device, using the product id (Pid) and the 
# vendor id (Vid) that Windows gets back during the
# low level USB DeviceDescriptor request

[OTHER_SECTION_DEV]
CopyFiles = xxx.sys, 10,system32\drivers

(bardziej szczegółowy opis tego, co znajduje się w inf plikach można znaleźć na https://docs.microsoft.com/en-us/windows-hardware/drivers/install/inf-manufacturer-section)


[[8]} szczegółowe spojrzenie na proces wyliczenia USB (użyj LOGGERA USB):
  • Urządzenie USB podłączone
  • żądanie sterownika magistrali USB
    • GetDescriptor (Urządzenie)
    • GetDescriptor (Configuration)
    • GetDescriptor(String iSerialNumber), używany jako identyfikator instancji urządzenia
    • GetDescriptor (String iProduct), używany w wyskakujących okienkach "new Hardware been identified"]}
  • menedżer PNP (Plug and Play) jest informowany, że urządzenie zostało dodane przez kierowców autobusów.
  • [20]}następnie Menedżer PNP pyta kierowcę magistrali o informacje o urządzeniu, używając żądania PNP, prosząc o:
      DeviceID łańcuch, reprezentujący dostawcę USB i ID Produktu,
    • hardwareids string,
    • w przeciwieństwie do innych urządzeń USB, nie można ich używać.]}
    • InstanceID string, reprezentujący uid dla tego konkretnego urządzenia w zestawie wszystkich instancji o tym samym zgodnym id podłączonych do komputera.

Dla każdego podłączonego urządzenia USB można zobaczyć te ciągi za pomocą Menedżera urządzeń:

  • Otwórz Menedżera urządzeń (menu windows - > " Menedżer urządzeń "lub panel sterowania - > "System" - > "Sprzęt" - > " urządzenie Manager")
  • W tym celu należy użyć menu "Widok", aby przełączyć się na "urządzenie przez połączenie".]}
  • otwórz " ACPI [...] "- >"PCI bus"/"pci Express Root Complex" ->" [...] USB [...] Host Controller "
  • rozwiń dowolny z wpisów pod kontrolerem hosta, a dla dowolnego z wymienionych urządzeń kliknij prawym przyciskiem myszy, aby uzyskać ich właściwości, otwórz kartę "Szczegóły", a następnie użyj rozwijanego menu Właściwości, aby znaleźć "identyfikatory sprzętu"," kompatybilne identyfikatory", "identyfikator wystąpienia urządzenia"," pasujący identyfikator urządzenia", " usługa", itd.

Na przykład mam podłączone urządzenie pamięci masowej USB z Device Id = usb\class_08&subclass_06&prot_50 i ten ciąg można dopasować do pliku .inf, który został dodany do listy znanych urządzeń po pierwszym wyliczeniu. Ten plik ma ciąg znaków Service = USBSTOR, więc wiemy, że {[6] } jest używany do interfejsu z tym urządzeniem pamięci masowej USB.

Kontynuujmy proces dopasowywania.

  • menedżer PNP próbuje ustalić, czy urządzenie było już " zainstalowane":
    • przeszukuje rejestr pod kątem klucz pasujący do "DeviceInstance ID", aby sprawdzić, która usługa obsługuje połączenie z tym urządzeniem. W szczególności szuka tego w HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB

Dla dysku na kluczu można zobaczyć coś w stylu:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0781&Pid_5406\0775555ACA54ADE3]
"Service"="USBSTOR"
  • menedżer PNP następnie ładuje skojarzony sterownik na podstawie dopasowania między łańcuchami w żądaniach PNP i danymi z .baza inf:
    • baza inf znajduje się pod: C:\WINDOWS\inf\
    • Kierowcy .pliki sys zlokalizowane: C:\WINDOWS\system32\drivers
  • jeśli PNP nie może znaleźć pasującego ciągu, otrzymasz monit pokazujący ścieżkę do xxx.sys i xxx. inf

  • Do pisania sterowników moja rada brzmi:

    1. Nie zaczynaj od implementacji urządzeń HID (human interface device), ponieważ możesz spowodować, że system windows będzie używał niestandardowego sterownika myszy lub klawiatury zamiast oryginalnego sterownika, co spowoduje wyłączenie myszy lub klawiatury, bardzo niebezpieczne.
    2. Nie ładuj sterowników do twoja dev machine:
      1. użyj maszyny wirtualnej i zainstaluj tam swoje sterowniki. Skonfiguruj debugger jądra dla swojej maszyny wirtualnej: http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
      2. lub załadować sterowniki na inną maszynę testową.
    3. [20]}dobrą platformą edukacyjną dla sterowników USB jest "OSR USB-FX2 Learning Kit" [21]}
     17
    Author: Alex.Salnikov,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2018-04-19 22:26:44
     4
    Author: Amir Saniyan,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2012-12-13 17:30:55

    Możesz użyć projektu USB/IP do emulowania dowolnego urządzenia, które chcesz. Na blogu zademonstrowałem jak emulować mysz USB w Pythonie używając projektu USB / IP: http://breaking-the-system.blogspot.com/2014/08/emulating-usb-devices-in-python-with-no.html

    To nie pomoże Ci zrozumieć, jak utworzyć wirtualne urządzenie USB (proces odbywa się w sterowniku USB / IP, możesz przeczytać kod), ale stworzy wirtualne urządzenie USB HID i możesz grać z HID argumenty wysyłane do sterownika USB.

     2
    Author: Yaron Shani,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2014-08-30 10:54:54

    Czy nie byłoby sensu, aby zapewnić własny typ autobusu i wyliczenie?

     1
    Author: Simon Richter,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2011-02-16 12:27:36