Функция с переменной у которой своя структура

Тема в разделе "WASM.BEGINNERS", создана пользователем r2max, 24 апр 2011.

  1. r2max

    r2max Женя

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    40
    Адрес:
    Киев
    Всем привет...
    Помогите пожалуйста
    Надо написать функцию. По типу DispatchNetworkQueue(struct NetworkPacket * *)
    Структура NetworkPacket вот такая
    Код (Text):
    1. struct NetworkPacket
    2.     id      db ?
    3.     pad1    db ?
    4.     exid    db ?
    5.     pad2    db ?
    6.     _size   dd ?
    7.     pad3    db ?
    8.     pdata   dd ?
    9. ends
    Пытался сделать
    Код (Text):
    1. proc DispatchNetworkQueue np:NetworkPacket
    2.   ; какие то действия с np
    3. ret
    4. endp
    но не компилируется...
    Очень надеюсь на Вашу помошь
     
  2. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.624
    Адрес:
    Russia
    r2max
    вам надо описывать параметр как адрес на структуру
    грузить его в регистр для адресации и работать (strucname PTR [reg]).struc_field
     
  3. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Звёздочка обозначает операцию взятия адреса. Т.к. звёздочки две, то в функцию передаётся указатель на указатель на структуру.
    На MASM это должно выглядеть примерно так:
    Код (Text):
    1. proc DispatchNetworkQueue uses ebx ppnp:DWORD
    2. mov     ebx, [ppnp] ; NetworkPacket **
    3. mov     ebx, [ebx] ; NetworkPacket *
    4. mov     al, [ebx+NetrowkPacket.id]
    5. mov     cl, [ebx+NetworkPacket.exid]
    6. mov     edx, [ebx+NetworkPacked._size]
    7. ...
    8. endp
     
  4. r2max

    r2max Женя

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    40
    Адрес:
    Киев
    Смотрите я делаю хук функции UNetworkHandler::lol: ispatchNetworkQueue(struct NetworkPacket * *) (оригинала) методом сплайсинга. В начале функции у меня идет call на мою.
    Вот как выглядит сам хук
    Код (Text):
    1. proc DispatchNetworkQueueHook  
    2.     pop eax                 ; Выталкиваем со стека Адрес Возврата в EAX (4 байта)
    3.     push    ebp             ; Толкаем в стек Адрес , которого начинаются аргументы (глубина стека)
    4.     mov ebp, esp            ; в ebp теперь "Вершина" стека. Туда будут идти аргументы
    5.     pushad
    6.     mov edx, [ebp+8]                ; ebp+8 = первый аргумент
    7.     test edx,edx
    8.     jz ff
    9.     stdcall PaketDump,[edx]    
    10.     ff:
    11.     popad
    12.     push    0ffffffffh
    13.     push    eax             ; востанавливаем адрес возврата
    14.     ret
    15. endp
    Код (Text):
    1. proc PaketDump uses ebx, ppnp:DWORD
    2.     mov eax, [ppnp] ; NetworkPacket **
    3.     mov ebx, [eax] ; NetworkPacket *
    4.     movzx eax, [eax+NetworkPacket.id]
    5.     mov ebx, 16
    6.     mov edi, MAXHPBuff
    7.     call IntToStr
    8. ret
    В общем суть - перехватить пакет. Точнее его Id и вызвать IntToStr (в eax - число)
     
  5. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    тут [ebx+NetworkPacket.id]