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

Полезности Исключительно для полезных тем из других разделов.
Темы тут не создаются!
Темы сюда перемещаются из других разделов, и на их старых местах остаются постоянные перенаправления.

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 05.02.2010, 19:46   #1
Пользователь
 
Регистрация: 23.03.2009
Сообщений: 50
Сказал Спасибо: 10
Имеет 10 спасибок в 1 сообщении
murc пока неопределено
По умолчанию

Продолжая тему про AddNetworkQueue, хочу поделится своими наработками, может кому-нибуть будут полезными ...

Что бы добавить свой пакет в массив, нужно выделить память, но просто выделить мало, нужно выделить где-то внутри ла2. Для выделения памяти я юзал ф-ию "L2MemoryAlloc", ее можно легко найти, она находится рядом с AddNetworkQueue. Выглядит она следующим образом:
Код:
L2MemoryAlloc(cmd: PWideChar; Len: integer): Pointer;
В качестве параметров используются строки "NetCmd", "NetPacket" и размер. Строки указывают для чего резервируется память и выделяется в соответствующем месте. Вообще выделение памяти здесь звучит довольно не корректно, т.к выделения памяти по сути происходит не всегда и зависит от аргументов. Стоит еще отметить то, что вызывать нужно поразному для конкретного аргумента(cmd), не знаю с чем это связано, но при вызове ф-ии в регистрах должно быть то, что должно быть, иначе будет ошибка. Для выделения памяти под сам пакет и под структуру NetworkPacket, которую в дальнейшем мы будем добавлять, я юзал такие ф-ии:
Код:
function L2MemoryAllocNetCmd(len: integer): Pointer; stdcall;
asm
  push NetCmd
  push len
  mov edx, [$01E6D6A4]
  mov ecx, [edx]
  mov edx, [ecx]
  mov eax, [edx]
  call eax
end;

function L2MemoryAllocNetPacket: Pointer; stdcall;
asm
  push NetPacket
  push $0C
  mov edx, [$01E6D6A4]
  mov ecx, [edx]
  mov eax, [ecx]
  mov edx, [eax]
  call edx
end;
Вообще это копипаст из клиента и адресс 01E6D6A4 будет действителен только для конкретных хроник - ИТ, найти в другом клиенте не должно вызвать проблем.
В первом случае мы выделяем память, куда положим свой пакет без его длинны, ID и если есть то и SubID. Во втором под структуру NetworkPacket. Заполняем и вызываем примерно таким образом:
Код:
procedure AddNetworkQueue(NetworkPacket: PNetworkPacket); stdcall;
asm
  mov ecx, [$00BFF558] - UNetworkHandler
  mov edx, [ecx]
  mov eax, [edx+$84]
  push NetworkPacket
  call eax
end;
Проверялось на Интерлюдии, должно работать везде впринципе. Самое главное выделить память без ошибок.

Последний раз редактировалось murc, 20.02.2010 в 13:49.
murc вне форума   Ответить с цитированием
За это сообщение murc нажился 10 спасибками от:
Старый 05.02.2010, 22:22   #2
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

murc, думаю клиенту при вызве этих функций важно лишь содержимое ecx, ибо по соглашению thiscall там должен быть указатель на объект которому принадлежит метод, а остальные регистры по идее не обязаны содержать то что содержат)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Полезности


Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

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

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


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

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

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