Come ricavare la lettera di un pendrive usb
Categories: C, Source Code, Windows
Tags:
Nell’articolo “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 rimozione di una periferica usb. Se volessimo eseguire un programma dalla penna usb, avremmo bisogno di:
- intercettare l’inserimento della penna;
- essere sicuri che la periferica inserita sia una “mass storage device”, e che contenga un”volume”;
- conoscere la lettera dell’unità del volume.
Per capire se la periferica collegata contenga un volume dobbiamo andare a leggere il parametro LPARAM, passato dal messaggio WM_DEVICECHANGE. Ecco un esempio:
LRESULT Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
case DBT_DEVICEARRIVAL:
{
//casto lparam
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
//verifico se la periferica usb inserita è un volume
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
//questo è il caso in cui la periferica è un volume
}
break;
}
//...
default:
{}
}
Ora non ci resta che capire la lettera dell’unità in cui è stato montato il volume. Castando LPARAM a PDEV_BROADCAST_VOLUME otteniamo delle informazioni in aggiuntive sul nostro volume tra cui:
dbcv_size
che indica la grandezza del volume e
dbcv_unitmask
che contiene tutte le unità del dispositivo (es f:,g:, etc…). La variabile dbcv_unitmask è una “bitmask” ovvero è un numero binario di 26 cifre in cui tutti gli “1″ rapresentano le lettere delle unità. Per esemipo una bitmask del tipo:
…00000000000001010000
ha un 1 alla 5° cifra, ed un altro alla 7°, questo significa che la nostra periferica contiene due volumi montati rispettivamente nell’unità E, e G.
Ecco un esempio:
...
char CurrentDrive;
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
CurrentDrive = FindFirstDrive(lpdbv->dbcv_unitmask);
}
...
//esempio di funzione per leggere
//la prima lettera della bitmask
char FindFirstDrive(ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
Se sei interessato a questo post, potresti anche provare a leggere:
-
No related posts
27 Apr 2007 inandrea

inandrea…ma sei un grande! mi sa che…ti voglio proprio sposare!!
ti amooooooooooooooooooooooooo!!!!!!!!!!!!!!!!!!!
inandrea anche io ti voglio sposareeee!!! Ma chi è questa Roberta?? Ancora non gliel’hai detto che stiamo assieme? Smettila di illuderla e scappiamo via assieme!
PRRRRRRRRRRRRRRRRRR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Anch’io lo voglio sposare!!!!!!!!!!!
prenditi dzam!