невтыкаю что за маневры выполняет my_hook )))
ложит в ЕСХ какуюто локальную переменную
сует в стек как я понял адрес возврата.
в итоге ??1FCanvasUtil@@UAE@XZ вызываетса с какимто непонятным "экземпляром класса" когда в ЕСХ должен лежать обьект из [ebp+74h+var_254]
Добавлено через 13 минут
Код:
procedure __AddNetworkQueue_Hook;
begin
asm
pushad
mov EAX , ECX
mov UNETWORKHANDLER_a, EAX // сохряняем в глобальной переменной указатель на обьект end;
EnterCriticalSection(CSSS);
//получаем указатель на сендпакет
pSendPacket:=PPointer(Pdword(PDword(dword(UNETWORKHANDLER_a)+$48)^)^+$6C)^;
ppSendPacket:=Pointer(Pdword(PDword(dword(UNETWORKHANDLER_a)+$48)^)^+$6C);
pNetworkObject:=Ppointer(dword(UNETWORKHANDLER_a)+$48)^;
// снимает сплайсинг отменяем перехват
TTM.ResetTrap(phtrap);
phtrap:=nil;
LeaveCriticalSection(CSSS);
IDirect3DDevice9H(idev_).StrWrite('done : packet trap unmounted',0);
// устанавливаем перехват адднетворк... через VMT таблицу (сплайс для нас слишком грубо)
InitVMTHandlers;
// устанавливаем хук на сендпакет тоже
TL2C.nhandler._hphandler:=TTM.SetupIndirectTrap(pointer(ppSendPacket),0,@_sendpacket_trap,@_postsendpacket_trap,false);
//восстанавливаем все регистры и стек
asm
popad
xor eax, eax
not eax
ret 004
end;
end;
function HandleNetworkTrap:BOOL;
var
forig : pointer;
dll:DWORD;
begin
EnterCriticalSection(CSSS);
try
try
result:=false;
if UNETWORKHANDLER_a<>nil then exit;
dll:=GetModuleHandle('engine.dll');
forig:=GetProcAddress(dll,'?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z');
//делаем хук через сплайсинг
phtrap:=TTM.SetupHardTrap(forig,0,@__AddNetworkQueue_Hook);
if phtrap<>nil then begin
IDirect3DDevice9H(idev_).StrWrite('done : packet trap mounted',0);
result:=true;
end;
if phtrap=nil then begin
IDirect3DDevice9H(idev_).StrWrite('error : mounting packet trap',0);
exit;
end;
finally
LeaveCriticalSection(CSSS);
end;
except
smessage('error : setup trap critical error');
end
end;
а перехватить ченеть типа этого невозможно?)
так я получаю указатели на обьект нетворкхандлера