Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Как узнать что в системе появилось новое USB

Страницы: 1
Как узнать что в системе появилось новое USB
Хочу сделать флешко распознаватель. Проще говоря идея такая, при подключении моей флешки к компу, необходимо что бы на него сохранялись важные мне документы.
Процесс решения проблемы вижу в 3 этапа
1. надо научиться узнавать о новом УСБ устройстве
2. надо придумать как узнать мою флешку
3. копировать по заданному списку директорий

У кого какие соображения на данную тему???
Немного погуглив найдено решение первой задачи

В программе необходимо ловить сообщение WM_DEVICECHANGE
при этом WParam может принимтать ожно из следующих значений
DBT_DEVICEARRIVAL - устройство вставили
DBT_DEVICEREMOVECOMPLETE - устройство извлекли

Тут полная версия http://msdn.microsoft.com/en-us/library/aa363480(v=VS.85).aspx
По второму пункту есть предложение сравнивать серийный номер диска.
Правильно, используйте GetVolumeInformation, узнаёте SN диска и сравниваете его с заранее записанным значением.
Или GetDriveInfo
Покопавшись выяснил следующее. Вместе с сообщением DBT_DEVICEARRIVAL приходит структура DEV_BROADCAST_HDR, можно найти dbcc_name

Цитата
If media is being inserted, the type of device arriving is a volume (the dbch_devicetype member is DBT_DEVTYP_VOLUME) and the change effects the media (the dbcv_flags member is DBTF_MEDIA).


и в этой же статье пример, правда на С

Код
#include <windows.h>
#include <dbt.h>
#include <strsafe.h>
#pragma comment(lib, "user32.lib")

void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam);
char FirstDriveFromMask (ULONG unitmask);  //prototype

/*------------------------------------------------------------------
   Main_OnDeviceChange (hwnd, wParam, lParam)

   Description
      Handles WM_DEVICECHANGE messages sent to the application's
      top-level window.
--------------------------------------------------------------------*/

void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
   PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
   char szMsg[80];

   switch(wParam)
   {
      case DBT_DEVICEARRIVAL:
         // Check whether a CD or DVD was inserted into a drive.
         if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
         {
            PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

            if (lpdbv -> dbcv_flags & DBTF_MEDIA)
            {
               StringCchPrintf (szMsg, 80, "Drive %c: Media has arrived.\n",
                         FirstDriveFromMask(lpdbv ->dbcv_unitmask));

               MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
            }
         }
         break;

      case DBT_DEVICEREMOVECOMPLETE:
         // Check whether a CD or DVD was removed from a drive.
         if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
         {
            PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

            if (lpdbv -> dbcv_flags & DBTF_MEDIA)
            {
               StringCchPrintf (szMsg, 80, "Drive %c: Media was removed.\n",
                         FirstDriveFromMask(lpdbv ->dbcv_unitmask));

               MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
            }
         }
         break;

      default:
           /*
              Process other WM_DEVICECHANGE notifications for other 
              devices or reasons.
           */ 
            ;
   }
}

/*------------------------------------------------------------------
   FirstDriveFromMask (unitmask)

   Description
     Finds the first valid drive letter from a mask of drive letters.
     The mask must be in the format bit 0 = A, bit 1 = B, bit 2 = C, 
     and so on. A valid drive letter is defined when the 
     corresponding bit is set to 1.

   Returns the first drive letter that was found.
--------------------------------------------------------------------*/

char FirstDriveFromMask (ULONG unitmask)
{
   char i;

   for (i = 0; i < 26; ++i)
   {
      if (unitmask & 0x1)
         break;
      unitmask = unitmask >> 1;
   }

   return (i + 'A');
}


Думаю с поимкой устройства все понятно. Завтра с утра придумаю как лучше все это реализовать. Пока в голове крутиться приложение в виде сервиса

Добавлю еще вот что. GetVolumeInformation и GetDriveInfo не совсем то что надо. Они дадут инфу уже по установленному дисковому устройству, то есть надо будет делать запрос каждый раз когда сработает devicechange. Это не очень удобно
Изменено: mihail filatov - 27.05.2010 23:12:32
Я предлагаю определять устройство по VID и PID устройства. оно как раз будет приходить в том самом dbcc_name
связка VID и PID даст вам уникальность.
Да пожалуй по поводу VID и PID идея хорошая.

Решил что на время разработки это будет оконное приложение(так будет легче в отладке), с последующей переделкой его в сервис. Так же было решено расширить функционал. При появлении любого УСБ устройства, которая создает диск, блокировать его и искать на нем autorun.inf и папки вида Recycle,(основной источник заразы на флешке). После чего удалять их и разблокировать устройство.
Заблокировать диск можно через DeviceIoControl
вот тут коды управления томами http://msdn.microsoft.com/en-us/library/aa365729(v=VS.85).aspx

Правда есть нюанс. Если на флешке вирус успеет активизироваться первым,или вирус сидящий на компе первым получит доступ к флешке, то заблокировать том(флешку) вы уже не сможете.
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)