Fertis, ок, вот так хукаю функцию UNetworkHandler::AddNetworkQueue
delphi Код:
HookProc('engine.dll','?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z',
@UNetworkHandler_AddNetworkQueue_Hook,@UNetworkHandler_AddNetworkQueue_Original);
в результате при вызове клиентом AddNetworkQueue сначала вызывается моя UNetworkHandler_AddNetworkQueue_Hook:
delphi Код:
procedure UNetworkHandler_AddNetworkQueue_Hook(NetworkPacket: Pointer); stdcall;
asm
push ecx
push [ebp+8]
push ecx
call UNetworkHandler_AddNetworkQueue_New
pop ecx
end;
которая собсно всего лишь прослойка к полноценной функции UNetworkHandler_AddNetworkQueue_New:
delphi Код:
procedure UNetworkHandler_AddNetworkQueue_New(unh: Integer; np: PNetworkPacket); stdcall;
begin
// тут код для логирования того что пришло в функцию
// сохраняем указатель на объект UNetworkHandler
nh:=Pointer(unh);
// Вызываем клиентскую UNetworkHandler::AddNetworkQueue
UNetworkHandler_AddNetworkQueue_Call(np);
end;
ну просто для импорта достаточно засунуть в UNetworkHandler_AddNetworkQueue_Original указатель на UNetworkHandler::AddNetworkQueue и вызвать UNetworkHandler_AddNetworkQueue_Call, короче примерно так:
delphi Код:
var
nh: Pointer; // <-- в эту переменную надо засунуть указатель на объект UNetworkHandler
UNetworkHandler_AddNetworkQueue_Original: procedure(NetworkPacket: Pointer); stdcall;
procedure UNetworkHandler_AddNetworkQueue_Call(NetworkPacket: Pointer); stdcall;
asm
mov ecx, nh
mov esp, ebp
pop ebp
jmp [UNetworkHandler_AddNetworkQueue_Original]
end;
begin
UNetworkHandler_AddNetworkQueue_Original:=GetProcAddress('engine.dll','?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z');
// вызываем импортированную функцию
UNetworkHandler_AddNetworkQueue_Call(параметр);
end.
Добавлено через 4 минуты
UNetworkHandler_AddNetworkQueue_Hook и UNetworkHandler_AddNetworkQueue_Call прослойки нужные для того чтоб перейти от thiscall к stdcall соглашению