2009-07-27 10 views
3

Comment passer d'une lettre de lecteur à un ID d'instance de périphérique?Lettre de lecteur à l'ID d'instance de périphérique

Mon processus commence par un message d'arrivée de périphérique. J'ai réussi à obtenir la lettre de lecteur à partir du message d'arrivée et en ouvrant le plateau de DVD. J'ai recherché les différents éléments de l'API d'installation; mais je n'ai rien trouvé qui m'amène d'une lettre de lecteur à un ID d'instance de périphérique. Une solution en C# ou VB.NET serait idéale, mais je suis prêt à la comprendre à partir de n'importe quelle autre langue tant que je peux voir les appels API.

Merci d'avance ...

Répondre

4

Vous ne pouvez pas le faire directement.

Le lien doit utiliser STORAGE_DEVICE_NUMBER. Vous pouvez utiliser DeviceIoControl avec IOCTL_STORAGE_GET_DEVICE_NUMBER sur le nom de votre périphérique pour remplir cette structure. Mettez cette valeur d'un côté.
Vous devez ensuite obtenir des informations sur votre système à l'aide de SetupDiGetClassDevs en définissant le GUID comme étant approprié, en indiquant les lecteurs qui vous intéressent. Ensuite, enumérer les périphériques en utilisant SetupDiEnumDeviceInfo. Puis énumérer les interfaces en utilisant SetupDiEnumDeviceInterfaces et enfin obtenir l'information en utilisant SetupDiGetDeviceInterfaceDetail. Dans cette structure retournée, vous pouvez obtenir un DevicePath que vous pouvez utiliser pour obtenir le STORAGE_DEVICE_NUMBER comme ci-dessus. Faites correspondre cela avec le STORAGE_DEVICE_NUMBER de votre lettre de lecteur, et vous avez maintenant lié une lettre de pilote à votre structure. Phew! À l'intérieur de cette structure est un DevInst.

1

Je sais qu'il est tard pour vous maintenant, mais pas pour tout le monde ^^

J'ai eu le même besoin et c'est la ligne principale de la façon dont je l'ai fait:

-Vous avez besoin d'une fenêtre pour recevoir l'arrivée de l'appareil et le retrait (comme vous le dites)

-Alors vous créez un DeviceNotificationFilter initié à dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE

-Alors dans la boucle de message de votre fenêtre, vous recherchez VM_DEVICECHANGE

-Quand vous le recevez si wParam == DBT_DEVICEARRIVAL, utilisez le lParam pour vérifier s'il s'agit d'un DBT_DEVTYPE_VOLUME (j'obtenais la lettre et le type du lecteur ici) ou un DBT_DEVTYPE_DEVICEINTERFACE (là vous pouvez utiliser votre lParam wellcasted récupère l'InstanceId de la structure d'entrée).

Lorsque vous connectez un lecteur, vous recevez d'abord DEVINTERFACE puis l'autre. Je donne seulement la ligne principale car je l'ai fait il y a longtemps et je n'ai pas le code ici, et aussi j'avais trouvé beaucoup de morceaux de code sur le net (il y a longtemps donc il devrait y avoir plus maintenant ^^^) msdn peut-être donner un exemple de code complet pour le faire maintenant.

Si vous lisez ceci et avez besoin de plus d'informations, je vais répondre ou faire une réponse complète documentée si beaucoup en ont besoin.

J'espère que cela aidera certains d'entre vous.