Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Программа для восстановление отчетов Pincha v 2.99 (https://forum.antichat.xyz/showthread.php?t=71899)

slesh 29.05.2008 10:37

Программа для восстановление отчетов Pincha v 2.99
 
Давно написал. И вот решил выложить на общий обзор.
Программа предназначена для лечения кривых и не докаченных отчетов от Пинча,
которые парсер не может прочитать.

Использование программы:

Первый вариант:
pld.exe -d [-o] in_dir_name [out_dir_name]

где in_dir_name - путь к папке с кривыми отчетами
out_dir_name - путь к папке в которую будут кидаться излеченные отчеты,
если не указать этот параметр, то излеченные файлы будут находиться в
папке с кривыми отчетами.
-o - не обязательный параметр. При его использовании удаляется модуль содержащий
отчеты из Оперы(очень часто они бывают ошибочными)

Если путь содержит пробелы то необходимо взять его в ковычки.
При таком варианте использования будут обработаны все файлы с расширением *.err в папке dir_name.
Исправленные файлы будут иметь имя - file_name.err.pld

Пример:
pld.exe -d c:\pinch\log\Malformed\
pld.exe -d "c:\my pinchlog\Malformed\"
pld.exe -d -o c:\pinch\log\Malformed\ c:\norm\

Второй вариант:
pld.exe [-o] file_name

где file_in - имя файла требующего лечения.
Если путь или имя содержат пробелы то необходимо взять его в ковычки.
При таком варианте использования будет обработан только один входной файл.
Исправленный файл будут иметь имя - file_name.pld

Пример:
pld.exe c:\pinch\log\Malformed\12E0AB4578.err
pld.exe -o "c:\my pinchlog\log\Malformed\12E0AB4578.err"

P.S. Кривые отчеты парсер хранит в папке Malformed
Лечение недокаченных отчетов происходит следующим образом: Отрезаются целые модули и к ним прибавляется код говоряший парсеру о конце файла

Исходник можно замодить и под выделение отдельных модулей из отчета, увы таблицы модулей ненашел, а то можно былобы и реализовать.
Код:

program pld_v2;

{$APPTYPE CONSOLE}
uses windows;
type
 Tlogs=packed record
  magic:array[0..3] of char;
  id:LongWord;
  size:LongWord;
 end;

 var
 opera_del:boolean=false;

function fileexists(s:string):boolean;
var
 FindData:TWin32FindData;
 Handle:integer;
begin
 Handle:=FindFirstFile(PChar(s),FindData);
 if Handle<0 then result:=false else result:=true;
end;

function Str2DW(s:string):dword;
begin
 result:=ord(s[5])+ord(s[6]) shl 8+ord(s[7])shl 16+ord(s[8]) shl 24 ;
end;

function doctor(file_in,file_out:string):integer;
var
 f_in,f_out:thandle;
 logs:Tlogs;
 rb:cardinal;
 file_size:dword;
 block:string;
 rec:string;
 rec_size:dword;
const
 P3ML='P3ML';
begin
 result:=1;
 f_in:=CreateFile(PChar(file_in), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 if f_in=INVALID_HANDLE_VALUE then exit;
 file_size:=GetFileSize(f_in,nil);
 setlength(block,file_size);
 ReadFile(f_in, block[1], file_size, rb, nil);
 CloseHandle(f_in);
 if rb<>file_size then
  begin
  setlength(block,0);
  inc(result);
  exit;
  end;
 if copy(block,1,4)<>'P3ML' then
  begin
  setlength(block,0);
  inc(result);
  exit;
  end;
 inc(result);
 f_out:=CreateFile(PChar(file_out), GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
 if f_out=INVALID_HANDLE_VALUE then exit;

 delete(block,1,4);
 while pos('P3ML',block)<>0 do
  begin
  rec:=copy(block,1,pos('P3ML',block)+3);
  if length(rec)<12 then
    begin
    Delete(block,1,length(rec));
    continue;
    end;
  rec_size:=Str2DW(rec);
  if (rec_size=length(rec)-8) then
    begin
    if (opera_del=true) and (rec[1]=#$0F) then
      begin
      Delete(block,1,length(rec));
      continue;
      end;
    WriteFile(f_out, P3ML, 4,rb, nil);
    WriteFile(f_out, rec[1], length(rec)-4,rb, nil);
    end;
  Delete(block,1,length(rec));
  end;

 logs.magic:=P3ML;
 logs.id:=$FFFFFFFF;
 logs.size:=0;
 WriteFile(f_out, logs, 12,rb, nil);
 CloseHandle(f_out);
 result:=0;
end;

function GetSmallName(s:string):string;
begin
 while pos('\',s)<>0 do delete(s,1,pos('\',s));
 result:=s;
end;

var
 fd:_WIN32_FIND_DATAA;
 fh:dword;
 out_dir:string;
 param:integer;
begin
writeln('Pinch Log Doctor (C) SLESH 2008');
writeln('E-MAIL: SLESH-2000@mail.ru');
writeln('ICQ: 266-334-734');
writeln('WMZ: Z671833489051');
writeln('WMR: R156568501269');
param:=1;
 if (paramstr(param)='') then
  begin
  writeln(#13#10'Usage: pld.exe -d -o in_dir_name [out_dir_name] - All *.err file');
  writeln('      pld.exe -o file_in - One file');
  writeln('-o Delete Opera Module');
  exit;
  end;
if paramstr(param)='-d' then
 begin
  inc(param);
  if paramstr(param)='-o' then
  begin
    opera_del:=true;
    inc(param);
  end;

  if (paramstr(param)='') then
  begin
  writeln(#13#10'Usage: pld.exe -d in_dir_name [out_dir_name]- All *.err file');
  writeln('      pld.exe file_in - One file');
  exit;
  end;
  out_dir:=paramstr(param+1);
  if out_dir='' then out_dir:=paramstr(param);
  writeln;
  fh:=FindFirstFile(pchar(paramstr(param)+'\*.err'),fd);
  if fh=INVALID_HANDLE_VALUE then exit;
  repeat
  write(GetSmallName(fd.cFileName)+' ');
  case doctor(paramstr(param)+'\'+fd.cFileName,out_dir+'\'+fd.cFileName+'.pld') of
    1:writeln('[-] Can not open input file');
    2:writeln('[-] Can not read input file');
    3:writeln('[-] Can not correct');
    4:writeln('[-] Can not create output file');
    0:writeln('[+] Report is corrected successfully');
  end;
  until FindNextFile(fh,fd)=false;
  exit;
 end;

if paramstr(param)='-o' then
 begin
  opera_del:=true;
  inc(param);
  end;
if not fileexists(paramstr(param)) then
 begin
  writeln(#13#10'[-] Error: input file not found');
  exit;
 end;
deletefile(pchar(paramstr(1)+'.pld'));
case doctor(paramstr(param),paramstr(param)+'.pld') of
    1:writeln(#13#10'[-] Can not open input file');
    2:writeln(#13#10'[-] Can not read input file');
    3:writeln(#13#10'[-] Can not correct');
    4:writeln(#13#10'[-] Can not create output file');
    0:writeln(#13#10'[+] Report is corrected successfully');
end;
end.


diehard 29.05.2008 11:02

+++! Спасибо за утилиту, излечила все Malformed-отчеты для Parser2.3.1.8
Вот бы еще такую же для 2.2.2.2

disasembler 04.06.2008 23:11

занчлся написанием своего парсера, ни у кого нет структуры отчетов пинча?

BlackSun 05.06.2008 10:49

Цитата:

Сообщение от disasembler
занчлся написанием своего парсера, ни у кого нет структуры отчетов пинча?

Если найдешь - поделись ссылкой :)

slesh 05.06.2008 11:26

Там вроде отдальная скруктура для каждого типа отчетов.

disasembler 10.06.2008 12:38

а где их хоть можно достать?
парсер неохота расковыривать(

slesh 10.06.2008 13:40

disasembler У автора парсера ;)

disasembler 11.06.2008 06:27

а сорцы пинча 2.9 хоть где то скачать можно?
говорили на форуме у глоффа, но сча он заглох(

De-visible 11.06.2008 12:00

Тема закрыта.


Время: 15:37