xkor выше писал, как он переходит в Delphi от thiscall к stdcall, примерно так, код работает:
delphi Код:
procedure UNetworkHandler_AddNetworkQueue_Call(Packet:PNetworkPacket);stdcall;
asm
mov ecx,UNetworkHandler
mov esp,ebp
pop ebp
jmp [UNetworkHandler_AddNetworkQueue_Original]
end;
procedure UNetworkHandler_AddNetworkQueue_New(unh:integer;Packet:PNetworkPacket);stdcall;
begin
UNetworkHandler:=Pointer(unh);
UNetworkHandler_AddNetworkQueue_Call(Packet);
end;
procedure UNetworkHandler_AddNetworkQueue_Hook(Packet:PNetworkPacket);stdcall;
asm
push ecx
push [ebp+8]
push ecx
call UNetworkHandler_AddNetworkQueue_New
pop ecx
end;
а если вместо функций методы класса? что-то у меня не получается.
delphi Код:
TUNetworkHandler = class
private
UNetworkHandler:pointer;
AddNetworkQueue_Original: procedure (Packet:PNetworkPacket);stdcall;
FOnRecievePacket:TRecievePacketEvent;
procedure AddNetworkQueue_Hook(Packet:PNetworkPacket);stdcall;
procedure AddNetworkQueue_Call(Packet:PNetworkPacket);stdcall;
procedure AddNetworkQueue_New(unh:integer;Packet:PNetworkPacket);stdcall;
procedure SetOnRecievePacket(const Value: TRecievePacketEvent);
public
property OnRecievePacket:TRecievePacketEvent read FOnRecievePacket write SetOnRecievePacket;
end;
procedure TUNetworkHandler.AddNetworkQueue_Call(Packet: PNetworkPacket);stdcall;
{
тут хз как делать, запутался уже
при переходе к оригинальной функции в стеке:
значение Packet
указатель на объект TUNetworkHandler
адрес возврата
}
var
p:pointer;
fnc:pointer;
begin
p:=UNetworkHandler;
fnc:=@AddNetworkQueue_Original;
asm
mov eax,fnc
mov ecx,p
mov esp,ebp
pop ebp
jmp eax
end;
end;
procedure TUNetworkHandler.AddNetworkQueue_Hook(Packet: PNetworkPacket);stdcall;
asm
push ecx
push [ebp+12]
push ecx
push Self // указатель на объект
call AddNetworkQueue_New
pop ecx
end;
procedure TUNetworkHandler.AddNetworkQueue_New(unh: integer;
Packet: PNetworkPacket);stdcall;
begin
UNetworkHandler:=Pointer(unh);
if Assigned(FOnRecievePacket) then FOnRecievePacket(Packet);
AddNetworkQueue_Call(Packet);
end;
помогите, пожалуйста. уже мозг кипит