Detection usb avec WM_DEVICECHANGE

MHV-SEC Messages postés 140 Statut Membre -  
 Pseudo -
Bonjour,
est-ce-que quelqu'un sait comment utiliser WM_DEVICECHANGE pour detecter l'insertion d'une cle usb?

merci
Configuration: Linux
Firefox 3.0.13

2 réponses

  1. Pseudo
     
    Visitez

    http://www.world-prog.com

    // Code par KarLKoX
    #include <windows.h>
    #include <stdio.h>

    #ifndef WM_DEVICECHANGE
    #define WM_DEVICECHANGE 0x219
    #endif

    #ifndef DBT_DEVICEARRIVAL
    #define DBT_DEVICEARRIVAL 0x8000
    #endif

    #ifndef DBT_DEVICEREMOVECOMPLETE
    #define DBT_DEVICEREMOVECOMPLETE 0x8004
    #endif

    #ifndef DBT_DEVTYP_VOLUME
    #define DBT_DEVTYP_VOLUME 0x2
    #endif

    /* Declare Windows procedure */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

    /* Make the class name into a global variable */
    char szClassName[ ] = "WindowsApp";

    // structure générique
    struct DEV_BROADCAST_HDR
    {
    int dbch_size;
    int dbch_devicetype;
    int dbch_reserved;
    };

    // structure spécifique
    // notez qu'elle a strictement le même tronche que la générique mais
    // avec des trucs en plus
    struct DEV_BROADCAST_VOLUME
    {
    int dbcv_size;
    int dbcv_devicetype;
    int dbcv_reserved;
    int dbcv_unitmask;
    short dbcv_flags;
    };

    int WINAPI WinMain (HINSTANCE hThisInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpszArgument,
    int nFunsterStil)

    {
    HWND hwnd; /* This is the handle for our window */
    MSG messages; /* Here messages to the application are saved */
    WNDCLASSEX wincl; /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
    wincl.style = CS_DBLCLKS; /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL; /* No menu */
    wincl.cbClsExtra = 0; /* No extra bytes after the window class */
    wincl.cbWndExtra = 0; /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
    return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
    0, /* Extended possibilites for variation */
    szClassName, /* Classname */
    "Windows App", /* Title Text */
    WS_OVERLAPPEDWINDOW, /* default window */
    CW_USEDEFAULT, /* Windows decides the position */
    CW_USEDEFAULT, /* where the window ends up on the screen */
    544, /* The programs width */
    375, /* and height in pixels */
    HWND_DESKTOP, /* The window is a child-window to desktop */
    NULL, /* No menu */
    hThisInstance, /* Program Instance handler */
    NULL /* No Window Creation data */
    );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
    /* Translate virtual-key messages into character messages */
    TranslateMessage(&messages);
    /* Send message to WindowProcedure */
    DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
    }

    /* This function is called by the Windows function DispatchMessage() */
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    // Bonus :)
    case WM_DEVICECHANGE:
    if (wParam == DBT_DEVICEARRIVAL)
    MessageBox(hwnd, "Une clé USB vient d'être connectée.", "Info", MB_OK);
    else if (wParam == DBT_DEVICEREMOVECOMPLETE)
    MessageBox(hwnd, "Une clé USB vient d'être déconnectée.", "Info", MB_OK);
    break;

    case WM_ENDSESSION:
    MessageBox(hwnd, "Windows va se fermer.", "Info", MB_OK);
    return 0;

    case WM_DESTROY:
    PostQuitMessage (0); // send a WM_QUIT to the message queue
    break;

    default: // for messages that we don't deal with
    return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
    }
    1