Программинг Форум для тем связанных с программированием
15.01.2017, 04:06
#1
Новичок
Регистрация: 17.04.2016
Сообщений: 8
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
Вызов 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, то можно узреть срабатывание функции, но через пару сек клиент просто зависате
15.01.2017, 15:51
#2
Пользователь
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
Если внимательно посмотреть на трейс, то валится при вызове 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;
};
}
Цитата:
Сообщение от
DaVilka
Если в след за ней вызвать DispatchNetworkQueue передав ссылку на структуру, то крита нету, но ничего не происходит
Этот метод не так работает.
Последний раз редактировалось Smwr, 15.01.2017 в 15:58 .
За это сообщение Smwr нажился спасибкой от:
15.01.2017, 17:42
#3
Новичок
Регистрация: 17.04.2016
Сообщений: 8
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
Цитата:
Сообщение от
Smwr
Если внимательно посмотреть на трейс, то валится при вызове 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;
};
}
Этот метод не так работает.
хм, получается мне нужно экспортировать функции из коре и выделять память под структуру через нее?
15.01.2017, 18:27
#4
Пользователь
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.
15.01.2017, 21:16
#5
Новичок
Регистрация: 17.04.2016
Сообщений: 8
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
Цитата:
Сообщение от
Smwr
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.
А можно пример, или описание хода действий, чето не пойму
Добавлено через 1 час 51 минуту
Цитата:
Сообщение от
Smwr
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.
Что то я не могу найти в Core.dll FMallocWindows
Последний раз редактировалось DaVilka, 15.01.2017 в 21:16 .
Причина: Добавлено сообщение
16.01.2017, 07:41
#6
Местный
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
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);
__________________
Н а ч а л о .
За это сообщение supernewbie нажился спасибкой от:
16.01.2017, 10:15
#7
Пользователь
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
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
За это сообщение Smwr нажился 2 спасибками от:
16.01.2017, 19:57
#8
Новичок
Регистрация: 17.04.2016
Сообщений: 8
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
Цитата:
Сообщение от
Smwr
NetworkPacket* packet = (NetworkPacket*)pMalloc->Allocate(sizeof(NetworkPacket), 0);
Вот здесь клиент падает, либа подключается, функцию находит хм
Последний раз редактировалось DaVilka, 16.01.2017 в 23:24 .
19.01.2017, 14:03
#9
Пользователь
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
потому что не стоит так бездумно списывать, я ведь могу опечататься
Код:
FMalloc* pMalloc = *(FMalloc**)GetProcAddress(hCore, "?GMalloc@@3PAVFMalloc@@A");
За это сообщение Smwr нажился спасибкой от:
19.01.2017, 16:41
#10
Новичок
Регистрация: 17.04.2016
Сообщений: 8
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
Цитата:
Сообщение от
Smwr
не стоит так бездумно списывать
я так и думал что трабла там, я пытался сделать по другому, но к приведению к классу чето не додумался, а вообще спасибо, вызвал )
Последний раз редактировалось DaVilka, 19.01.2017 в 21:39 .
Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
Часовой пояс GMT +4, время: 21:52 .
vBulletin style designed by
MSC Team .
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод:
zCarot
Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!