Sto tentando di rilevare l'inserimento di dispositivi rimovibili e recuperare la lettera di unità di tale dispositivo utilizzando un servizio NT. Sono riuscito a rilevare l'inserimento e la rimozione di dispositivi, ma non sono stato in grado di configurare una struttura DEV_BROADCAST_VOLUME
che mi consenta di ottenere la lettera dell'unità, GUID, ecc. Dal volume.Impossibile recuperare i dati su un dispositivo rimovibile utilizzando un servizio Windows in C++
case SERVICE_CONTROL_DEVICEEVENT:{
switch(evtype){
case DBT_DEVICEARRIVAL:{
DEV_BROADCAST_VOLUME *hdr = (DEV_BROADCAST_VOLUME*) evdata;
ofstream log ("C:\\log.txt", ios::app);
log << hdr->dbcv_devicetype;
log.close();
}
break;
Il frammento di codice sopra compila e funziona correttamente, ma quando inserisco un'unità flash, hdr->dbcv_devicetype
registri come valore di 55555
e DBT_DEVTYP_VOLUME
(che è quello che un'unità USB) è definita come 2
(hdr->dbcv_devicetype
deve uguagliare DBT_DEVTYP_VOLUME
perché ho inserito un flash drive). Per qualche motivo, il DBT_DEVTYP_VOLUME
non sta inizializzando correttamente, o qualcos'altro che sto facendo è sbagliato. Sto usando Windows 7 con Visual Studio 2011 C++.
Avete considerato che le unità ei driver mentono? la differenza tra un "disco rigido USB esterno" e un "disco rigido USB interno" è arbitraria. Per non parlare del fatto che tecnicamente la definizione di "disco" e "volume" e Drive sono la differenza ... Oh e per i punti bonus ciò che LOCAL_SYSTEM vede come C: \ non deve essere quello che l'utente vede come c: \ – Dan
Idealmente dovresti farlo nel contesto dell'utente in quanto i mapping delle lettere delle unità sono gestiti per utente. Se sei in grado di farlo, puoi semplificare enormemente il tuo compito dato che l'esploratore fa già il duro lavoro; è possibile utilizzare una semplice chiamata a SHChangeNotifyRegister() per ottenere le notifiche. – Luke
@Luke L'idea sembra buona, ma continuerà a rilevare le unità che non sono montate? Ad esempio, Windows non monterà un file system Linux, semplicemente informerà l'utente di formattarlo. 'SHChangeNotifyRegister()' selezionerebbe l'inserimento anche se non è montato su una lettera di unità come 'E: \\'? – user99545