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

10 réponses

1 2 3 4
Avatar
Patrick Philippot
Merlin wrote:
Reste une autre question : si c'est pour faire un soft .net dont
l'essentiel des fonctions se passe par du p/invoke, autant prendre un
compilo win32 ?



Je suis d'accord. L'utilisation d'Interop doit se limiter, à mon humble
avis, aux cas suivants:

1. Le framework ne sait pas faire.
2. J'ai un composant Win32 non porté sous .Net et dont je n'ai pas le
source.
3. J'interagis avec le monde non managé sans alternative purement .Net.

Que certaines parties du framework fassent elles-mêmes appel à P/Invoke
n'est pas une justifiaction en soi. C'est l'implémentation interne du
framework *aujourd'hui* et elle est susceptible de changer à tout
moment, ce qui arrivera nécessairement avec les technologies annoncées
ou en preview. Ce n'est pas parce qu'on peut désassembler le code du
framework qu'il faut nécessairement tirer des conclusions de ce que l'on
y trouve.

Ajoutons à cela que toute incursion dans le monde non managé met
l'application hors contrôle de la CLR pendant le temps de l'appel. On
perd ainsi le bénéfice de ses services avancés (exceptions, garbage
collector,...).

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Merlin
parfaitement d'accord.

--

///3rL1n____
Avatar
Vincent
J'ai en fin de compte fait appel à la dll kernel32.dll.
J'encapsule ça dans une fonction, si je dois porter mon programme
je changerai juste cette méthode.

J'arrive donc à faire une closehandle, j'avance enfin. Même si windows
cri quand j'enlève la clé, car s'il constate que le lecteur est toujours là
(même s'il n'est plus actif). Ma mission à présent : mettre à jour le
système
pour qu'il déconnecte tout ( la lettre du drive rétiré, ici un clé usb, est
toujours
présente)

Vincent

ps : quand tout marchera je vous passerai le code sica oeut aider


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

parfaitement d'accord.

--

///3rL1n____




Avatar
Simon Mourier [SoftFluent]
Euh.... je ne vois absolument pourquoi j'irai m'embêter à utiliser une
librairie externe d'origine incertaine, qui installe un driver kernel (!),
qui plus est écrite dans un language non managé, alors que je peux tout
faire en C# à partir de l'API documentée en 10 lignes de code? Car c'est
bien de cela qu'on parle ici... On ne parle pas de l'utilisation de
l'interop en général. Comme dirait l'autre, il y a mieux, mais c'est moins
cher, et réciproquement.

Simon.
www.softfluent.com


"Patrick Philippot" a écrit dans le
message de news: %
Merlin wrote:
Reste une autre question : si c'est pour faire un soft .net dont
l'essentiel des fonctions se passe par du p/invoke, autant prendre un
compilo win32 ?



Je suis d'accord. L'utilisation d'Interop doit se limiter, à mon humble
avis, aux cas suivants:

1. Le framework ne sait pas faire.
2. J'ai un composant Win32 non porté sous .Net et dont je n'ai pas le
source.
3. J'interagis avec le monde non managé sans alternative purement .Net.

Que certaines parties du framework fassent elles-mêmes appel à P/Invoke
n'est pas une justifiaction en soi. C'est l'implémentation interne du
framework *aujourd'hui* et elle est susceptible de changer à tout moment,
ce qui arrivera nécessairement avec les technologies annoncées ou en
preview. Ce n'est pas parce qu'on peut désassembler le code du framework
qu'il faut nécessairement tirer des conclusions de ce que l'on y trouve.

Ajoutons à cela que toute incursion dans le monde non managé met
l'application hors contrôle de la CLR pendant le temps de l'appel. On perd
ainsi le bénéfice de ses services avancés (exceptions, garbage
collector,...).

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr



Avatar
Vincent
Très interessant ce que tu dis,

Donc en 10lignes (plutot en C# :)):
tu identifis toutes les clé usb, leur numéro de série(n° hard constructeur),
leur lettre associée
et tu déconnecte sans problème la clé que tu désires( elle disparait de la
liste des disques)
et quand tu la retires, aucun message ne t'indique que tu as retiré la clé !
l'icone en bas, dans la barre des taches(la petite fleche verte) n'indique
plus qu'il y a un périphérique
usb à déconnecter.

Génial, tu peux éditer ton code, c'est exactement ce que je cherche depuis
15 jours

MERCI d'AVANCE
Vincent

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


"Simon Mourier [SoftFluent]" a écrit dans le
message de news:
Euh.... je ne vois absolument pourquoi j'irai m'embêter à utiliser une
librairie externe d'origine incertaine, qui installe un driver kernel (!),
qui plus est écrite dans un language non managé, alors que je peux tout
faire en C# à partir de l'API documentée en 10 lignes de code? Car c'est
bien de cela qu'on parle ici... On ne parle pas de l'utilisation de
l'interop en général. Comme dirait l'autre, il y a mieux, mais c'est moins
cher, et réciproquement.

Simon.
www.softfluent.com


Avatar
Merlin
> J'ai en fin de compte fait appel à la dll kernel32.dll.
J'encapsule ça dans une fonction, si je dois porter mon programme
je changerai juste cette méthode.



si c'est juste une seule fonction oui tu as raison, tu vas pas créer
une dll win32 juste pour une fonction :-)

ps : quand tout marchera je vous passerai le code sica oeut aider



de toute façon ça pourra toujours aider qqun, donc c'est une bonne
idée.

--

///3rL1n____
Avatar
Merlin
> 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____
Avatar
Vincent
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____




Avatar
Simon Mourier [SoftFluent]
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____








Avatar
Vincent
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