Je suis un débutant qui apprend à écrire des pilotes de périphérique WDM pour les périphériques USB et a constaté que les documents disponibles sont trop difficiles à comprendre (le document en ligne DDK est l'un des plus difficiles à lire, et le livre de pilotes de périphérique WDM par Oney n'est pas '' rien de mieux).
Donc, j'ai une question simple. Par où commencer si je veux créer un périphérique USB virtuel (par exemple, une souris USB virtuelle qui ressemble à une vraie souris USB connectée à un port USB) pour tester/apprendre.
Jusqu'à présent, ce que je comprends, c'est que le pilote HIDClass (hidclass.sys) a un minidriver pour le bus USB (hidusb.sys) qui effectue l'énumération du matériel USB connecté. Donc, si je veux détourner le processus d'énumération matérielle et créer mon propre matériel virtuel, dois-je inclure un pilote de filtre quelque part pour intercepter certains IRP liés au processus d'énumération matérielle?
Désolé si ce qui précède n'a aucun sens, car je suis encore au stade de l'apprentissage et c'est en fait l'un des exercices qui, selon moi, pourrait m'aider à mieux écrire les pilotes de périphérique USB.
Windows utilise une architecture Plug and Play. Lorsque vous insérez un périphérique USB, il envoie une demande USB de bas niveau au périphérique, puis en fonction de la réponse d'un périphérique décide du pilote à charger. La correspondance est effectuée en comparant l'ID du fournisseur, l'ID du produit, etc. aux sections des fichiers inf. Les pilotes se présentent sous la forme d'un fichier xxx.sys compilé avec le fichier xxx.inf et sont chargés dans l'espace du noyau. Windows décide quel xxx.sys charger en fonction du fichier * .inf fourni avec le pilote du périphérique.
Ces fichiers ont des sections comme celle-ci:
[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 qui se trouve dans les fichiers inf
est disponible sur https://docs.Microsoft.com/en-us/windows-hardware/drivers/install/inf-manufacturer- section )
Un aperçu détaillé du processus d'énumération USB (Utiliser USB Logger):
Pour tout périphérique USB connecté, vous pouvez voir ces chaînes à l'aide du Gestionnaire de périphériques:
Par exemple, j'ai un périphérique de stockage USB avec Device Id = usb\class_08&subclass_06&prot_50
raccordé, et cette chaîne peut être mise en correspondance avec un .inf
fichier ajouté à la liste des périphériques connus après la première énumération. Ce fichier a une chaîne Service = USBSTOR
, et nous savons donc que usbstor.sys
est utilisé pour l'interface avec ce périphérique de stockage de masse USB.
Continuons avec le processus d'appariement.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
Pour le disque sur clé, vous pouvez voir quelque chose comme:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0781&Pid_5406\0775555ACA54ADE3]
"Service"="USBSTOR"
Pour écrire des pilotes, mon conseil est:
Utilisez Device Simulation Framework (DSF).
http://msdn.Microsoft.com/en-us/library/windows/hardware/gg454516.aspx
Vous pouvez utiliser le projet USB/IP pour émuler n'importe quel appareil de votre choix. Dans mon blog, j'ai montré comment émuler un 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
Cela ne vous aidera pas à comprendre comment créer le périphérique USB virtuel (le processus se fait dans le pilote USB/IP, vous pouvez lire le code), mais cela créera le périphérique USB HID virtuel et vous pourrez jouer avec les arguments HID envoyés au pilote USB.
Ne serait-il pas plus logique de fournir votre propre type de bus et votre propre énumérateur?