Показать сообщение отдельно
Старый 05.02.2010, 19:46   #53
Пользователь
 
Регистрация: 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 спасибками от: