Newsgroup: it.comp.lang.visual-basic
Titolo: Drive USb

Avrei bisogno di un aiuto.
Come disabilitare un drive USB (penDrive) da codice, in modo da poterla
estrarre senza problemi ?
Ciao, grazie a tutti

Ciao
Riportando e rielaborando la risposta data a me un po' di tempo fa,
posso solo consigliarti di usare il programma removedrive.exe (lo trovi
con google).
Tale programma è in grado di eseguire l'unmount di un drive passato come
parametro (es: "removedrive.exe d:"), proprio come l'umount di *nix.
Purtoppo non toglie l'alimentazione al canale USB, ma per ora è l'unica
possibilità che ho trovato (e, credimi, ho cercato a lungo).
E' un programma a finestra testuale, quindi dovrai eseguirlo tenendolo
nascosto, per questioni estetiche, e, soprattutto, con una ShellWait
(per aspettare che termini prima di proseguire con il resto
dell'esecuzione del tuo programma, la Shell funziona in modo asincrono).
Ecco un estratto del codice che uso io (ho fatto un taglia & cuci, non
ricompilato, cmq dovrebbe essere utile anche se contiene errori), non
comprende la dichiarazioni delle API e delle costanti, ma si trovano
facilmente per la rete
Codice:
'Esempio: Call RimozioneSicuraHW("d:")
Public Sub RimozioneSicuraHW(strDevice As String)
    On Error GoTo errHandler
    Dim ret&
    Dim proc As PROCESS_INFORMATION
    Dim start As STARTUPINFO
    start.cb = Len(start)
    start.dwFlags = 1
    start.wShowWindow = 0
    ' Crea il processo
    ret& = CreateProcessA(0&, "c:\windows\RemoveDrive.exe " & strDevice,
0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
    HandleProcesso = proc.hProcess
    DoEvents
    ' Verifica se il processo è ancora in esecuzione
    Dim iret As Long
    Dim hW As Long
    GetExitCodeProcess proc.hProcess, iret
    While iret = STILL_ACTIVE
        hW = FindWindowA(vbNullString, "RemoveDrive.exe")
	'Una di queste funzioni (le altre sono inutili) rende il processo
nascosto o in secondo piano, ora non ricordo bene
        Call SendMessageA(hW, WM_HIDE, 0&, 0&)
        Call SendMessageA(hW, WM_SYSCOMMAND, SC_MINIMIZE, 0&)
        Call SetWindowPos(hW, HWND_NOTOPMOST, 0, 0, 0, 0, &H3)
        GetExitCodeProcess proc.hProcess, iret
        DoEvents
        ' applicazione ancora in esecuzione
    Wend
    Exit Function
errHandler:
    If ErrMustStop Then Debug.Assert False: Resume
    'Gestione dell'errore
End Function
Ciao
Marco
Marco.s.m ha scritto:


Ciao,
il programma RemoveDrive per la mia applicazione funziona benissimo,
speravo in una soluzione più elegante ma mi rassicura la tua frase "ho
cercato a lungo".
Grazie.
Marco F. ha scritto:


 possibilità che ho trovato (e, credimi, ho cercato a lungo).
[cut]
Sarebbe carino sapere con che chiavi di ricerca, considerato che con quelle
piu' ovvie si trova al primo colpo: CM_Request_Device_Eject from the Config
Manager API, che poi altro non e' che l'API usata dal software
RemoveDrive.exe di cui trovi i sorgenti in
http://www.codeproject.com/system/RemoveDriveByLetter.asp
;-)
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Purtoppo non toglie l'alimentazione al canale USB, ma per ora =E8 l'unica=
Cosa peraltro impossibile con la quasi totalità (non tutte ma 
moltissime) delle sk madri visto che non rispettano lo standard e 
offrono i +5v direttamente dall'alimentazione tramite un fusible...
-- 
IBM: Indigestion Bothers Me
News 2002 [v 2.07] / StopDialer / PopDuster - 
http://www.socket2000.com
Akapulce portal: 
http://www.akapulce.net

 ;-)
A suo tempo, a Marco F., segnalai la presenza di questa API ( 
http://tinyurl.com/ucs86
 ) ma non esistono (magari riesci a smentirmi) 
esempi di VB/
VB.NET
Saluti
-- 
Gianluca Cannalire
Microsoft MVP/MCP - Visual Basic
http://www.visual-basic.it
http://community.visual-basic.it/gianluca
 

 offrono i +5v direttamente dall'alimentazione tramite un fusible...
Fai questa prova:
1. Inserisci una pen drive
2. Esegui la disconnessione sicura dell'HW
3. togli la pen drive
In questo modo non senti alcun beep dal PC
Fai quest'altra prova:
1. Inserisci una pen drive
2. esegui removedrive.exe $PERCORSO_CHIAVETTA
3. togli la pen drive
Ora senti un beep mentre la rimuovi.
Credevo che la differenza quindi fosse nel fatto che removedrive non
toglie l'alimentazione al canale usb, mentre la rimozione standard di
windows lo fa, e questo spiegherebbe il beep (windows, mentre sta ancora
alimentando il canale usb, si accorge che la periferica, sebbene
smontata, è stata rimossa, ed emette un segnale acustico)
Se hai altre spiegazioni, sono le benvenute...
Marco F.

 ;-)
Peccato questo gruppo sia iclv-b, e non iclc :-)
Scherzi a parte, non hai scoperto l'america: avevo fatto alcune prove
con quell'api, segnalatami già da... aspetta che googl'eggio un po'...
ecco, da Gianluca Cannalire circa 3 mesi e mezzo prima (Ven 22 Set 2006
17:51), ma senza esiti positivi. Peccato, perchè sono d'accordo che sia
la strada più pulita.
ciao
Marco F.

 Se hai altre spiegazioni, sono le benvenute...
Le spiegazioni sono quelle che ti ho dato e sono verificabili, la 
maggiorparte delle schede non ha un reale controllo 
sull'alimentazione. La rimozione sicura serve solo a flushare i dati 
di una eventuale cache per evitare di estrarre la chiave prima di 
aver finito di scriverla (o leggerla). Quanto al beep può darsi che 
removedrive non effettui l'azzeramento di qualche apposito flag che 
invece windows fa...
-- 
IBM: I'd Buy Macintosh


invece windows fa...
Confermo che la mb non toglie l'alimentazione alle periferiche ma le disattiva
solo via software, leggi questo thread per approfondire:
http://shorterlink.com/?X1IZ0R
--
ciao
  Stefano

 ha
scritto:

Volevo rispondere al messaggio sopra, Due di Picche ha certamente visto il
thread in questione, dal momento che è regolarmente su i.h.e.
--
ciao
  Stefano

 thread in questione, dal momento che č regolarmente su i.h.e.
thread a cui ho partecipato e che ha scatenato casini immani... ;-)
-- 
You can't make a program without broken egos.
