PDA

Просмотр полной версии : Функция RequestBypassToServer


maxilam
09.06.2011, 02:41
Доброе время суток. Уважаемы гуру, прошу помощи у вас, ибо сам уже зашел в тупик.
Как, используя функцию RequestBypassToServer из engine.dll, отправить некоторый пункт ответа в диалоге с НПС?
Или, если быть точнее, как работать с классом L2ParamStack?
Хроники Грация Финал.
Буду очень признателен за любую помощь, а то уже несколько дней бьюсь как рыба об лед.

Guzh
09.06.2011, 10:37
...
Или, если быть точнее, как работать с классом L2ParamStack?
...
Я обычно работаю так:
Адреса процедур:
AdrL2StackCreate:=adrProc('core.dll','??0L2ParamSt ack@@QAE@H@Z');
AdrL2StackClear :=adrProc('core.dll','?Clear@L2ParamStack@@QAEXXZ' );
AdrL2StackPushBack:=adrProc('core.dll','?PushBack@ L2ParamStack@@QAEHPA_W@Z'); //freya ?PushBack@L2ParamStack@@QAEHPAG@Z
AdrL2StackTop :=adrProc('core.dll','?Top@L2ParamStack@@QAE_JXZ') ; //?Top@L2ParamStack@@QAEPAXXZ
AdrL2StackFree :=adrProc('core.dll','??1L2ParamStack@@QAE@XZ');
Вызов:
procedure l2stackCreate; //создать стек параметров
asm
push ecx
mov ecx, UnKnown
push 0Ah
call AdrL2StackCreate
pop ecx
end;
procedure L2StackPushBack; //положить параметр в стек параметров
begin
asm
mov ecx,param
push ecx
mov ecx, UnKnown
call AdrL2StackPushBack

end;
...

Пример работы:
asm
call l2stackcreate
call l2stackclear


mov eax, ObjectID
mov param,eax
call L2StackPushBack

mov eax, 0
mov param,eax
call L2StackPushBack

call l2useItem

call l2stackfree
end;

maxilam
11.06.2011, 10:09
procedure l2stackCreate; //создать стек параметров
asm
push ecx
mov ecx, UnKnown
push 0Ah
call AdrL2StackCreate
pop ecx
end;
Поток завершается без ошибк при вызове AdrL2StackCreate;
Что должно находиться в ecx?

Разобрался.
строка
mov ecx, UnKnown
Должна быть вида
mov ecx, L2ParamStack
где L2ParamStack указатель на array[0..16] of byte

vahes
06.11.2011, 23:29
строка
mov ecx, UnKnown
Должна быть вида
mov ecx, L2ParamStack
где L2ParamStack указатель на array[0..16] of byte

type ArrL2ParamStack = array[0..16] of Byte;
var L2ParamStack: ^ArrL2ParamStack;

procedure L2StackCreate;
asm
push ecx
mov ecx, L2ParamStack
push 0Ah
call AdrL2StackCreate
pop ecx
end;
Сделал как написано выше, все равно клиент вылетает при вызове L2StackCreate. Можете еще привести примеры успешной работы с этим зверем "класс L2ParamStack". И что делает метод L2ParamStack::Top(void)?

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

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@@QAEX XZ');

L2ParamStackPushBack_Original:= GetProcAddress(hCoreDll,'?PushBack@L2ParamStack@@Q AEHPA_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 - вроде достает значение с вершины стека. Точно не знаю, с этой функцией пока не приходилось работать

vahes
07.11.2011, 01:39
спс большое, сейчас буду разбираться.

Вот я смотрю, для каждого вызова процедуры класс создается и уничтожается, а не будет быстрее и для экономии системных ресурсов раз создать экземпляр класса, а перед вызовом процедуры которая его использует просто очищать и засовывать параметры по новой, а уничтожать по завершению программы?

maxilam
07.11.2011, 14:13
Вот я смотрю, для каждого вызова процедуры класс создается и уничтожается, а не будет быстрее и для экономии системных ресурсов раз создать экземпляр класса, а перед вызовом процедуры которая его использует просто очищать и засовывать параметры по новой, а уничтожать по завершению программы?

Попробуй, но меня и так устраивает, нареканий нет.