Una primera aproximación consistiría en usar archivos de memoria compartida y un hilo en tu dll que los lea continuamente. Más sofisticado sería los mensajes entre threads con
PostThreadMessage o la inyección directa cosa que no está en este momento a tu alcance.
Vamos a ver un ejemplo sencillo compartiendo memoria:
Lo siguiente es una clase para facilitar compartir memoria entre procesos:
Código Delphi
[-]
unit SharedMemory;
interface
uses
Windows;
type
TModos = (mServer, mClient);
TSharedMemory = class
private
Modo: TModos;
hMap: THANDLE; DataMap: THANDLE; Name: array [0..MAX_PATH] of char;
public
Buffer: Pointer;
constructor Create(MappName: PCHAR; SizeData: DWORD = 0);
destructor Destroy; override;
end;
implementation
procedure MessageError(Title: PCHAR);
var
pBuffer: pointer;
begin
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ALLOCATE_BUFFER, nil,
GetLastError, 0, @pBuffer, 0, nil );
MessageBox(0, pBuffer, Title, MB_OK);
LocalFree(Cardinal(pBuffer));
end;
constructor TSharedMemory.Create(MappName: PCHAR; SizeData: DWORD);
begin
lstrcpy(@Name[0], PCHAR(MappName));
if SizeData <> 0 then
begin
Modo:= mServer;
hMap:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeData, Name);
if (hMap <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
begin
CloseHandle(hMap);
hMap:= 0;
end;
end
else
Modo:= mClient;
Buffer:= nil;
DataMap:= 0;
DataMap:= OpenFileMapping(FILE_MAP_ALL_ACCESS, false, Name);
if DataMap <> 0 then
Buffer:= MapViewOfFile(DataMap, FILE_MAP_ALL_ACCESS, 0, 0, 0)
else
MessageError('ERROR');
end;
destructor TSharedMemory.Destroy;
begin
if Buffer <> nil then
UnmapViewOfFile(Buffer);
CloseHandle(DataMap);
if (hMap <> 0) and (Modo = mServer) then
CloseHandle(hMap);
end;
end.
Ahora el código de tu dll:
Código Delphi
[-]library Project1;
uses
SysUtils,
Windows,
Classes,
Unit2 in 'Unit2.pas',
SharedMemory in 'SharedMemory.pas';
{$R *.res}
var
AtProcessobymr: THandle;
hId:Cardinal;
Memory: TSharedMemory;
procedure TrainerFarius;
begin
while(true) do
begin
Sleep(100);
PDWORD($A04569)^:= PDWORD(Memory.Buffer)^;
end;
end;
begin
Memory:= TSharedMemory.Create('_Mi_Memoria_', sizeof(Pointer));
CreateThread(nil, 0, @TrainerFarius, nil, 0, PDWORD(0)^);
end.
Y el formulario que envía el dato compartido:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,INIFiles,Unit2, SharedMemory, TLHelp32;
type
TForm1 = class(TForm)
edt1: TEdit;
btn1: TButton;
lbl1: TLabel;
procedure FormCreate(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
Memory: TSharedMemory;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Key:Tinifile;
begin
Memory:= TSharedMemory.Create('_Mi_Memoria_', sizeof(DWORD));
end;
procedure TForm1.btn1Click(Sender: TObject);
var
Val: DWORD;
begin
Val:= StrToInt(Edt1.Text);
CopyMemory(Memory.Buffer, @Val, sizeof(DWORD));
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Memory.Free;
end;
end.
El ejemplo es un esbozo pero es funcional.
Ahora vienes las preguntas del millón ¿Donde quieres inyectar esa dll? ¿Sabes hacerlo?
Saludos.