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.
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.
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.
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.
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
@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: 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
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:
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.