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.
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.