Программа для восстановление отчетов Pincha v 2.99

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 29 May 2008.

Thread Status:
Not open for further replies.
  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Давно написал. И вот решил выложить на общий обзор.
    Программа предназначена для лечения кривых и не докаченных отчетов от Пинча,
    которые парсер не может прочитать.

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

    Первый вариант:
    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
    Лечение недокаченных отчетов происходит следующим образом: Отрезаются целые модули и к ним прибавляется код говоряший парсеру о конце файла

    Исходник можно замодить и под выделение отдельных модулей из отчета, увы таблицы модулей ненашел, а то можно былобы и реализовать.
    Code:
    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.
    
    
     
    3 people like this.
  2. diehard

    diehard Elder - Старейшина

    Joined:
    30 Sep 2007
    Messages:
    442
    Likes Received:
    266
    Reputations:
    15
    +++! Спасибо за утилиту, излечила все Malformed-отчеты для Parser2.3.1.8
    Вот бы еще такую же для 2.2.2.2
     
  3. disasembler

    disasembler Elder - Старейшина

    Joined:
    23 Mar 2008
    Messages:
    27
    Likes Received:
    2
    Reputations:
    0
    занчлся написанием своего парсера, ни у кого нет структуры отчетов пинча?
     
  4. BlackSun

    BlackSun Banned

    Joined:
    1 Apr 2007
    Messages:
    989
    Likes Received:
    1,168
    Reputations:
    446
    Если найдешь - поделись ссылкой :)
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Там вроде отдальная скруктура для каждого типа отчетов.
     
    1 person likes this.
  6. disasembler

    disasembler Elder - Старейшина

    Joined:
    23 Mar 2008
    Messages:
    27
    Likes Received:
    2
    Reputations:
    0
    а где их хоть можно достать?
    парсер неохота расковыривать(
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    disasembler У автора парсера ;)
     
  8. disasembler

    disasembler Elder - Старейшина

    Joined:
    23 Mar 2008
    Messages:
    27
    Likes Received:
    2
    Reputations:
    0
    а сорцы пинча 2.9 хоть где то скачать можно?
    говорили на форуме у глоффа, но сча он заглох(
     
  9. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Тема закрыта.
     
Thread Status:
Not open for further replies.