Скрипт по замене файла beep.sys

Статус
В этой теме нельзя размещать новые ответы.

Drongo

Ассоциация VN/VIP
VIP
Сообщения
7,345
Реакции
4,793
В лечении нередко бывают случаи когда повреждённый\патченый\отсутствующий файл необходимо заменить на целый и чистый. Примером такого случая можно считать пропатчивание системного файла beep.sys. Восстановить файл из дистрибутива вручную можно с помощью команды expand. Описание процесса распаковки всегда будет занимать некоторое время, поэтому мы предлагаем вам автоматический скрипт для восстановления файлов из дистрибутива и\или из dllcache (в случае если там находится чистый файл.)

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

Внимание, некоторые патчи по украшению систем (ResPath, WinStyle) также патчат системные файлы, относитесь к таким файлам с разумным скепсисом.

Файлы можно восстанавливать в папки:
1. C:\Windows
2. C:\Windows\System32
3. C:\Windows\System32\Drivers
Для восстановления файлов используйте функцию FileRestore(CABNameFile, OriginalNameFile, NameFolder : String). Таких функций можно использовать несколько за раз. Некоторые файлы в дистрибутиве не будут сжаты в cab-архивы, поэтому в обоих параметрах можно написать оригинальные имена файлов. Ниже приведено несколько примеров использования функции:
FileRestore('BEEP.SY_', 'BEEP.SYS', '%windir%\system32\drivers\'); // Указываем имя: cab-имя и оригинальное. Копируется в X:\Windows\System32\Drivers
FileRestore('sfcfiles.dl_', 'sfcfiles.dll', '%windir%\system32\'); // Указываем имя: cab-имя и оригинальное. Копируется в X:\Windows\System32
FileRestore('REGEDIT.EXE', 'REGEDIT.EXE', '%windir%\'); // Пустой параметр копирует в %WinDir% - X:\Windows\

И собственно сам скрипт.

Код:
procedure FileRestore(CABNameFile, OriginalNameFile, NameFolder : String);
var i : integer;
begin
if (FileExists('%windir%\system32\dllcache\' + OriginalNameFile) and (CalkFileMD5('%windir%\system32\dllcache\' + OriginalNameFile) <> CalkFileMD5(NameFolder + OriginalNameFile))) then
  begin
    RenameFile(NameFolder + OriginalNameFile, NameFolder + 'Bakcup.bak');
    CopyFile('%windir%\system32\dllcache\' + OriginalNameFile, NameFolder + OriginalNameFile);
    DeleteFile(NameFolder + 'Bakcup.bak');
    AddToLog('Замена ' + OriginalNameFile + ' успешно произведена из dllcache');
  end
else if not FileExists('%windir%\system32\dllcache\' + OriginalNameFile) then
  begin
    ShowMessage('Вставьте диск с Windows');
    for i := 65 to 90 do
      if(GetDriveType(Chr(i) + ':\') = 5) and (FileExists(Chr(i) + ':\i386\' + CABNameFile)) then
       begin
         ExecuteFile('expand.exe ' + Chr(i) + ':\I386\' + CABNameFile + ' ' + NameFolder + OriginalNameFile, '', 0, 10000, true);
         AddToLog('Замена успешно произведена из ' + Chr(i) + ':\I386\');
       end;
  end;
end;

begin
FileRestore('BEEP.SY_', 'BEEP.SYS', '%windir%\system32\drivers\'); // Указываем имя: cab-имя и оригинальное
SaveLog(GetAVZDirectory + 'SafeZone.log');
end.
После выполнения скрипта просите пользователя прикрепить лог SafeZone.log, который будет создан в папке утилиты AVZ.
 
Последнее редактирование модератором:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу