Remplacez Windows USB Class Driver par un pilote personnalisé?

Je me demande si quelqu’un peut aider, un problème un peu particulier.

J’ai une application qui doit lire et parsingr un certain nombre de périphériques USB (pas simultanément, ils sont chacun exécutés dans des tests séparés et pourraient en théorie être exécutés sur des machines différentes).

Chacun des périphériques USB est basé sur la classe USB HID et est fabriqué par différentes sociétés. Aucun de ces périphériques USB n’est conçu pour être exécuté sur PC, mais pour une plate-forme différente, mais pour tester les périphériques le client a demandé que l’application de test soit exécutée à partir d’un PC.

Certains des périphériques démarreront, seront reconnus par des fenêtres qui s’initialiseront et les démarreront correctement à l’aide du pilote de classe HID générique intégré à Windows, les périphériques commenceront alors à envoyer des paquets de données corrects des données à tester.

Certains appareils démarreront, seront reconnus par Windows qui tenteront de les démarrer mais ne les initialiseront pas complètement en les laissant dans un état à demi initialisé. C’est bien, car je peux utiliser mon parsingur de protocole beagle pour capturer les paquets d’initialisation de la plate-forme d’origine, puis utiliser la bibliothèque LibUSBDotNet pour répliquer les paquets restants dans la séquence d’initialisation et les envoyer correctement.

Le problème que j’éprouve concerne un périphérique en particulier (même s’il y en a d’autres que je n’ai pas encore testés, il est fort possible que l’un d’entre eux présente le même problème). Le problème est que le pilote de classe Windows HID reconnaît le périphérique et essaie de l’initialiser et de le démarrer, cela fonctionne après un certain mode et le périphérique commence à envoyer des données.

Le problème est que les données envoyées sont différentes de celles envoyées à la plate-forme d’origine (ne contenant qu’un sous-ensemble des données complètes). C’est comme si Windows avait initialisé l’appareil dans un mode différent.

Lorsque je capture les paquets d’initialisation à partir du PC et de la plate-forme d’origine à l’aide de mon parsingur de protocole USB, je constate que Windows envoie des paquets d’initialisation légèrement différents. Utiliser LibUSBDotNet pour renvoyer les paquets corrects une fois que Windows a déjà démarré, le périphérique ne semble pas avoir d’effet.

Mon problème est que je dois arrêter Windows d’essayer d’initialiser le périphérique en utilisant le pilote de classe HID standard, j’ai essayé de supprimer le pilote dans le Gestionnaire de périphériques mais il l’initialise toujours (et le pilote est réatsortingbué par magie dans le gestionnaire de périphériques). J’ai fait des recherches et il y a des alternatives possibles:

  1. Créer un pilote spécifique que Windows assignera au VID / PID particulier de l’appareil mais qui ne fait rien, alors je peux utiliser LibUSBDotNet pour envoyer la séquence d’initialisation correcte à l’appareil depuis mon propre code.

  2. Utilisez quelque chose comme WinUSB pour créer un pilote approprié pour le périphérique (ou éventuellement pour créer un pilote “mort” tel que 1).

Un pilote avec un VID / PID spécifique défini sera-t-il utilisé par Windows de préférence à son pilote de classe HID USB intégré? Si ce n’est pas le cas, je perdrais mon temps à parcourir cette route?

Notez que mon Mac initialise correctement le périphérique à problème, et j’ai demandé au client si l’application pouvait être développée pour Mac et que leur réponse était frustrante pour Windows uniquement.

Je n’ai aucune expérience dans l’écriture de pilotes Windows appropriés, bien que j’aie de l’expérience avec un port USB à un niveau relativement bas (pour que cette partie ne vous inquiète pas trop). Quelqu’un peut-il suggérer une bonne ligne de conduite (avant de perdre des semaines à étudier comment écrire des pilotes pour le PC uniquement pour trouver que mon plan d’action sélectionné ne peut pas fournir ce que j’ai besoin).

Toute aide ou suggestion très appréciée.

Merci, Rich


Ajouté après avoir essayé les suggestions ci-dessous:

J’ai essayé d’utiliser l’assistant d’inf LibUsbDotNet pour créer les fichiers nécessaires et les installer. Cela semblait fonctionner – le périphérique apparaissait certainement dans le Gestionnaire de périphériques en tant que périphérique libusb-win32 – et non pas le pilote libusb. Même après cela, le périphérique semble toujours être initialisé et commence à envoyer le mauvais type de paquets de données, bien que ces paquets ne soient plus gérés par le pilote de classe et soient simplement perdus.

Je suis également tombé sur Zadig qui a un assistant de création inf similaire pour WinUSB et qui a exactement le même résultat.

Un collègue a suggéré que ce n’est peut-être pas Windows lui-même qui fait basculer l’appareil dans ce mode, plutôt que l’appareil identifie qu’il est connecté à une machine Windows et passe automatiquement dans ce mode. Je soupçonne que c’est le cas, auquel cas je suis coincé – le temps d’avoir une autre conversation avec le client.

Merci beaucoup pour l’aide.

    Vous utilisez libusb-win32 comme pilote de filtre; c’est-à-dire que le pilote de périphérique HidUsb est affecté et chargé pour votre périphérique, mais que le pilote libusb-win32 est chargé sur le dessus et vous donne un access sans entraves au matériel.

    Si vous ne voulez pas qu’un HidUsb (ou tout autre pilote de classe) effectue une communication “en votre nom”, associez simplement libusb-win32 en tant que pilote de périphérique à votre matériel. Pour cela, vous devez créer un fichier .INF l’associant au VID / PID / Révision de chaque périphérique USB. Si je me souviens bien, libusb-win32 est même livré avec un utilitaire pour générer de tels fichiers .INF.

    Si vous installez ce fichier .INF, par exemple avec PnpUtil.exe (disponible sous Vista ou supérieur), vous risquez de rencontrer des problèmes où, même si vous êtes mieux que le pilote HID générique, le pilote HID est toujours sélectionné.

    Le pilote HID générique fait correspondre les périphériques par leurs identifiants compatibles (c’est-à-dire par une classe d’interface USB) lorsque vous faites correspondre les identifiants matériels (qui ont une priorité plus élevée). Cependant, Windows peut donner la priorité à d’autres aspects, tels que votre pilote non signé. Lire: Comment Windows sélectionne les pilotes

    Heureusement, même dans ce scénario, la signature de pilotes avec un certificate auto-généré (utilisez CertUtil.exe , MakeCat.exe et SignTool.exe ) n’est pas trop difficile.