Просмотр полной версии : Вызов AddNetworkQueue
Хочу положить пакет в структуру, и отправить ее на клиент.
Заполняю структуру
byte gfg[8] = {0xC9, 0x29, 0x13, 0x10, 0x02, 0x00, 0x00, 0x00};
packetsend->id = 0x27;
packetsend->_padding1 = 0xF0;
packetsend->exid = 0xFF;
packetsend->_padding2 = 0xFF;
packetsend->size = 8;
packetsend->_padding3 = 0;
packetsend->data = gfg;
Передаю в функцию - получаю крит
General protection fault!
History: FMallocWindows::Free <- UNetworkHandler::Tick <- Function Name=SocialActionPac <- UGameEngine::Tick <- UpdateWorld <- MainLoop
Если в след за ней вызвать DispatchNetworkQueue передав ссылку на структуру, то крита нету, но ничего не происходит, как будто пакета и не было, а если вызвать UNetworkHandler::Tick, то можно узреть срабатывание функции, но через пару сек клиент просто зависате
Если внимательно посмотреть на трейс, то валится при вызове FMallocWindows::Free.
Всё потому что, память под структуру и поле data должна быть выделена тем менеджером, который будет потом её освобождать.
Экземпляр менеджера экспортируется из core.dll.
namespace l2native {
class FMalloc {
public:
virtual void* Allocate(size_t size, int unk_zero) = 0;
private:
virtual void unk_0() = 0;
public:
virtual void Free(void* block) = 0;
};
}
Если в след за ней вызвать DispatchNetworkQueue передав ссылку на структуру, то крита нету, но ничего не происходит
Этот метод не так работает.
Если внимательно посмотреть на трейс, то валится при вызове FMallocWindows::Free.
Всё потому что, память под структуру и поле data должна быть выделена тем менеджером, который будет потом её освобождать.
Экземпляр менеджера экспортируется из core.dll.
namespace l2native {
class FMalloc {
public:
virtual void* Allocate(size_t size, int unk_zero) = 0;
private:
virtual void unk_0() = 0;
public:
virtual void Free(void* block) = 0;
};
}
Этот метод не так работает.
хм, получается мне нужно экспортировать функции из коре и выделять память под структуру через нее?
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.
А можно пример, или описание хода действий, чето не пойму:(
Добавлено через 1 час 51 минуту
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.
Что то я не могу найти в Core.dll FMallocWindows
supernewbie
16.01.2017, 07:41
DaVilka,
hCore:= GetModuleHandle('core.dll');
L2MemAlloc:= GetProcAddress(hCore, '?GMalloc@@3PAVFMalloc@@A');
...
function L2MemoryAllocNetPacket: PNetworkPacket; register;
asm
push NetPacket
push $0C
mov edx, L2MemAlloc
mov ecx, [edx]
mov eax, [ecx]
mov edx, [eax]
call edx
end;
function L2MemoryAllocNetCmd(len: integer): Pointer; register;
asm
push NetCmd
push len
mov edx, L2MemAlloc
mov ecx, [edx]
mov edx, [ecx]
mov eax, [edx]
call eax
end;
procedure L2MemoryFreeNetPacket(pck: PNetworkPacket); stdcall;
asm
lea edi, pck
mov edx, L2MemAlloc
mov ecx, [edx]
mov eax, [ecx]
mov edx, [edi]
mov edx, [edx+8]
push edx
mov eax, [eax+8]
call eax
mov ecx, L2MemAlloc
mov ecx, [ecx]
mov eax, [edi]
mov edx, [ecx]
push eax
mov edx, [edx+8]
call edx
end;
...
var
np: PNetworkPacket;
begin
np:= L2MemoryAllocNetPacket;
np.id:= pck[0];
np.res:= 0;
np.size:= len - 1;
np.res2:= 0;
np.id2:= -1;
np.data:= L2MemoryAllocNetCmd(len - 1);
Move(pck[1], np.data[0], len - 1);
AddNetworkQueue(np);
DaVilka,
char payload[] = { 0xC9, 0x29, 0x13, 0x10, 0x02, 0x00, 0x00, 0x00 };
HMODULE hCore = GetModuleHandleA("Core.dll");
FMalloc* pMalloc = (FMalloc*)GetProcAddress(hCore, "?GMalloc@@3PAVFMalloc@@A");
NetworkPacket* packet = (NetworkPacket*)pMalloc->Allocate(sizeof(NetworkPacket), 0);
packet->Buffer = (uint8_t*)pMalloc->Allocate(sizeof(payload), 0);
std::memcpy(packet->Buffer, payload, sizeof(payload));
packet->Id = 0x27;
packet->Id2 = 0xFF;
packet->Size = sizeof(payload);
//do stuff
NetworkPacket* packet = (NetworkPacket*)pMalloc->Allocate(sizeof(NetworkPacket), 0);Вот здесь клиент падает, либа подключается, функцию находит хм
потому что не стоит так бездумно списывать, я ведь могу опечататься ;)
FMalloc* pMalloc = *(FMalloc**)GetProcAddress(hCore, "?GMalloc@@3PAVFMalloc@@A");
не стоит так бездумно списыватья так и думал что трабла там, я пытался сделать по другому, но к приведению к классу чето не додумался, а вообще спасибо, вызвал )
nasta456
30.01.2019, 21:11
спасибо всем за ответы)
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot