#include
#include
#include
#include
#include
#include
#define F_FOUND 0
#define PATH_LEN 128
#define DRIVE_LEN 4
#define BLANK_LEN 80
#define BAD 1
#define GOOD 0
#define DBG
char
/* Строка имени текущего подкаталога */
path[PATH_LEN],
/* Строка имени начального места расположения */
old_path[PATH_LEN],
/* Строка имени требуемого устройства */
drive[DRIVE_LEN],
/* Пустая строка */
blank[BLANK_LEN];
int
/* Количество отсканированных каталогов */
n_dir,
/* Количество исследованных файлов */
n_fil,
/* Количество больных и исцеленных файлов */
n_ill;
int
/* Длина имени файла */
l,
/* Временный индекс */
i;
#include ”antilib.c”
/* Рекурсивная процедура обхода дерева каталогов */
walk()
{
int found_d, found_f;
struct find_t buf;
/* Поиск каталогов */
found_d=_dos_findfirst(”*.*”,_A_SUBDIR ,&buf);
while (found_d == F_FOUND)
{
if ((buf.name[0] != ”.”) && (buf.attrib & _A_SUBDIR ))
{
chdir(buf.name);
walk();
chdir(”..”);
}
found_d=_dos_findnext( &buf );
}
/* К этому моменту не отсканированных нижележащих каталогов
больше не осталось – сканируем файлы */
n_dir++;
getcwd( path, PATH_LEN );
/* Поиск файлов */
found_f=_dos_findfirst(”*.*”,_A_NORMAL ,&buf);
while (found_f == F_FOUND)
{
l=strlen( buf.name );
if (((buf.name[l−3]==”C”)&&
(buf.name[l−2]==”O”)&&
(buf.name[l−1]==”M”))||
((buf.name[l−3]==”E”)&&
(buf.name[l−2]==”X”)&&
(buf.name[l−1]==”E”)))
{
n_fil++;
printf(”%c%s”,13,blank);
printf(”%c%s\\%s ”,13,path,buf.name);
/* Нашли новый файл – надо проверить, инфицирован ли он.
Если заражен, то лечим */
if (infected(buf.name)==BAD) cure(buf.name);
}
found_f=_dos_findnext( &buf );
}
}
main( int argc, char *argv[] )
{
puts(”ANTISVC – демонстрационный антивирус−фаг”);
if (argc < 2)
{ puts(”Введите имя диска в качестве параметра”); exit(2); }
if (((toupper(argv[1][0]))>”Z”)||((toupper(argv[1][0]))<”A”))
{ puts(”Неверно задано имя диска”); exit(3); }
drive[0]=argv[1][0]; drive[1]=”:”; drive[3]=”\0’;
for (i=0;in_dir=0; n_fil=0;
getcwd(old_path, PATH_LEN);
drive[2]=”\0”; system(drive);
drive[2]=”\\”; chdir(drive);
/* Запускаем рекурсивный обход дерева каталогов
для выбранного диска */
walk();
old_path[2]=”0”; system(old_path);
old_path[2]=”\\”; chdir(old_path);
printf(”\nКаталогов : %d\nФайлов : %d\nОбнаружено больных
и излечено: %d”, n_dir, n_fil, n_ill);
if (n_ill) exit(1); else exit(0);
}
Файл «ANTILIB.C», включаемый в предыдущий:
/***************************************************************