Intercettare il collegamento e la rimozione di una periferica USB
Categories: C, Source Code, Windows
Tags:
Qualche mesetto fa mi sono chiesto se non ci fosse una maniera per lanciare automaticamente il mio MozUp quando inserivo il mio pendrive nel pc, un pò come succede quando inserisci un cd ed il sistema automaticamente legge il file autorun.inf e fa il suo mestiere… .
Naturalmente, anche se sul MozUp c’é un’opzione per generare il file autorun.ini,
l’autorun non funziona per questioni di sicurezza: il sistema si limita a prendere l’icona, ma non esegue nulla. Allora mi sono detto: vediamo cosa mi propongono le api di windows e se è semplice pensare ad un programmino che mi permetta di lanciare il MozUp all’inserimento della mia penna usb. In effetti il sistema notifica l’inserimento e la rimozione di una qualsiasi periferica “hotplug”, ad ogni finestra che abbia richiesto la notifica con la funzione RegisterDeviceNotification, con il messaggio WM_DEVICECHANGE. Nel caso dei pendrive usb la cosa è ancora più semplice, perchè non c’é bisogno di richiedere la notifica.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
......
break;
case WM_DEVICECHANGE:
return Main_OnDeviceChange(hWnd,wParam,lParam);
break;
default:
....
}
}
Questo messaggio è inviato in broadcast a tutte le finestre, e indica quando una periferica è stata inserita, rimossa, o in generale quando viene scatenato un evento attinente a queste azioni (es: quando la rimozione della periferica è fallita, …).
Per sapere esattamente quale di queste azioni è avvenuta ho scritto una semplice funzione:
LRESULT Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
switch(wParam)
{
case DBT_DEVICEARRIVAL:
{
... //caso nel quale la periferica è stata inserita
break;
}
case DBT_DEVICEREMOVECOMPLETE:
{
... //caso nel quale la periferica è stata inserita
break;
}
default:
{}
}
}
Se sei interessato a questo post, potresti anche provare a leggere:
-
No related posts
23 Apr 2007 inandrea

Sei il più bravo ingegnere informatico del mondo!tat!
…Anche dzam però devo dire che fa la sua porca figura…
PS ma si può usare per qst scopo privato sto sito????!!! :/
No! è assolutamente vietato usare qts sito a scopo personale! Lo dimostra il cricetino random che c’è più sotto!
Cmq non te la prendere dzamir, ma preferisco Roberta… 
[...] “Intercettare il collegamento e la rimozione di una periferica USB” avevo mostrato un piccolo esempio che indicava come eseguire del codice al collegamento, e alla [...]
Domanda da 1 mln di dollari.. e in linux come si fa?
He he… me lo chiedevo da un pezzo ma ancora non ho avuto tempo di documentarmi…
Potrebbe essere un interessante spunto per un nuovo articolo! Se dovessi trovare qualcosa di interessante sulla rete segnalacelo.
P.S.
Buon natale a tutti!