Création D'un périphérique USB virtuel

je suis un internaute débutant qui apprend à écrire les pilotes de périphériques WDM pour les périphériques USB et j'ai découvert que les documents disponibles sont trop difficiles à comprendre (le DDK online doc est l'un des plus difficiles à lire, et le carnet de pilotes de périphériques WDM par Oney n'est rien de mieux).

Donc, j'ai une question simple. Où dois-je commencer si je veux créer un périphérique USB virtuel (par exemple, une souris USB virtuelle qui ressemble à une vraie souris USB attachée à un port USB) pour tests/apprentissage.

Jusqu'à présent, ce que je comprends c'est le conducteur de HIDClass (hidclass.sys) dispose d'un minidriver pour le bus usb (hidusb.sys) qui effectue l'énumération du matériel USB attaché. Donc, si je veux détourner le processus d'énumération du matériel et créer mon propre matériel virtuel, devrais-je inclure un pilote de filtre quelque part pour intercepter certains IRP liés au processus d'énumération du matériel?

Désolé si ce qui précède ne fait pas de sens du tout, car je suis encore dans le étape d'apprentissage et c'est en fait l'un des exercices je pense que pourrait m'aider à apprendre sur l'écriture USB périphériques pilotes mieux.

17
demandé sur JavaMan 2011-02-16 15:22:31

4 réponses

Windows utilise une Architecture Plug And Play. Lorsque vous insérez un périphérique USB, il envoie une requête USB de bas niveau au périphérique et ensuite en fonction de la réponse d'un périphérique décide quel pilote charger. L'appariement est fait en comparant l'id du fournisseur, l'id du produit et etc aux sections de fichiers inf. Les pilotes viennent sous la forme d'une compilation xxx.sys avec xxx.le fichier inf est chargé dans l'espace du noyau. Windows décide qui xxx.sys à charger sur la base du *.fichier inf qui vient avec l'appareil pilote.

Ces fichiers ont des sections comme ceci:

[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

(une description plus détaillée de ce qu'il y a dans inf fichiers peuvent être trouvés sur https://docs.microsoft.com/en-us/windows-hardware/drivers/install/inf-manufacturer-section)


Un regard détaillé sur les USB processus d'énumération (USB Enregistreur):

  • périphérique USB branché
  • pilote de Bus USB Demande
    • GetDescriptor (Device)
    • Getdescriptor (Configuration)
    • GetDescriptor( String iSerialNumber), utilisé comme ID D'Instance de périphérique
    • GetDescriptor(String iProduct), utilisé dans le "nouveau Matériel été identifiés" popups
  • le gestionnaire PNP (Plug and Play) est informé qu'un périphérique a été ajouté par les pilotes de bus.
  • le gestionnaire PNP demande alors au conducteur de bus des informations sur le périphérique en utilisant un Demande du PNP, demandant:
    • chaîne DeviceID, représentant le vendeur USB et L'ID du produit,
    • HardwareIDs chaîne,
    • CompatibleIDs chaîne, représentant USB périphérique d'Interface de la Classe, sous-classe et au Protocole, et
    • chaîne InstanceID, représentant l'uid pour ce périphérique particulier dans le jeu de toutes les instances avec le même id compatible relié à l'ordinateur.

pour tout périphérique USB connecté vous pouvez voir ces chaînes en utilisant le Gestionnaire de périphériques:

  • Ouvrir le Gestionnaire de Périphériques (windows menu -> "gestionnaire de périphériques", ou panneau de configuration -> "Système" -> "Matériel" -> "Gestionnaire de Périphériques")
  • puis utilisez le menu" view "pour passer à " Device by Connection"
  • ouvrir " ACPI [...] "- >"PCI bus"/"PCI Express Root Complex" ->" [...] USB.[ ..] Contrôleur Hôte"
  • développez une des entrées du contrôleur de l'hôte, et pour tous les dispositifs liste, faites un clic droit pour obtenir leurs propriétés, ouvrez l'onglet "détails", puis utiliser la propriété de menu déroulant pour trouver "Hardware Id", "Id Compatibles", "ID d'Instance de Périphérique", "Matching Device Id", "Service", etc.

par exemple, j'ai un périphérique de stockage USB avec Device Id = usb\class_08&subclass_06&prot_50 accroché, et cette chaîne peut être apparié à un .inf fichier qui a été ajouté à la liste des dispositifs connus après la première énumération. Ce fichier est une chaîne de caractères Service = USBSTOR, et donc, nous savons que usbstor.sys est utilisé pour interface avec ce périphérique de stockage de masse USB.

continuons le processus d'appariement.

  • le gestionnaire PNP tente de déterminer si L'appareil était déjà "installé"":
    • il recherche dans le registre une clé correspondant au "DeviceInstance ID" pour voir quel service traite l'interfaçage avec cet appareil. En particulier, il Recherche ceci dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB

Pour le disque sur la touche, vous pouvez voir quelque chose comme:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0781&Pid_540675555ACA54ADE3]
"Service"="USBSTOR"
  • le gestionnaire PNP charge alors le pilote associé sur la base d'une correspondance entre les chaînes des requêtes PNP et les données de la .base de données inf:
    • base de données inf situé sous: C:\WINDOWS\inf\
    • pilotes .fichiers sys localisés: C:\WINDOWS\system32\drivers
  • si PNP ne trouve pas la chaîne correspondante, vous obtiendrez l'invite pour afficher un chemin vers xxx.sys et xxx.inf

pour l'écriture de pilotes de mon conseil est le suivant:

  1. ne commencez pas par implémenter des périphériques HID (human interface device), parce que vous pouvez faire utiliser votre pilote personnalisé par windows pour vous à la souris ou au clavier au lieu du pilote d'origine, cela désactivera votre souris ou votre clavier, très dangereux.
  2. ne chargez pas les pilotes dans votre machine dev:
    1. utilisez une machine virtuelle et installez vos pilotes là. Configurer un débogueur de noyau pour votre machine virtuelle: http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
    2. ou charger les conducteurs sur une autre machine d'essai.
  3. une bonne plateforme d'apprentissage pour les pilotes USB est "OSR USB-FX2 Learning Kit"
17
répondu Alex.Salnikov 2018-04-19 22:26:44

utiliser le cadre de Simulation des dispositifs (DSF).

http://msdn.microsoft.com/en-us/library/windows/hardware/gg454516.aspx

4
répondu Amir Saniyan 2012-12-13 17:30:55

vous pouvez utiliser le projet USB/IP pour émuler n'importe quel périphérique que vous voulez. Dans mon blog, j'ai montré comment émuler périphérique de souris USB en python en utilisant le projet USB / IP: http://breaking-the-system.blogspot.com/2014/08/emulating-usb-devices-in-python-with-no.html

il ne vous aidera pas à comprendre comment créer le périphérique USB virtuel (le processus est fait dans le pilote USB/IP, vous pouvez lire le code), mais il va créer le périphérique USB virtuel et vous pouvez jouer avec les arguments HID envoyés au pilote USB.

2
répondu Yaron Shani 2014-08-30 10:54:54

ne serait-il pas plus logique de fournir votre propre type d'autobus et votre propre recenseur?

1
répondu Simon Richter 2011-02-16 12:27:36