Показать сообщение отдельно
Старый 07.11.2011, 00:57   #5
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 46
Сказал Спасибо: 6
Имеет 19 спасибок в 12 сообщенях
maxilam пока неопределено
По умолчанию

В кратце пример работы (вроде лишнего ни чего не повырезал )) ):

Код:
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 - вроде достает значение с вершины стека. Точно не знаю, с этой функцией пока не приходилось работать

Последний раз редактировалось maxilam, 07.11.2011 в 01:21. Причина: хде тута кнопка Дельфи код?
maxilam вне форума   Ответить с цитированием
За это сообщение maxilam нажился 3 спасибками от: