В кратце пример работы (вроде лишнего ни чего не повырезал )) ):
Код:
type
TL2ParamStack = array[0..16] of byte;
PL2ParamStack = ^TL2ParamStack;
TL2Param = class
l2p: PL2ParamStack;
public
constructor Create;
destructor Destroy;
procedure l2PushBack(cmd: string);
procedure l2PushBackInt(i: integer);
procedure l2Clear;
procedure l2Free;
end;
...
var
L2ParamStackCreate_Original: procedure(i: integer); stdcall;
L2ParamStackClear_Original: procedure; stdcall;
L2ParamStackPushBack_Original: function(i: pointer): integer; stdcall;
L2ParamStackFree_Original: procedure; stdcall;
RequestBypassToServer_Original: procedure(l2p: PL2ParamStack); stdcall;
...
//**********************************************************************************************************
procedure l2stackCreate(l2p: PL2ParamStack); stdcall;
asm
push ecx;
mov ecx, l2p;
push 0Ah;
call L2ParamStackCreate_Original;
pop ecx;
end;
procedure L2StackPushBack(l2p: PL2ParamStack; cmd: string); stdcall;
asm
mov ecx,cmd;
push ecx;
mov ecx, l2p;
call L2ParamStackPushBack_Original;
end;
procedure L2StackPushBackInt(l2p: PL2ParamStack; cmd: Integer); stdcall;
asm
mov ecx,cmd;
push ecx;
mov ecx, l2p;
call L2ParamStackPushBack_Original;
end;
procedure L2StackClear(l2p: PL2ParamStack); stdcall;
asm
mov ecx, l2p;
call L2ParamStackClear_Original;
end;
procedure L2StackFree(l2p: PL2ParamStack); stdcall;
asm
mov ecx, l2p;
call L2ParamStackFree_Original;
end;
//*****************************************************************************************
...
constructor TL2Param.create;
begin
New(l2p);
L2StackCreate(l2p);
end;
destructor TL2Param.Destroy;
begin
Dispose(l2p);
end;
procedure TL2Param.l2Clear;
begin
L2StackClear(l2p);
end;
procedure TL2Param.l2Free;
begin
L2StackFree(l2p);
end;
procedure TL2Param.l2PushBack(cmd: string);
begin
L2StackPushBack(l2p,cmd);
end;
procedure TL2Param.l2PushBackInt(i: integer);
begin
L2StackPushBackInt(l2p,i);
end;
...
procedure MainProc;
begin
//*****************************************************************************************
L2ParamStackCreate_Original:= GetProcAddress(hCoreDll,'??0L2ParamStack@@QAE@AAV0@@Z');
L2ParamStackClear_Original:= GetProcAddress(hCoreDll,'?Clear@L2ParamStack@@QAEXXZ');
L2ParamStackPushBack_Original:= GetProcAddress(hCoreDll,'?PushBack@L2ParamStack@@QAEHPA_W@Z');
L2ParamStackFree_Original:= GetProcAddress(hCoreDll,'??1L2ParamStack@@QAE@XZ');
RequestBypassToServer_Original:= GetProcAddress(hEngineDLL,'?RequestBypassToServer@UNetworkHandler@@UAEHAAVL2ParamStack@@@Z');
//******************************************************************************************
end;
...
procedure RequestBypassToServer_Call(l2p: PL2ParamStack); stdcall;
asm
push l2p;
mov ecx, nh;// nh - указатель на UNetworkHandler
call RequestBypassToServer_Original;
end;
...
procedure RequestBypassToServer_My(s: string);
var
param: TL2Param;
begin
param:= TL2Param.Create;
param.l2Clear;
param.l2PushBack(s);
RequestBypassToServer_call(param.l2p);
param.l2Free;
param.Destroy;
end;
Вроде ни чего не забыл.
L2ParamStack::Top - вроде достает значение с вершины стека. Точно не знаю, с этой функцией пока не приходилось работать