Показать сообщение отдельно
Старый 26.07.2010, 20:22   #115
Новичок
 
Регистрация: 26.02.2010
Сообщений: 7
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
CodeMonkey пока неопределено
По умолчанию

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;

помогите, пожалуйста. уже мозг кипит
CodeMonkey вне форума   Ответить с цитированием