Форум программистов, компьютерный форум CyberForum.ru

Отслеживание USB флешек - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
lanu4
 Аватар для lanu4
14 / 14 / 1
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
03.10.2013, 08:15     Отслеживание USB флешек #1
Доброго времени суток. Хотелось бы услышать, как корректно определить USB флэшку?
Необходимость появилась в этом, потому что надо сделать запрет на открытие флэшки на компе. И при запрете не запретить клаву с мышкой USB. Можете подкинуть примеры по определению флэшек?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rapsod
Волшебник
 Аватар для Rapsod
62 / 61 / 4
Регистрация: 21.11.2009
Сообщений: 319
03.10.2013, 09:28     Отслеживание USB флешек #2
lanu4, В каком смысле запрет?
Можно заблокировать автозапуск с флешки
Можно запретить запись на флешку
Или же можно поотключать USB (не рекомендуется).

И еще вы хотите определить при подключении девайса или просто узнать есть ли съемный носитель?
lanu4
 Аватар для lanu4
14 / 14 / 1
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
03.10.2013, 09:40  [ТС]     Отслеживание USB флешек #3
Цитата Сообщение от Rapsod Посмотреть сообщение
lanu4, В каком смысле запрет?
Можно заблокировать автозапуск с флешки
Можно запретить запись на флешку
Или же можно поотключать USB (не рекомендуется).

И еще вы хотите определить при подключении девайса или просто узнать есть ли съемный носитель?
запрет в смысле чтоб даже на флешку не вошли. Так сказать и чтение и запись запретить. Просто щас отключаем в биосе порты USB, но появилась USB клава с мышкой и это стало проблемой. А отслеживание на подключение скорее всего, нужен момент когда она вставлена. ну или как вариант оповещать что флешку вставили и ругать того кто это сделал.
И нарыл код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TCHAR buf[100];
   int i;
   DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf);
 
   for(TCHAR* s=buf; *s; s+=_tcslen(s)+1)
   {
      LPCTSTR sDrivePath = s;
      UINT uDriveType = GetDriveType(sDrivePath);
      if (uDriveType == DRIVE_REMOVABLE) {
         // В системе может быть более одной флешки
         // Если таких несколько, функция вернет первую попавшуюся.
         ShowMessage(sDrivePath);
      }
   }
возвращает букву диска. Как основа.
Rapsod
Волшебник
 Аватар для Rapsod
62 / 61 / 4
Регистрация: 21.11.2009
Сообщений: 319
03.10.2013, 09:54     Отслеживание USB флешек #4
lanu4,
Вот держи. Это мы определяем подключение съемного носителя и сразу же ругаем

cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <dbt.h>
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
//----------------- Определение подключения USB устройства ---------------------
void __fastcall TForm1::WMDeviceChange(TMessage& Message)
{
  if (Message.Msg == WM_DEVICECHANGE && Message.WParam == DBT_DEVICEARRIVAL)
  {
       ShowMessage("Эй ты! Да ты! Ты только что подключил сьемный носитель! Отключи его по хорошему!)");
  }
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
и в хидере
H
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
    void virtual __fastcall WMDeviceChange(TMessage &Message); 
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    BEGIN_MESSAGE_MAP                                             
        MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMDeviceChange); 
    END_MESSAGE_MAP(TForm);                                       
 
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
lanu4
 Аватар для lanu4
14 / 14 / 1
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
03.10.2013, 09:58  [ТС]     Отслеживание USB флешек #5
Благодарствую!
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
03.10.2013, 10:04     Отслеживание USB флешек #6
Цитата Сообщение от Rapsod Посмотреть сообщение
ShowMessage("Эй ты! Да ты! Ты только что подключил сьемный носитель! Отключи его по хорошему!)");
А если пользователь не хочет по-хорошему ?
Rapsod
Волшебник
 Аватар для Rapsod
62 / 61 / 4
Регистрация: 21.11.2009
Сообщений: 319
03.10.2013, 10:33     Отслеживание USB флешек #7
Цитата Сообщение от Убежденный Посмотреть сообщение
А если пользователь не хочет по-хорошему ?
Ну как говориться "Не хотите по хорошему, будет по плохому". Поскольку программисты - это существа умные и довольно таки пакостные) Я думаю что в другой раз, пользователь побоится всунуть флешку
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
03.10.2013, 11:00     Отслеживание USB флешек #8
Цитата Сообщение от Rapsod Посмотреть сообщение
if (Message.Msg == WM_DEVICECHANGE && Message.WParam == DBT_DEVICEARRIVAL)
Кроме съемных носителей, пользователь может подключать и другие
устройства, и тогда тоже будет приходить DBT_DEVICEARRIVAL.

