TChag-Pe‎ > ‎

func.pas

unit func;

interface

uses Windows,Pe_Ref,SysUtils;


function sol_A(v:Cardinal):string;
function sol_B(v:Cardinal):string;
function sol_C(v:Cardinal):string;
function sol_Hint(v:Cardinal):word;
function WideCharToStr(WStr: PWChar; Len: Integer): string;
function get_rva(rva:Cardinal):Cardinal;


implementation
//==============================================================================

function sol_A(v:Cardinal):string;
var
P_usr:P_STRING_U;
begin

if v and $80000000 = 0 then
     begin
     if v in [1..16] then
     result:=id[v] else result:=inttostr(v);
     end
     else
     begin
     p_usr:=P_STRING_U(Cardinal(P_Dos)+res_ofs+(v and $7FFFFFFF));
     Result:= WideCharToStr(@P_usr.NameString, P_usr.Length);
     end;
end;

//------------------------------------------------------------------------------

function sol_B(v:Cardinal):string;
var
P_usr:P_STRING_U;
begin

if v and $80000000 = 0 then
     result:=inttostr(v)
     else
     begin
     p_usr:=P_STRING_U(Cardinal(P_Dos)+(v and $7FFFFFFF)+res_ofs);
     Result:= WideCharToStr(@P_usr.NameString, P_usr.Length);
     end;
end;
//------------------------------------------------------------------------------

function sol_C(v:Cardinal):string;
var
p_ch :P_char;
begin
result:='';

p_ch:=P_char(Cardinal(P_Dos)+get_rva(v and $7FFFFFFF));

repeat
Result:=Result+p_ch^;
inc(P_char(p_ch));
until
ord(p_ch^)=$00;

end;

//------------------------------------------------------------------------------

function sol_Hint(v:Cardinal):word;
var
P_n :P_hint;
begin
try
p_n:=P_hint(Cardinal(P_Dos)+get_rva(v and $7FFFFFFF));
result:=p_n^;
except
result:=0;
end;
end;

//------------------------------------------------------------------------------

function WideCharToStr(WStr: PWChar; Len: Integer): string;
begin
  if Len = 0 then Len := -1;
  Len := WideCharToMultiByte(CP_ACP, 0, WStr, Len, nil, 0, nil, nil);
  SetLength(Result, Len);
  WideCharToMultiByte(CP_ACP, 0, WStr, Len, PChar(Result), Len, nil, nil);
end;



//------------------------------------------------------------------------------
//  The Magic Master Function  Finds and Converts RVA to file Offset  :)
//------------------------------------------------------------------------------
function get_rva(rva:Cardinal):Cardinal;
var
i:word;
secoo:P_SECTo_HEADER;
begin

secoo:=P_SECTo_HEADER(p_nt);
Inc(P_NT_HEADER(secoo));
result:=0;

for  i:=0 to P_Nt.F_Header.NumberOfSections -1 do
begin
                 // Is the rva  in this section ?
  if ( (rva >= secoo.VirtualAddress) and (rva < (secoo.VirtualAddress + secoo. Misc.VirtualSize))) then
  begin          // if so   do
  result:=secoo.PointerToRawData + rva - secoo.VirtualAddress;
  break;
  exit;
  end;
Inc(secoo);
end;

end;

//------------------------------------------------------------------------------



end.





../delphi71code/tchag-pe-portable-executable-structure-extractor/func-pas..