Déconnecter un periph USB

cs_kha Messages postés 38 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 29 juillet 2004 - 5 févr. 2004 à 18:43
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 - 3 mars 2004 à 08:20
Hello,

Quand on met une clé USB sur win xp, ou un hdd usb ou firewire, ya une petite icone qui se met dans la tray barre et qui permet de "l ejecter" de facon correcte avant de debrancher le periph.

Mais le prob, c'est que cette manip ne peut etre faitre sur certains compte utlisateurs basiques : du coup on ne peut pas ejecter le periph et quand on le debranche a chaud win affiche une erreur disant qu il a mal ecrit certaines donnees...

Donc voila ma question : est ce que qqun saurait quoi utiliser (une fonction de l api win par ex.) pour deconnecter un hdd externe usb ?

thx.

NB: j'ai recherché déjà dans google et la msdn et l aide .NET et j'ai rien trouvé...

6 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
9 févr. 2004 à 21:23
salut

il existe surement une fonction mineure IRP_MJ_DEVICE_CONTROL qui permet de faire ca :
on envoit au pilote par la fonction DeviceIOControl

tu peux regarder dans la DDK online de osr.com s'il y a une IOCTL ou IRP_MJ_xxx ou IRP_MN_xx ou autre qui permet de déconnecter (queque part dans mass storage ou usb storage je crois)

voila

ShareVB
0
cs_kha Messages postés 38 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 29 juillet 2004
10 févr. 2004 à 00:37
J ai essaye ca : le probleme c'est que j'arrive meme pas a recupere le noeud : il me renvoi une erreur, soit pointeur invaldie soit je sais plus quoi... ptant le prog est correct :

#include <windows.h>
#include <cfgmgr32.h>
#include <SetupAPI.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
{
int res = 0;
char buffer[20];

char* hid = "USBSTOR\Disk&Ven_IC25N020&Prod_ATMR04-0&Rev_0811\6&666dadf&0"; // test avec une chaine "device instance"

HMACHINE hMachine = NULL; // NULL for local machine

PDEVINST pdnDevInst_OUT = NULL; // pointeur sur un noeud
DEVINST dnDevInst = NULL; // null au depart mais c'est la le probleme :
// il en faut un obligatoirement non NULL => comment recuperer un handle ?
// ds la doc ils disent avec CM_Locate_DevNode_Ex mais ca marche pas

res = CM_Locate_DevNode_Ex(pdnDevInst_OUT, hid, CM_LOCATE_DEVNODE_NORMAL, hMachine);
_itoa(res, buffer, 10);
MessageBox(NULL, buffer, "msg", 0);
// Voir les codes de sortie dans cfgmgr32.h : CR_SUCCESS = 0

res = CM_Get_Child_Ex(pdnDevInst_OUT , dnDevInst, 0, hMachine);
_itoa(res, buffer, 10);
MessageBox(NULL, buffer, "msg", 0);

res = CM_Get_Sibling_Ex(pdnDevInst_OUT, dnDevInst, 0, hMachine);
_itoa(res, buffer, 10);
MessageBox(NULL, buffer, "msg", 0);

res = CM_Request_Device_Eject_Ex(pdnDevInst_OUT, NULL, NULL, 0, 0, hMachine );
_itoa(res, buffer, 10);
MessageBox(NULL, buffer, "msg", 0);

return 0;
}
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
27 févr. 2004 à 19:15
salut

après avoir étudié le prb je mettrais plutot ce code :

DEVINST dnDevInst = NULL;
PDEVINST pdnDevInst_OUT = &dnDevInst; // le pointeur doit etre initialisé pour que ca marche

sinon ca devrait marcher.

voila

ShareVB
0
cs_kha Messages postés 38 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 29 juillet 2004
3 mars 2004 à 03:26
Hello !!

Merci bcp de ton iade : j ai pus avancer et j'ai donc mis ca...

#include <windows.h>
#include <SetupAPI.h>
#include <cfgmgr32.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
{
int res = 0;
char buffer[20];

char* hid = "USBSTOR\\Disk&Ven_IC25N020&Prod_ATMR04-0&Rev_0811\\6&666dadf&0"; // test avec une chaine "device instance"

HMACHINE hMachine = NULL;
DEVINST dnDevInst = NULL;
PDEVINST pdnDevInst_OUT = &dnDevInst;

res = CM_Locate_DevNode_Ex(pdnDevInst_OUT, hid, CM_LOCATE_DEVNODE_NORMAL, hMachine);
_itoa(res, buffer, 10);
MessageBox(NULL, buffer, "msg", 0);

res = CM_Request_Device_Eject_Ex(dnDevInst, NULL, NULL, 0, 0, hMachine );
_itoa(res, buffer, 10);
MessageBox(NULL, buffer, "msg", 0);

return 0;
}

Mais le probleme, c'est qu'un message windows d avertisement apparait lors du CM_Request_Device_Eject_Ex, me disant que le peripherique n'est pas amovible ou alors qu'il ne peut pas etre deconnecte, alors que si en réalité il peut l etre (et c est un periph de stockage de masse par usb)

j'y comprends plus rien :(

help

thx!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_kha Messages postés 38 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 29 juillet 2004
3 mars 2004 à 04:03
me suis trompé ! ca marche nikel !

thx!

voial le source que je v poster :

#include <windows.h>
#include <SetupAPI.h>
#include <cfgmgr32.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
{
int res = 0;
char buffer[20];

char* hid = "USB\\Vid_05e3&Pid_0702\\5&2cab1e4d&0&1";

HMACHINE hMachine = NULL;
DEVINST dnDevInst = NULL;
PDEVINST pdnDevInst_OUT = &dnDevInst;

res = CM_Locate_DevNode_Ex(pdnDevInst_OUT, hid, CM_LOCATE_DEVNODE_NORMAL, hMachine);
_itoa(res, buffer, 10);
//MessageBox(NULL, buffer, "msg", 0);

res = CM_Request_Device_Eject_Ex(dnDevInst, NULL, NULL, 0, 0, hMachine );
_itoa(res, buffer, 10);
//MessageBox(NULL, buffer, "msg", 0);

return 0;
}
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
3 mars 2004 à 08:20
salut

effectivement il y a plusireurs device par périphérique et seul le device père est déconnectable.
Je vais bientot mettre sur vbfrance une source qui permet d'obtenir la liste des périphérique déconnectables et de les déconnecter si souhaité...

voila

ShareVB
0
Rejoignez-nous