We don't display ads so we rely on your Bitcoin donations to 1KWEk9QaiJb2NwP5YFmR24LyUBa4JyuKqZ
Post date: Nov 5, 2010 12:17:18 AM
This delphi unit, written by testest, allows you to easily write and settings to and from the selected portable executable's resource section. Encryption is optional.
unit RcDataHelper;
//Author: testest
interface
uses Windows;
{$DEFINE ENCRYPT}
type
TRCWriter = class(TObject)
private
FBuffer: Pointer;
FSize: Cardinal;
public
constructor Create;
procedure WriteBuffer(const Source; const Count: Cardinal);
procedure WriteInteger(const Value: Integer);
procedure WriteCardinal(const Value: Cardinal);
procedure WriteByte(const Value: Byte);
procedure WriteChar(const Value: Char);
procedure WriteBoolean(const Value: Boolean);
procedure WriteString(const Value: String);
{$IFDEF ENCRYPT}
function SaveToFile(const FileName: String; Name: PChar; LangID: Word; PwdLen: Cardinal): Boolean;
{$ELSE}
function SaveToFile(const FileName: String; Name: PChar; LangID: Word): Boolean;
{$ENDIF}
destructor Destroy; override;
end;
type
TRCReader = class(TObject)
private
FBuffer: Pointer;
FPos: Pointer;
FSize: Cardinal;
function GetPosition: Cardinal;
procedure SetPosition(Pos: Cardinal);
property Position: Cardinal read GetPosition write SetPosition;
public
constructor Create;
function Load(Name: PChar; LangID: WORD): Boolean; overload;
function Load(FileName: String; Name: PChar; LangID: WORD): Boolean; overload;
function Load(Handle: THandle; Name: PChar; LangID: WORD): Boolean; overload;
function ReadBuffer(var Dest; const Count: Cardinal): Cardinal;
function ReadInteger: Integer;
function ReadCardinal: Cardinal;
function ReadByte: Byte;
function ReadChar: Char;
function ReadBoolean: Boolean;
function ReadString: String;
destructor Destroy; override;
end;
implementation
{$IFDEF ENCRYPT}
uses uEncryption;
{$ENDIF}
constructor TRCWriter.Create;
begin
inherited;
FBuffer := nil;
FSize := 0;
end;
procedure TRCWriter.WriteBuffer(const Source; const Count: Cardinal);
var Size: Cardinal;
begin
Size := FSize + Count;
ReallocMem(FBuffer, Size);
Move(Source, Pointer(Cardinal(FBuffer) + FSize)^, Count);
FSize := Size;
end;
procedure TRCWriter.WriteInteger(const Value: Integer);
begin
WriteBuffer(Value, SizeOf(Integer));
end;
procedure TRCWriter.WriteCardinal(const Value: Cardinal);
begin
WriteBuffer(Value, SizeOf(Cardinal));
end;
procedure TRCWriter.WriteByte(const Value: Byte);
begin
WriteBuffer(Value, 1);
end;
procedure TRCWriter.WriteChar(const Value: Char);
begin
WriteByte(Ord(Value));
end;
procedure TRCWriter.WriteBoolean(const Value: Boolean);
begin
WriteByte(Byte(Value));
end;
procedure TRCWriter.WriteString(const Value: String);
var Size: Cardinal;
begin
Size := Length(Value);
WriteCardinal(Size);
WriteBuffer(Value[1], Size);
end;
{$IFDEF ENCRYPT}
function TRCWriter.SaveToFile(const FileName: String; Name: PChar;
LangID: Word; PwdLen: Cardinal): Boolean;
{$ELSE}
function TRCWriter.SaveToFile(const FileName: String; Name: PChar;
LangID: Word): Boolean;
{$ENDIF}
var
H: THandle;
Update: Boolean;
{$IFDEF ENCRYPT}
Buffer: Pointer;
Size: Cardinal;
{$ENDIF}
begin
Result := False;
H := BeginUpdateResource(PChar(FileName), False);
if H <> 0 then
begin
{$IFDEF ENCRYPT}
Size := Encrypt(FBuffer, Buffer, FSize, RandomPassword(PwdLen), ciXOR);
Update := UpdateResource(H, RT_RCDATA, Name, LangID, Buffer, Size);
FreeMem(Buffer, Size);
{$ELSE}
Update := UpdateResource(H, RT_RCDATA, Name, LangID, FBuffer, FSize);
{$ENDIF}
Result := Update and EndUpdateResource(H, not Update);
end;
end;
destructor TRCWriter.Destroy;
begin
FreeMem(FBuffer, FSize);
end;
constructor TRCReader.Create;
begin
inherited;
FBuffer := nil;
FPos := nil;
FSize := 0;
end;
function TRCReader.Load(Handle: THandle; Name: PChar; LangID: WORD): Boolean;
var
HI: HRSRC;
HD: HGLOBAL;
P: Pointer;
Size: Cardinal;
begin
Result := False;
FBuffer := nil;
FPos := nil;
FSize := 0;
HI := FindResourceEx(Handle, RT_RCDATA, Name, LangID);
if HI <> 0 then
begin
Size := SizeofResource(Handle, HI);
HD := LoadResource(Handle, HI);
if (Size > 0) and (HD <> 0) then
begin
P := LockResource(HD);
if P <> nil then
begin
{$IFDEF ENCRYPT}
FSize := Decrypt(P, FBuffer, Size);
{$ELSE}
GetMem(FBuffer, Size);
Move(P^, FBuffer^, Size);
FSize := Size;
{$ENDIF}
UnlockResource(HD);
FreeResource(HD);
FPos := FBuffer;
Result := True;
end;
end;
end;
end;
function TRCReader.Load(Name: PChar; LangID: WORD): Boolean;
begin
Result := Load(HInstance, Name, LangID);
end;
function TRCReader.Load(FileName: String; Name: PChar; LangID: WORD): Boolean;
var H: THandle;
begin
H := LoadLibrary(PChar(FileName));
if H <> 0 then
begin
Result := Load(H, Name, LangID);
FreeLibrary(H);
end
else
Result := False;
end;
function TRCReader.GetPosition: Cardinal;
begin
Result := Cardinal(FPos) - Cardinal(FBuffer);
end;
procedure TRCReader.SetPosition(Pos: Cardinal);
begin
FPos := Pointer(Cardinal(FBuffer) + Pos);
end;
function TRCReader.ReadBuffer(var Dest; const Count: Cardinal): Cardinal;
begin
if Position + Count > FSize then
Result := FSize - Position
else
Result := Count;
Move(FPos^, Dest, Result);
SetPosition(Position + Result);
end;
function TRCReader.ReadInteger: Integer;
begin
ReadBuffer(Result, SizeOf(Integer));
end;
function TRCReader.ReadCardinal: Cardinal;
begin
ReadBuffer(Result, SizeOf(Cardinal));
end;
function TRCReader.ReadByte: Byte;
begin
ReadBuffer(Result, 1);
end;
function TRCReader.ReadChar: Char;
begin
Result := Chr(ReadByte);
end;
function TRCReader.ReadBoolean: Boolean;
begin
Result := ReadByte <> 0;
end;
function TRCReader.ReadString: String;
var Size: Cardinal;
begin
Size := ReadCardinal;
SetLength(Result, Size);
Size := ReadBuffer(Result[1], Size);
SetLength(Result, Size);
end;
destructor TRCReader.Destroy;
begin
FreeMem(FBuffer, FSize);
end;
end.