Peuvent le port USB physique être identifié par programmation d'un périphérique dans Windows?
J'ai un périphérique USB qui énumère avec une interface différente, VID, le PID et le numéro de série lorsque le commandement de le faire, et je tiens à garder une trace de la physique de l'appareil après ce changement se produit. Ma pensée a été suivi par son moyeu et l'emplacement du port.
La Win32_PnPSignedDriver classe a un champ "Emplacement" qui semblait parfait (par exemple Port_#0001.Hub_#0010
), mais qui ne contient que l'emplacement de l'appareil lorsque le pilote a d'abord été chargé. Brancher le matériel dans un autre port n'a pas de mise à jour de ce champ.
Toutefois, l'information est disponible quelque part parce qu'il est un "Lieu d'informations" terrain sous l'onglet "Détails" lors de l'affichage de l'appareil via le Gestionnaire de Périphériques. Cette information peut-elle être récupérer par le biais de Requêtes WMI ou une autre méthode? Est-il une meilleure approche pour résoudre ce problème?
EDIT: je sais que cela sonne comme une étrange scénario. Le microcontrôleur dans ces dispositifs contient une ROM qui énumère comme un CDC périphérique (port série) et permet la programmation. Au cours de la fabrication, il serait bénéfique de suivre un appareil comme il change entre le fabricant de la ROM (unique VID/PID/numéro de série) et mon custom firmware interface (différents VID/PID/numéro de série).
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
. Je vais écrire une réponse une fois que je le vérifie.On pourrait s'attendre à ce que, depuis la non-API WMI est nommé
SetupDiGetDeviceRegistryProperty
Ressemble à la LocationInformation dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB n'est pas mis à jour lorsque l'appareil est branché sur un autre port, soit
OriginalL'auteur Judge Maygarden | 2011-06-20
Vous devez vous connecter pour publier un commentaire.
Je sais qu'il a été un certain temps étant donné que toute activité sur cette réponse, mais je suis en train de travailler sur un projet qui nécessite une fonctionnalité similaire à la sat, et je peux vous dire que c'est tout à fait possible. Aussi loin que je peux dire, il ne nécessite que la DDK et PInvoke, il n'y a pas de C# ou de l'interface WMI pour cette information. Il exige que le faible niveau du concentrateur USB racine appareils et envoyant directement conducteur commandes IOCTL.
La bonne nouvelle, c'est que Microsoft fournit un exemple d'application C++ qui a complètement énumère tous les périphériques USB et montre exactement les ports sur lesquels ils sont connectés. Cette application est le USBView exemple d'application.
Je pense que vous trouverez si vous compilez et exécutez cette application, vous verrez qu'il vous montre exactement où votre appareil est branché, et si vous brancher n'importe quel appareil dans le port, il se présente au même endroit. Peut-être il pourrait être plus facile si vous créez un le C++ DLL qui fournit quelques appels de votre application en C# peuvent utiliser pour obtenir les informations dont il a besoin.
Il a ceci à dire à propos de la "EnumerateHubPorts()" dans son code:
Afin de donner une idée de tout ce que l'exige (tout doit être énumérés en commençant par le haut, même si vous n'êtes intéressé que par un seul port), ici, les commentaires sont affichés en haut de l'enum.c fichier dans le code:
OriginalL'auteur bbyam
Avez-vous essayé SetupDi?
Vous pouvez utiliser la classe SetupDi de la fonction de l'API pour obtenir des informations de DeviceManager.
Est-il un particulier SetupDi interface qui expose cette information de qui vous êtes au courant?
Je pense que vous aurez besoin de faire appel à quelques SetupDi de l'API pour obtenir cette information. un. Énumérer les périphériques disponibles pour une classe de Périphérique USB ( appareil de classe dans votre cas). Énumérer à l'aide de SetupDiGetClassDevs méthode. Puis itérer sur cette collection à l'aide de la SetupDiEnumDeviceInfo API et puis, pour chacun de cet appareil l'appareil concerné propriété à l'aide de SetupDiGetDeviceRegistryProperty API. Les propriétés de registre enum est disponible à l'adresse pinvoke.net/default.aspx/Enums/SPDRP%20.html
Le SPDRP de la valeur pour les informations de localisation sont 0x0000000D et GUID de classe du Périphérique USB Périphérique de classe est 36FC9E60-C465-11CF-8056-444553540000
OriginalL'auteur Avinash Agarwal
"L'Emplacement de l'information" sous le gestionnaire de périphériques est exactement la même chaîne de caractères que vous avez obtenu à l'aide de WMI.
Avez-vous envisagé que lorsque l'appareil est branché sur un port différent, au lieu de mettre à jour les métadonnées avec le nouvel emplacement, Windows crée une nouvelle instance de pilote et de nouvelles métadonnées. Essayez de filtrer les
Win32_PnPDevice
des instances de l'objet pour seulement celles qui sont actuellement branchés, et je pense que vous trouverez les informations de localisation actuelle.Par exemple, si je déplace ma souris USB à un autre port, il y a une copie de la souris associés avec le vieux-port encore répertorié sous le Gestionnaire de Périphériques, il est juste caché par défaut. Voir http://oreilly.com/pub/h/3105 pour obtenir des instructions pour afficher ces périphériques déconnectés. Ou exécuter les opérations suivantes à partir d'une invite de commandes administrateur élevée:
Sujet intéressant. @Le juge: votre commentaire ci-dessus être causés par les ports USB résidant sur le même hub USB? Je suis très hors de mon élément ici, mais je trouve le sujet très intéressant.
ne vous aidera pas de toute façon, car il peut y avoir plusieurs instances de périphériques en utilisant le même pilote.
OK, ça a du sens. Merci.
OriginalL'auteur Ben Voigt
Du mieux que je peux dire, en corrélation d'un périphérique USB avec un port physique n'est pas possible dans Windows. Sentez-vous svp libre pour me prouver le contraire.
CM_foo_bar
) Si le gestionnaire de périphériques ne ensuite, il doit être possible...Pourquoi est-ce l'répondu à répondre?
Car il est vrai en 2012?
OriginalL'auteur Judge Maygarden
Une meilleure Idée sera d'utiliser le numéro de série Unique de l'appareil USB.
Je m'excuse si le commentaire est venu à travers comme impoli. J'etais en train de taper dans un pressé car je suis sûr que vous devez avoir fait ainsi. L'appareil possède un numéro de série, mais la VID, le PID et le numéro de série va changer et j'ai besoin de suivre le périphérique physique lorsque cela se produit.
Avec le recul, je ne pense pas que mon commentaire était impoli. Je ne sais toujours pas comment récupérer la clé USB numéro de série à partir d'un périphérique. C'est une question valable. Oui, tous les périphériques USB, mais je ne sais pas d'un banal moyen de le récupérer dans Windows.
Si vous décidez de l'utiliser un numéro de série, essayez de ceci. Mais si votre nouveau dénombrement (mise à jour du firmware?) change le numéro de série ainsi que la VID/PID ensuite, ce qui n'aidera pas.
OriginalL'auteur Alphaneo