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

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

18.04.2012, 12:19. Просмотров 2516. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2012, 12:19
Ответы с готовыми решениями:

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

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

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

Определённые действия с TreeView...
Подскажите как для определённой группы в TreeView сделать условия? Пример: ПК Устройства ...

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

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

Добавлено через 11 минут
DRIVE_TYPE_UNDTERMINED не знаете какой синтаксис буден на С++ Builder?
0
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
1357 / 727 / 66
Регистрация: 28.01.2011
Сообщений: 2,046
18.04.2012, 16:11 5
функцию которая бы отлавливала момент обращения к проводнику
напоминаю про поиск по форуму совсем свежая тема...
1
Эксперт С++
8144 / 5917 / 585
Регистрация: 10.12.2010
Сообщений: 27,433
Записей в блоге: 24
18.04.2012, 17:59 6
Не понимаю, что защищает программа комп или флешку?
И почему не обойтись обычным антивирусником?

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

Но врятле такие программы канают в качестве защиты.
1
Почемучка)
1243 / 303 / 30
Регистрация: 23.12.2010
Сообщений: 2,000
Записей в блоге: 1
18.04.2012, 19:29  [ТС] 7
Но приходилось каждый раз менять атрибуты файлов и чистить флешку поэтому пришлось писать програмулену.
Вот я и написал програмулину)
Но в ней есть 1 недоработка.
Файлы вируса, ярлыки все удаляет.
Атрибуты делает стандартными.
Но если есть вирус на пк, то он после моей програмулинки повторно заражает флэшку, через пару секунд.
И тогда приходится использовать программу в ручном режиме(кнопкой лечение) и всё работает как надо.Но хотелось бы всё это автоматизировать.
0
Эксперт С++
8144 / 5917 / 585
Регистрация: 10.12.2010
Сообщений: 27,433
Записей в блоге: 24
18.04.2012, 20:09 8
Не проще ли установить на комп антивирусник? например NOD32 c этим справлялся (при последних обновлениях).

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

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

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

Добавлено через 4 минуты
Поток: программа зависает во время парсинга
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2012, 00:31

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

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

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

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

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


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

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

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