Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 15.01.2017, 04:06   #1
Новичок
 
Регистрация: 17.04.2016
Сообщений: 8
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
DaVilka пока неопределено
Вопрос Вызов 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, то можно узреть срабатывание функции, но через пару сек клиент просто зависате
DaVilka вне форума   Ответить с цитированием
Старый 15.01.2017, 15:51   #2
Пользователь
 
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
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;
	};
}
Цитата:
Сообщение от DaVilka Посмотреть сообщение
Если в след за ней вызвать DispatchNetworkQueue передав ссылку на структуру, то крита нету, но ничего не происходит
Этот метод не так работает.

Последний раз редактировалось Smwr, 15.01.2017 в 15:58.
Smwr вне форума   Ответить с цитированием
За это сообщение Smwr нажился спасибкой от:
Старый 15.01.2017, 17:42   #3
Новичок
 
Регистрация: 17.04.2016
Сообщений: 8
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
DaVilka пока неопределено
По умолчанию

Цитата:
Сообщение от 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;
	};
}

Этот метод не так работает.
хм, получается мне нужно экспортировать функции из коре и выделять память под структуру через нее?
DaVilka вне форума   Ответить с цитированием
Старый 15.01.2017, 18:27   #4
Пользователь
 
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
Smwr на пути к лучшему
По умолчанию

Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.
Smwr вне форума   Ответить с цитированием
Старый 15.01.2017, 21:16   #5
Новичок
 
Регистрация: 17.04.2016
Сообщений: 8
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
DaVilka пока неопределено
По умолчанию

Цитата:
Сообщение от Smwr Посмотреть сообщение
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.
А можно пример, или описание хода действий, чето не пойму

Добавлено через 1 час 51 минуту
Цитата:
Сообщение от Smwr Посмотреть сообщение
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.
Что то я не могу найти в Core.dll FMallocWindows

Последний раз редактировалось DaVilka, 15.01.2017 в 21:16. Причина: Добавлено сообщение
DaVilka вне форума   Ответить с цитированием
Старый 16.01.2017, 07:41   #6
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

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 вне форума   Ответить с цитированием
За это сообщение supernewbie нажился спасибкой от:
Старый 16.01.2017, 10:15   #7
Пользователь
 
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
Smwr на пути к лучшему
По умолчанию

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 вне форума   Ответить с цитированием
За это сообщение Smwr нажился 2 спасибками от:
Старый 16.01.2017, 19:57   #8
Новичок
 
Регистрация: 17.04.2016
Сообщений: 8
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
DaVilka пока неопределено
По умолчанию

Цитата:
Сообщение от Smwr Посмотреть сообщение
NetworkPacket* packet = (NetworkPacket*)pMalloc->Allocate(sizeof(NetworkPacket), 0);
Вот здесь клиент падает, либа подключается, функцию находит хм

Последний раз редактировалось DaVilka, 16.01.2017 в 23:24.
DaVilka вне форума   Ответить с цитированием
Старый 19.01.2017, 14:03   #9
Пользователь
 
Регистрация: 14.07.2016
Сообщений: 59
Сказал Спасибо: 6
Имеет 10 спасибок в 9 сообщенях
Smwr на пути к лучшему
По умолчанию

потому что не стоит так бездумно списывать, я ведь могу опечататься

Код:
FMalloc* pMalloc = *(FMalloc**)GetProcAddress(hCore, "?GMalloc@@3PAVFMalloc@@A");
Smwr вне форума   Ответить с цитированием
За это сообщение Smwr нажился спасибкой от:
Старый 19.01.2017, 16:41   #10
Новичок
 
Регистрация: 17.04.2016
Сообщений: 8
Сказал Спасибо: 6
Имеет 0 спасибок в 0 сообщенях
DaVilka пока неопределено
По умолчанию

Цитата:
Сообщение от Smwr Посмотреть сообщение
не стоит так бездумно списывать
я так и думал что трабла там, я пытался сделать по другому, но к приведению к классу чето не додумался, а вообще спасибо, вызвал )

Последний раз редактировалось DaVilka, 19.01.2017 в 21:39.
DaVilka вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:03.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!