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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
lanu4
15 / 15 / 1
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
#1

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

03.10.2013, 08:15. Просмотров 2390. Ответов 12
Метки нет (Все метки)

Доброго времени суток. Хотелось бы услышать, как корректно определить USB флэшку?
Необходимость появилась в этом, потому что надо сделать запрет на открытие флэшки на компе. И при запрете не запретить клаву с мышкой USB. Можете подкинуть примеры по определению флэшек?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2013, 08:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отслеживание USB флешек (C++):

Отслеживание подключений по Wi-Fi - C++
День добрый форумчане, собственно вопрос: написал программу которая включает сеть wi-fi, как сделать так, чтобы она сворачивалась в трей...

Отслеживание введенных данных - C++
Доброго времени суток, Уважаемые форумчане. Столкнулся с проблемой. Есть необходимость отслеживать введенные данные. Нужно что бы данные...

Отслеживание нажатия клавиш. - C++
#include <iostream> #include <string> #define FOR(i,a,b) for (int i(a), _n(b); i < _n; ++i) using namespace std; int...

Отслеживание действий мыши - C++
Всем привет, хотелось бы сделать хук на мышь, не подскажете литературу или методы существующие Спасибо

Отслеживание нажатия клавиш на C++ - C++
Здравствуте, прочитал статью про то как перехватывать нажатие клавиш средствами...

Отслеживание нажатия клавиш - C++
Помогите решить Напишите программу, печатающие коды, генерируемые при нажатии любой клавиши или комбинации клавиш. Используйте функцию...

12
Rapsod
Волшебник
63 / 62 / 4
Регистрация: 21.11.2009
Сообщений: 319
03.10.2013, 09:28 #2
lanu4, В каком смысле запрет?
Можно заблокировать автозапуск с флешки
Можно запретить запись на флешку
Или же можно поотключать USB (не рекомендуется).

И еще вы хотите определить при подключении девайса или просто узнать есть ли съемный носитель?
0
lanu4
15 / 15 / 1
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
03.10.2013, 09:40  [ТС] #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);
      }
   }
возвращает букву диска. Как основа.
0
Rapsod
Волшебник
63 / 62 / 4
Регистрация: 21.11.2009
Сообщений: 319
03.10.2013, 09:54 #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
1
lanu4
15 / 15 / 1
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
03.10.2013, 09:58  [ТС] #5
Благодарствую!
0
Убежденный
Системный программист
Эксперт С++
15633 / 7143 / 1130
Регистрация: 02.05.2013
Сообщений: 11,582
Записей в блоге: 1
Завершенные тесты: 1
03.10.2013, 10:04 #6
Цитата Сообщение от Rapsod Посмотреть сообщение
ShowMessage("Эй ты! Да ты! Ты только что подключил сьемный носитель! Отключи его по хорошему!)");
А если пользователь не хочет по-хорошему ?
0
Rapsod
Волшебник
63 / 62 / 4
Регистрация: 21.11.2009
Сообщений: 319
03.10.2013, 10:33 #7
Цитата Сообщение от Убежденный Посмотреть сообщение
А если пользователь не хочет по-хорошему ?
Ну как говориться "Не хотите по хорошему, будет по плохому". Поскольку программисты - это существа умные и довольно таки пакостные) Я думаю что в другой раз, пользователь побоится всунуть флешку
0
Убежденный
Системный программист
Эксперт С++
15633 / 7143 / 1130
Регистрация: 02.05.2013
Сообщений: 11,582
Записей в блоге: 1
Завершенные тесты: 1
03.10.2013, 11:00 #8
Цитата Сообщение от Rapsod Посмотреть сообщение
if (Message.Msg == WM_DEVICECHANGE && Message.WParam == DBT_DEVICEARRIVAL)
Кроме съемных носителей, пользователь может подключать и другие
устройства, и тогда тоже будет приходить DBT_DEVICEARRIVAL.

Цитата Сообщение от Rapsod Посмотреть сообщение
Я думаю что в другой раз, пользователь побоится всунуть флешку
Несеръезно.
0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
03.10.2013, 12:21 #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;
}
1
Rapsod
Волшебник
63 / 62 / 4
Регистрация: 21.11.2009
Сообщений: 319
03.10.2013, 12:30 #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)
         {
                           //Ваш код...
         }
      }
Ну как-то так

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

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

Цитата Сообщение от lanu4 Посмотреть сообщение
Главно корректно это дело определить
MSDN пишет, что GetDriveType недостаточно, нужно проверять еще соответствующие
флаги устройства через SetupDiGetDeviceRegistryProperty.
4
lanu4
15 / 15 / 1
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
04.10.2013, 03:49  [ТС] #13
Цитата Сообщение от Убежденный Посмотреть сообщение
MSDN пишет, что GetDriveType недостаточно, нужно проверять еще соответствующие
флаги устройства через SetupDiGetDeviceRegistryProperty.
Ok. Посмотрю в этом направлении
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2013, 03:49
Привет! Вот еще темы с ответами:

Отслеживание изменения переменной - C++
Есть переменная, допустим int a;, хочу в логике работы софта сделать отслеживание изменения переменной, но не хочу тратить на каждую...

Отслеживание значений переменных - C++
доброго времени суток:) как проследить в Dev Cpp изменяющиеся значения переменных, пошагово бегая по циклу? типа как в паскале

Отслеживание изменения независимого файла - C++
Возможно, этот вопрос уже проскакивал, но тем не менее...... Итак, проблема такова: имеется некоторый конфиг-файл и необходимо при любом...

Отслеживание границ объектов (Арканоид) - C++
Здравствуйте, я к вам с, наверное, поднадоевшим вам уже Арканоидом. Пишу его в dev-cpp с использованием стандартной graphics.h, и вот...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
04.10.2013, 03:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru