PDA

View Full Version : [Win32] Intercettare evento connessione USB


tomminno
21-10-2006, 14:59
Volendo da software evitare l'utilizzo delle porte USB su un computer con WinXP come si può fare?
Nella documentazione di SetWindowsHookEx non ho trovato niente che possa riguardare l'argomento.

andbin
21-10-2006, 15:15
Volendo da software evitare l'utilizzo delle porte USB su un computer con WinXP come si può fare?
Nella documentazione di SetWindowsHookEx non ho trovato niente che possa riguardare l'argomento.SetWindowsHookEx gestisce hook che fanno riferimento all'input e al sistema di windowing.

Il messaggio WM_DEVICECHANGE viene inviato alle finestre quando avviene qualche cambiamento nell'hardware.

andbin
21-10-2006, 15:25
Esempio completo:
#define STRICT
#include <windows.h>
#include <Dbt.h>

#define MAIN_WNDCLASS "MiaClasseFinestra"

LRESULT CALLBACK Main_WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
return 0;

case WM_DESTROY:
PostQuitMessage (0);
return 0;

case WM_CLOSE:
DestroyWindow (hWnd);
return 0;

case WM_DEVICECHANGE:
if (wParam == DBT_DEVICEARRIVAL)
{
PDEV_BROADCAST_HDR phdr = (PDEV_BROADCAST_HDR) lParam;

if (phdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME pvol = (PDEV_BROADCAST_VOLUME) phdr;
CHAR szMsg[80];
int mask = 1;
int n;

for (n = 0; n < 26; n++, mask<<=1)
{
if (pvol->dbcv_unitmask & mask)
{
wsprintf (szMsg, "E` arrivato il volume %c:", 'A' + n);
MessageBox (NULL, szMsg, "Arrivo device", MB_OK | MB_ICONINFORMATION);
}
}
}
}

return 0;
}

return DefWindowProc (hWnd, uMsg, wParam, lParam);
}


INT APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpszCmdLine, INT iCmdShow)
{
WNDCLASSEX wcx;
HWND hWnd;
MSG msg;

wcx.cbSize = sizeof (wcx);
wcx.style = CS_HREDRAW | CS_VREDRAW;
wcx.lpfnWndProc = (WNDPROC) Main_WndProc;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hInstance = hInstance;
wcx.hIcon = NULL;
wcx.hIconSm = NULL;
wcx.hCursor = LoadCursor (NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
wcx.lpszMenuName = NULL;
wcx.lpszClassName = MAIN_WNDCLASS;

if (!RegisterClassEx (&wcx))
{
MessageBox (NULL, "Errore nella registrazione della classe",
"ERRORE", MB_OK | MB_ICONEXCLAMATION);
return 1;
}

hWnd = CreateWindow (MAIN_WNDCLASS, "Test WM_DEVICECHANGE", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 300, 300,
NULL, NULL, hInstance, NULL);

if (hWnd == NULL)
{
MessageBox (NULL, "Errore nella creazione della finestra",
"ERRORE", MB_OK | MB_ICONEXCLAMATION);
return 1;
}

ShowWindow (hWnd, SW_SHOWNORMAL);
UpdateWindow (hWnd);

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}

return 0;
}Se attacco la mia pen-drive, mi compare la box con scritto:
E` arrivato il volume Q:

tomminno
21-10-2006, 15:48
Se non ho capito male il codice, in questo modo intercetti la notifica dell'avvenuta connessione.
In ogni caso sulle risorse del computer mi ritrovo la penna installata, dovrei in qualche modo evitare l'accesso al disco.

71104
21-10-2006, 19:29
Se non ho capito male il codice, in questo modo intercetti la notifica dell'avvenuta connessione.
In ogni caso sulle risorse del computer mi ritrovo la penna installata, dovrei in qualche modo evitare l'accesso al disco. cioè praticamente dovresti disattivarla come farebbe manualmente l'utente da Gestione Periferiche...

non saprei, dovrei cercare su MSDN.

se invece vuoi proprio evitare che la periferica venga installata allora penso sia impossibile a meno che non ci lavori in kernel mode.

71104
21-10-2006, 19:40
boh, dev'essere una di queste... :fagiano:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/DevInst_r/hh/DevInst_r/di-rtns_8a5811d9-9e5d-44f6-84b2-7ec25c72f54b.xml.asp?frame=true

71104
21-10-2006, 19:42
@andbin: il tuo codice si scorda di deregistrare la window class all'uscita

EDIT: ed inoltre fai una ShowWindow ignorando il parametro di show passato alla WinMain

andbin
22-10-2006, 11:33
@andbin: il tuo codice si scorda di deregistrare la window class all'uscitaSì, è vero. Però su MSDN la documentazione di RegisterClassEx dice:

"All window classes that an application registers are unregistered when it terminates."

Quello che deduco io (spero in modo corretto) è quindi: quando una applicazione termina vengono de-registrate comunque tutte le classi. ;)

EDIT: ed inoltre fai una ShowWindow ignorando il parametro di show passato alla WinMainSì, lo so. Comunque molte applicazioni se ne sbattono di quel parametro!! :p

71104
22-10-2006, 13:34
Sì, è vero. Però su MSDN la documentazione di RegisterClassEx dice:

"All window classes that an application registers are unregistered when it terminates."

Quello che deduco io (spero in modo corretto) è quindi: quando una applicazione termina vengono de-registrate comunque tutte le classi. ;) uh, non me lo ricordavo http://forums.nsn3.net/style_emoticons/default/55.gif

Sì, lo so. Comunque molte applicazioni se ne sbattono di quel parametro!! :p si, come FireFox http://forums.nsn3.net/style_emoticons/default/24.gif

ti sembrerà strano ma io non me ne sbatto mai :read: :Prrr:

ReWeNgE
15-11-2011, 18:29
Ciao a tutti

Mi collego a questo post perché volevo utilizzare il codice proposto in quanto vorrei che all'inserimento della chiavetta USB, un programma già residente in memoria eseguisse un'altra applicazione e si chiudesse

Quindi pensavo a qualcosa che potessi mettere nell'esecuzione automatica tipo

rileva.exe -c cmd /c bla.exe

dove -c chiude rileva.exe
e cmd è il programma che viene eseguito con i suoi parametri..

Potrebbe fare il programma suggerito, il codice.. (è fatto in c?) a caso mio?

Manuel