Цитата Сообщение от Rapsod Посмотреть сообщение
Я думаю что в другой раз, пользователь побоится всунуть флешку
Несеръезно.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
03.10.2013, 12:21     Отслеживание USB флешек #9
lanu4, вот смотри когда то давно писал функцию для определения всех жёстких дисков , CD дисков , и USB носителей
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void Searching(char AllHard[MAX_PATH],char AllCd[MAX_PATH],char AllUsb[MAX_PATH]){
         
char Al[3]={0};
char Znak[2]=":";
 
for(int Number = 65 ; Number<91 ; Number++){
        
Al[0]=CHAR(Number);
Al[1]=':';
 
 
if (GetDriveType(Al)==DRIVE_FIXED){
                                   
strcat(AllHard,Al);
}}         
  
  ///////////////////////////////////////
  
  for(int Number = 65 ; Number<91 ; Number++){
        
Al[0]=CHAR(Number);
Al[1]=':';
 
 
if (GetDriveType(Al)==DRIVE_CDROM){
                                   
strcat(AllCd,Al);
}}
  
  ////////////////////////////
  
  
  for(int Number = 65 ; Number<91 ; Number++){
        
Al[0]=CHAR(Number);
Al[1]=':';
 
 
if (GetDriveType(Al)==DRIVE_REMOVABLE){
                                   
strcat(AllUsb,Al);
}}
  
         
         }
и конечно пример использования -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(int argc, char *argv[])
{
    
    char Hard[MAX_PATH]={0};
    char Cd[MAX_PATH]={0};
    char Usb[MAX_PATH]={0};
    
    
    Searching(Hard,Cd,Usb);
    
cout<<"Hard - "<<Hard<<"\n"<<"Cd - "<<Cd<<"\n"<<"Usb - "<<Usb<<"\n";    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Rapsod
Волшебник
 Аватар для Rapsod
62 / 61 / 4
Регистрация: 21.11.2009
Сообщений: 319
03.10.2013, 12:30     Отслеживание USB флешек #10
Цитата Сообщение от Убежденный Посмотреть сообщение
Кроме съемных носителей, пользователь может подключать и другие
устройства, и тогда тоже будет приходить DBT_DEVICEARRIVAL.
Ну, это можно считать толчком к дальнем действиям и развитию данного продукта.

В былые времена, если я не ошибаюсь) то я определял тип устройства (диска)

Это выглядело так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
      // здесь узнаём готово ли устройство
      WORD OldErrorMode;
      OldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); // убираем показ ошибок
      bool ready = DirectoryExists(path); // пытаемcя открыть корневую директорию (диск который подключился (D:\))
      SetErrorMode(OldErrorMode); // восстанавливаем старый режим показа ошибок
 
      if (ready)
      {
         UINT drive_type = GetDriveType((dl+":\\").c_str()); // узнаём тип диска (dl - буква диска)
 
         if (drive_type == DRIVE_REMOVABLE)
         {
                           //Ваш код...
         }
      }
Ну как-то так

Несеръезно.
А что бы вы предложили?
lanu4
 Аватар для lanu4
14 / 14 / 1
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
03.10.2013, 13:26  [ТС]     Отслеживание USB флешек #11
Цитата Сообщение от Убежденный Посмотреть сообщение
А если пользователь не хочет по-хорошему ?
Я просто сделаю в файл сохранять время подключения + на почту. без сообщения. А потом проверять будут и уже "по шапке" надают. Главно корректно это дело определить

Добавлено через 3 минуты
Игорь с++, Ок, Спасибо. Под черпну из Вашего примера.
Rapsod, Про тип устройства,да. чтоб именно флешка была, надо посмотреть, что именно прилетает на срабатывание. В этом направлении буду смотреть.
PS буду службой делать.
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
03.10.2013, 15:25     Отслеживание USB флешек #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Rapsod Посмотреть сообщение
А что бы вы предложили?
Ну я бы замудрил какой-нибудь фильтр файловой системы, с отслеживанием
монтирования съемных носителей. Это был бы самый "железный" вариант.

Цитата Сообщение от lanu4 Посмотреть сообщение
Главно корректно это дело определить
MSDN пишет, что GetDriveType недостаточно, нужно проверять еще соответствующие
флаги устройства через SetupDiGetDeviceRegistryProperty.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2013, 03:49     Отслеживание USB флешек
Еще ссылки по теме:

C++ Отслеживание введенных данных
C++ Прерывание в си++, отслеживание нажатых клавиш
C++ Отслеживание значений переменных

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lanu4
 Аватар для lanu4
14 / 14 / 1
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
04.10.2013, 03:49  [ТС]     Отслеживание USB флешек #13
Цитата Сообщение от Убежденный Посмотреть сообщение
MSDN пишет, что GetDriveType недостаточно, нужно проверять еще соответствующие
флаги устройства через SetupDiGetDeviceRegistryProperty.
Ok. Посмотрю в этом направлении
Yandex
Объявления
04.10.2013, 03:49     Отслеживание USB флешек
Ответ Создать тему
Опции темы

Текущее время: 05:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru