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:

Penna usb

  1. intercettare l’inserimento della penna;
  2. essere sicuri che la periferica inserita sia una “mass storage device”, e che contenga un”volume”;
  3. 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