OVH Cloud OVH Cloud

HELP je craque

31 réponses
Avatar
Vincent
Bonjour,

Depuis une semaine je balaye des sites de dev à la recherche d'info.

Comment déconnecter par programme un lecteur ? ( clé USB en particulier, un
lecteur de disquette et tout élément USB )

Comment récupérer le n° de série ( quand il existe ) d'une clé USB ou d'un
disque USB ?

Help c'est une vraie galère pour mon boulot !!!!!

Merci

Vincent

1 réponse

1 2 3 4
Avatar
Simon Mourier [SoftFluent]
Comme je trouvais le sujet intéressant, je suis allé carrément au bout de la
démarche. Merci pour l'idée en tous cas :-)

cf ici:
http://www.codeproject.com/useritems/usbeject.asp

Simon.
www.softfluent.com


"Vincent" a écrit dans le message de news:
eLANak%
Dans l'ordre je fais :

CreateFile (retourne handle)
FlushFileBuffers
FSCTL_LOCK_VOLUME (retourne ok)
FSCTL_DISMOUNT_VOLUME(retourne ok)
IOCTL_STORAGE_MEDIA_REMOVAL(retourne ok)
IOCTL_STORAGE_EJECT_MEDIA(retourne ok)
Closehandle(retourne ok)

Mais, d'apres les infos que j'ai trouvé, le problème c'est windows 2000
qui ouvre toujours une fenêtre pour indiquer
qu'un périphérique usb à été déconnecté sauvagement :) , sous windows XP à
part un petit "ding" c'est pas génant.

Pour windows 2000 il faut, semble t'il, à l'installation du périphérique
usb, indiquer que celui_ci peut être retiré sans
prévenir avec SurpriseRemovalOK=vrai.

Il faut pour cela faire un driver filtrer ..... ( c'est là que ça se
gate!!!!!!)
Je sais pas faire, je désire utiliser le driver principal proposé par
windows 2000 ....
une idée ?

Quelqu'un l'a t'il déjà fait ? des conseils ?
Cà semble plus simple de passer sous XP :)
Y a forcement une solution simple ????

Merci

Vincent


"Paul Bacelar" a écrit dans le message
de news: e%238v$
Avez-vous verrouillé le volume avant de le démonter avec
"FSCTL_DISMOUNT_VOLUME".



Faites vos programmes de preuve de concept en C pour ne pas avoir de
problème de marshalling, puis, quand tous les menu problèmes sons résolu,
passez à C#.



Si vous avez en tête de faire une solution pérenne et fiable, un filter
driver sera une bonne solution.

--
Paul Bacelar
MVP VC++

"Vincent" wrote in message
news:
il faut réaliser un filtre driver ??


"Paul Bacelar" a écrit dans le
message de news: %23$
C'est du Kernel, donc pas de .NET, donc pas de C#.
Pourquoi ne pas faire un petit Driver en C de base.
--
Paul Bacelar
MVP VC++

"Vincent" wrote in message
news:%
Apres de longues recherches :) , SurpriseRemovalOK est la clé de tout
!
quelqu'un sait'il comment passer cette valeur à 1 en C# ?

Merci
Vincent


"Vincent" a écrit dans le message de
news:
Par rapport à la doc microsoft ( du lien que tu m'as donné ) tout est
ok :
toutes les étapes renvoient OK.

Si j'ouvre l'explorateur de fichier, le lecteur est toujours présent
même s'il est sans données
(si je clique dessus , message = insérez un disque dans le lecteur
F:)
Faut le faire disparaître !!!! :)

Vincent


"Vincent" a écrit dans le message de
news:
Merci pour ton aide,

j'ai suivi les directives du lien
http://support.microsoft.com/default.aspx?scid=kb;en-us;165721

j'obtien des résultats. mais pour
DeviceIoControl(hDrive,FSCTL_DISMOUNT_VOLUME,IntPtr.Zero,0,IntPtr.Zero,0,ref
octet_retour,IntPtr.Zero)

Renvoi l'erreur 112 sous 2000
et
sous xp : err 24 , Le programme a émis une commande de longueur
incorrecte
Je sais pas trop quoi faire.

La clé est prète à être éjectée pas l'utilisateur, mais à ce moment
une fenêtre (sous 2000)
indique qu'on a retiré la clé brusquement et il faut cliquer ok pour
continuer !
Le client dit : non j'en veut pas

je suis ds le caca :)

Vincent


"Simon Mourier [SoftFluent]" a écrit
dans le message de news:
Malheureusement, la norme USB n'impose pas de numéro de série pour
un périphérique, quel qu'il soit. Etes vous sûr que le disque en
question a un numéro de série?

voir ici:
http://blogs.msdn.com/oldnewthing/archive/2004/11/10/255047.aspx

Simon.
www.softfluent.com


"Vincent" a écrit dans le message
de news:
Je découvre ManagementObject,
new ManagementObject("Win32_PhysicalMedia.Tag='" +
drive["DeviceID"] + "'")["SerialNumber"] semble ne rien retourner
?

Vincent



"Vincent" a écrit dans le message
de news:
Je vais voir tout ça, il y en a déjà une bonne partie que
j'utilise : Createfile,deviceiocontrol,closehandle...
je regarde avec beaucoup d'interet ....
Merci

A bientot pour le cpte rendu :)

Vincent


"Simon Mourier [SoftFluent]" a
écrit dans le message de news:

arggghhh .... 51 lignes (dans un éditeur avec plus de 80
colonnes)...

bon je n'ai pas le safe, mais il faut juste adapter complètement
http://support.microsoft.com/default.aspx?scid=kb;en-us;165721

faut bosser maintenant :-)

Simon
www.softfluent.com


[DllImport("Kernel32.dll", SetLastError = true)]
static extern IntPtr CreateFile(string lpFileName, int
dwDesiredAccess,
int dwShareMode, IntPtr lpSecurityAttributes, int
dwCreationDisposition, int
dwFlagsAndAttributes, IntPtr hTemplateFile);

[DllImport("Kernel32.dll", SetLastError = true)]
static extern bool DeviceIoControl(IntPtr hDevice, int
dwIoControlCode,
IntPtr lpInBuffer, int nInBufferSize, IntPtr lpOutBuffer, int
nOutBufferSize, out int lpBytesReturned, IntPtr lpOverlapped);

[DllImport("Kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr hObject);

const int GENERIC_READ = unchecked((int)0x80000000);
const int FILE_SHARE_READ = 0x00000001;
const int FILE_SHARE_WRITE = 0x00000002;
const int OPEN_EXISTING = 3;
const int IOCTL_STORAGE_EJECT_MEDIA = 0x2D4808;

static bool EjectVolume(string volumeName)
{
IntPtr hFile = CreateFile(@"." + volumeName, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING,
0,
IntPtr.Zero);
if (hFile == new IntPtr(-1))
Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());

try
{
int bytesReturned;
if (!DeviceIoControl(hFile, IOCTL_STORAGE_EJECT_MEDIA,
IntPtr.Zero, 0,
IntPtr.Zero, 0, out bytesReturned, IntPtr.Zero))
Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
}
finally
{
CloseHandle(hFile);
}
return false;
}

static void EjectAllUsbVolumes()
{
foreach(ManagementObject drive in new
ManagementObjectSearcher("select *
from Win32_DiskDrive where InterfaceType='USB'").Get())
{
foreach(ManagementObject partition in new
ManagementObjectSearcher("ASSOCIATORS OF
{Win32_DiskDrive.DeviceID='" +
drive["DeviceID"] + "'} WHERE AssocClass >>>>>>>>>>> Win32_DiskDriveToDiskPartition").Get())
{
Console.WriteLine("Partition=" + partition["Name"]);
foreach(ManagementObject disk in new
ManagementObjectSearcher("ASSOCIATORS OF
{Win32_DiskPartition.DeviceID='" +
partition["DeviceID"] + "'} WHERE AssocClass >>>>>>>>>>> Win32_LogicalDiskToPartition").Get())
{
Console.WriteLine("Disk=" + disk["Name"]);
EjectVolume(disk["Name"].ToString());
}
}
Console.WriteLine("Serial=" + new
ManagementObject("Win32_PhysicalMedia.Tag='" + drive["DeviceID"]
+
"'")["SerialNumber"]);
}
}

"Vincent" a écrit dans le
message de news:

Même que l'ejection de la clé usb en mode "safe" je suis
preneur

Vincent


"Merlin" a écrit dans le message de news:

ps : s'il y a 20 lignes je suis preneur quand même



je dirais que même jusqu'à 40 c'est encore assez rentable :-)

--

///3rL1n____





















































1 2 3 4