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

  #5  
Старый 23.10.2009, 08:33
s0l_ir0n
Участник форума
Регистрация: 14.03.2009
Сообщений: 237
С нами: 9031410

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

Цитата:
Сообщение от ErrorNeo  
задача
есть бинарный файл(200кб), в его теле 1 раз (смещение заранее не известно) содержится последовательность из заранее заданных 5 байт.
Требуется заменить эти 5 байт на другие заранее заданные 5 байт, сохранив все остальное, в.т.ч. и название файла.


(если более точно, то требуется заменить CD 16 0F 85 09 на CD 16 90 90 90 в одном системном файле)

вопрос в том как сделать это с минимумом камасутры, за ответы спс :-)
побайтово читать и сохраняя буффер из последних 5 символов писать новый файл, а затем удалить оригинал и на его место записать "новый" - в голову пришло. Но как-то это тупо...
кто-нибудь знает менее нерациональные способы?
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  windows;

var
FHWND:HWND;
OFS: OFSTRUCT;
buf:array [1..6] of byte;
tmpDW:DWORD;
i, fsize:integer;
const
sMask:array [1..6] of byte=($CD, $16, $0F, $85, $09, $00);
rMask:array [1..6] of byte=($CD, $16, $90, $90, $90, $00);
begin

FHWND:= OpenFile('Relase.exe', OFS, OF_READWRITE);

if FHWND = INVALID_HANDLE_VALUE then Exit;

fsize:=GetFileSize(FHWND,@tmpDW);

for I:=1 to fsize-5 do
begin
ReadFile(FHWND, buf, 5, tmpDW, nil);
    if lstrcmp(@buf,@sMask)=0
    then begin
             SetFilePointer(FHWND, -5, nil, FILE_CURRENT);
             WriteFile(FHWND, rMask, 5, tmpDW, nil);
             Exit;
         end;
SetFilePointer(FHWND, i, nil, FILE_BEGIN);
end;

CloseHandle(FHWND);
end.
з.ы.: в итерации ошибка скорее всего =)
 
Ответить с цитированием