Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Ddv122
Почемучка)
1240 / 300 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
1

Определенные действия при подключении флэшки

18.04.2012, 12:19. Просмотров 2186. Ответов 15
Метки нет (Все метки)

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
  if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 ) {
        char DiskLabel[MAX_PATH];
        WORD OldErrorMode;
        AnsiString dl;
        DWORD dr = GetLogicalDrives( );  // функция возвращает битовую маску
        for ( int x = 1; x < 26; x++ ) { // проходимся циклом по битам
            if ( ( dr >> x ) & 1 ) {     // узнаём значение текущего бита, если единица - диск с номером x есть
                dl = AnsiString( ( char )( 65 + x ) ) + "://"; // получаем литеру диска
                OldErrorMode = SetErrorMode( SEM_FAILCRITICALERRORS ); // убираем показ ошибок
                bool ready = DirectoryExists(dl); // пытаемcя открыть корневую директорию
                if (ready)
                {   // пытаемcя открыть корневую директорию
                    UINT DriveType = GetDriveType( dl.c_str( ) ); // получаем тип диска
                    if ( DriveType != DRIVE_CDROM && // исключаем CDROMы
                            DriveType != DRIVE_FIXED) // исключаем  HDD
                            {
                        PlaySoundW( L"alert.wav", 0, SND_ASYNC );   //проигрываем звук
                        GetVolumeInformation( dl.c_str( ), DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0 );
                        ComboBox1->Items->Add(( dl + "//" ) + " [" + DiskLabel + "]" );
                        // для отчета
                        dt = Now( ); // формат даты
                        memo->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) +
                                          " " + " - " + " Подключен накопитель: " "(" + ( dl ) +
                                          ")" + " " + DiskLabel + "" );
                        if ( Settings->CheckBox5->Checked ) {   //если стоит галочка на  CheckBox
                            Button1->Click( );                  //НАЖИМАЕТСЯ Button
                        }
                        if ( Settings->CheckBox6->Checked ) {   //если стоит галочка на  CheckBox
                            Button5->Click( );                  //НАЖИМАЕТСЯ Button
                        }
                        if ( Settings->CheckBox7->Checked ) {   //если стоит галочка на  CheckBox
                            Button2->Click( );                  //НАЖИМАЕТСЯ Button
                        }
                        if ( Settings->CheckBox8->Checked ) {   //если стоит галочка на  CheckBox
                            Button3->Click( );                  //НАЖИМАЕТСЯ Button
                        }
                        if ( Settings->CheckBox9->Checked ) {    //если стоит галочка на  CheckBox
                            Button4->Click( );                   //НАЖИМАЕТСЯ Button
                        }
                    }
                }
            }
        }
    }
}
Этот код позволяет выполнять определенные действия при подключении флэшки
Все работает хорошо.Но есть 1 проблема
Код перехватывает флэшку , удаляет с неё необходимые папки, и диск появляется в системе.
1)Мне нужно удалить папки ищё раз при появлении диска в explorere или примерно через 10 секунд после выполнения этого кода.
2)И ещё раз удалить папки при отключении флэшки.
По 1 пункту таймер делать не сообразно, так как время может менятся от 3-20 сек.
Нужно как то повторить код, после этого кода с задержкой 2 секунды.
Я понимаю что по 2 пункту нужно копать в сторону
C++
1
WM_DEVICECHANGE && Message.WParam == 0x8000
Может кто небудь чем небудь поможет?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2012, 12:19
Ответы с готовыми решениями:

Выполнять определенные действия при любом выходе из функции
Есть функция, в которой ряд ветвлений и return'ов... при этом хотелось бы при каждом return'е...

Label не меняет текст при подключении флэшки
Добрый день. Пробую записывать файлы на флешку по событию подключения USB, все функции работают, но...

Определенные действия программы при разрыве сети
Как сделать так, что бы при сбои сети, к примеру, когда связь розорвата, а я пытаюсь что то...

Сделать так чтобы при подключении нулевого порта выполнялся один цикл кода а при подключении другого - другой
Как сделать так чтобы при подключении нулевого порта выполнялся один цикл кода, а при подключении...

Определить четность числа и выполнить определенные действия
доброго времени суток, помогите пожалуйста, завтра экзамен((( Рассмотрим некоторое натуральное...

15
LK
Заблокирован
18.04.2012, 12:29 2
Цитата Сообщение от EdarGp Посмотреть сообщение
Код перехватывает флэшку , удаляет с неё необходимые папки, и диск появляется в системе.
1)Мне нужно удалить папки ищё раз при появлении диска в explorere или примерно через 10 секунд после выполнения этого кода.
2)И ещё раз удалить папки при отключении флэшки.
Цель-то какая? Не лихое ли дело вы задумали?
0
Ddv122
Почемучка)
1240 / 300 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
18.04.2012, 12:52  [ТС] 3
Цель-то какая? Не лихое ли дело вы задумали?
Программа для универа, в стадии Beta уже запущена и работает
+> Удаляет все файлы с расширением *.lnk с корня флэшки
+> Убирает скрытый и системный атрибут у всех файлов в корне флэшки
+> удаление файлов и папок по черному списку

В таком роде маленький "антивирус"...Но проблема такова, флэшку то она чистит, ну если вирус есть на пк, он её повторно заражает.через секунды после моей программы.Заражение происходит тогда когда диск появляется в explorer . а это уже после кода.

Добавлено через 11 минут
DRIVE_TYPE_UNDTERMINED не знаете какой синтаксис буден на С++ Builder?
0
DefineTrueFalse
870 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
18.04.2012, 13:08 4
Цитата Сообщение от EdarGp Посмотреть сообщение
2)И ещё раз удалить папки при отключении флэшки.
Анриал в случае с вирусом. При безопасном отключении вирус, в лучшем случае в последний момент запишет свои файлы и произойдет отключение, а в обычном варианте - безопасное отключение будет невозможно из-за того, что файлы заняты. Удалить перед тем, как ее нервно вынут... при такой постановке у меня в голове всегда мысли о проводах подведенных к креслу. В случае, если вирус повторно записывает данные один раз, что мешает отмерить минуту, удалить повторно и сообщить "Вселенная больше не в апасносте!!1"
Цитата Сообщение от EdarGp Посмотреть сообщение
Нужно как то повторить код, после этого кода с задержкой 2 секунды.
C++
1
2
KillAndDestoy();
Sleep(2000);
Для справки: 99% университетских вирусов блокируются установкой NTFS на накопитель и блока основного каталога для записи, для всех кроме указанных пользователей (обычно админская учетка на домашнем стационаре). А еще лучше, выдать права на запись только одной папке на флешке (некий буфер/шлюз), тогда вирусы вообще обижаются.

Добавлено через 2 минуты
Цитата Сообщение от EdarGp Посмотреть сообщение
DRIVE_TYPE_UNDTERMINED не знаете какой синтаксис буден на С++ Builder?
Насколько помню, GetDriveType - WinAPI функция, а значит такой же
2
18.04.2012, 13:08
Samrisbe
1353 / 723 / 66
Регистрация: 28.01.2011
Сообщений: 2,004
18.04.2012, 16:11 5
функцию которая бы отлавливала момент обращения к проводнику
напоминаю про поиск по форуму совсем свежая тема...
1
Avazart
Нарушитель
Эксперт С++
7904 / 5728 / 565
Регистрация: 10.12.2010
Сообщений: 26,217
Записей в блоге: 17
18.04.2012, 17:59 6
Не понимаю, что защищает программа комп или флешку?
И почему не обойтись обычным антивирусником?

В свое время на институте ходил вирус который скрывал папки на флешке и и фигачил вместо них ярлыки на самого себя,авторан клепал и себя копировал.
Лечился легко антивирусом. Но приходилось каждый раз менять атрибуты файлов и чистить флешку поэтому пришлось писать програмулену.

Но врятле такие программы канают в качестве защиты.
1
Ddv122
Почемучка)
1240 / 300 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
18.04.2012, 19:29  [ТС] 7
Но приходилось каждый раз менять атрибуты файлов и чистить флешку поэтому пришлось писать програмулену.
Вот я и написал програмулину)
Но в ней есть 1 недоработка.
Файлы вируса, ярлыки все удаляет.
Атрибуты делает стандартными.
Но если есть вирус на пк, то он после моей програмулинки повторно заражает флэшку, через пару секунд.
И тогда приходится использовать программу в ручном режиме(кнопкой лечение) и всё работает как надо.Но хотелось бы всё это автоматизировать.
0
Avazart
Нарушитель
Эксперт С++
7904 / 5728 / 565
Регистрация: 10.12.2010
Сообщений: 26,217
Записей в блоге: 17
18.04.2012, 20:09 8
Не проще ли установить на комп антивирусник? например NOD32 c этим справлялся (при последних обновлениях).

Я пытался отследить что делает вирус и понял что ехе файл может быть с разным именем, а значит и пытаться отследить его будет тяжело.

Если вы всетаки хотите защитить флешку, то стоит по видимому искать в направлении отслеживания копирования файлов.

Знаю есть такая вещь как мониторинг каталогов, может её применить ну или тупо сверять размер данных на флешки с размером после чистки и проводить чистку если она отличается
1
Ddv122
Почемучка)
1240 / 300 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
19.04.2012, 17:45  [ТС] 9
Avazart, я то понимаю что лучше поставить антивирусник, но это универ, и не кто не следит за компьютерами и т.д...И + это моя дипломная работа.
удаление всех скрытых *.exe с ApplicationData (в разных каталогах) в XP и в user\appdata в win7.
Вот это вирус.
мне по сути просто нужно повторить мой код, при появлении диска в explorer.
DRIVE_TYPE_UNDTERMINED...
Код
[C++ Error] Unit1.cpp(64): E2451 Undefined symbol 'DRIVE_TYPE_UNDTERMINED'
Не понимаю, что защищает программа комп или флешку?
И почему не обойтись обычным антивирусником?
Программа в принципе защищает и то и то ,
Для пк- программа удаляет (файлы и папки)вируса, ярлыки до того как диск появится в exploorer
Для флэшки- уберает сурытые атрибуты файлов и папок с корня диска

Добавлено через 31 минуту
KillAndDestoy();
Sleep(2000);
KillAndDestoyВ builder 2006 такого нет)не в справке, не в google
0
Avazart
Нарушитель
Эксперт С++
7904 / 5728 / 565
Регистрация: 10.12.2010
Сообщений: 26,217
Записей в блоге: 17
19.04.2012, 17:50 10
C++
1
DRIVE_TYPE_UNDTERMINED
Так это ведь числовая констана нужно просто найти её определение в h файлах и взять ее числовое значение
1
Ddv122
Почемучка)
1240 / 300 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
20.04.2012, 18:47  [ТС] 11
KillAndDestoy();
Sleep(2000);
Можете пояснить?
0
DefineTrueFalse
870 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
20.04.2012, 23:03 12
Цитата Сообщение от EdarGp Посмотреть сообщение
KillAndDestoyВ builder 2006 такого нет)не в справке, не в google
Я бы весьма удивился, если бы нашлось. Под "убить и уничтожить" я имел ввиду вашу процедуру по удалению файлов. А затем ожидание в 2 секунды после этого действия. Но если хотите более "точную" синхронизацию, то используйте функции в отдельном потоке, а потом используйте WaitForSingleObject для того, чтобы синхронизировать действия, но мне по прежнему кажется странным метод борьбы с вирусом на флешке.
1
Ddv122
Почемучка)
1240 / 300 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
20.04.2012, 23:53  [ТС] 13
C++
1
2
    Button3Click(Sender);
    Sleep(2000);
Приводит к зависанию...
0
Avazart
Нарушитель
Эксперт С++
7904 / 5728 / 565
Регистрация: 10.12.2010
Сообщений: 26,217
Записей в блоге: 17
21.04.2012, 00:02 14
Ну поэтому и должно быть в потоке...
1
Ddv122
Почемучка)
1240 / 300 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
21.04.2012, 00:13  [ТС] 15
Цитата Сообщение от Avazart Посмотреть сообщение
Ну поэтому и должно быть в потоке...
Что то я не дочитал на радостях, извиняюсь, а как создать правильно поток? File | New | Other |Thread Object. Всё что я знаю
0
Avazart
Нарушитель
Эксперт С++
7904 / 5728 / 565
Регистрация: 10.12.2010
Сообщений: 26,217
Записей в блоге: 17
21.04.2012, 00:31 16
Либо CreateThread(), но это не всегда подходит

Добавлено через 4 минуты
Поток: программа зависает во время парсинга
1
21.04.2012, 00:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2012, 00:31

Выполнять действия через определенные интервалы таймера
Нужно считывать информацию с таймера и в соответствии со временем делать клик мышкой. Таймер до...

Написать командный файл, выполняющий определенные действия
Привет. Задание такое: Нужно переделать задачу чтобы она соответствовала новому условию: ...

Написать автотест, который будет выполнять определенные действия
Здравствуйте! В общем такая тема, на работе сильно требуют знания С# и выдали задачку для освоения....


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

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