Проблемы с переводом кода и подсчета необходимого адреса

Тема в разделе "WASM.BEGINNERS", создана пользователем Flasher, 18 окт 2008.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Есть такой код:

    Код (Text):
    1. WSPSendTo(
    2.     const struct sockaddr *SocketAddress,
    3.     int SocketAddressLength,
    4. {
    5.  
    6.     AFD_SEND_INFO_UDP           SendInfo;
    7.     PTRANSPORT_ADDRESS          RemoteAddress;
    8.     UCHAR                   TdiBuffer[0x16];
    9.  
    10.  
    11.     /* Set up Address in TDI Format */
    12.     RemoteAddress = (PTRANSPORT_ADDRESS)TdiBuffer;
    13.     RemoteAddress->TAAddressCount = 1;
    14.     RemoteAddress->Address[0].AddressLength = SocketAddressLength - sizeof(SocketAddress->sa_family);
    15.     RtlCopyMemory(&RemoteAddress->Address[0].AddressType, SocketAddress, SocketAddressLength);
    16.  
    17.  
    18.     SendInfo.RemoteAddress = RemoteAddress;
    19.  
    20. }
    Необходимые структуры:
    Код (Text):
    1.  typedef struct _AFD_WSABUF {
    2.      UINT  len;
    3.      PCHAR buf;
    4.  } AFD_WSABUF, *PAFD_WSABUF;
    5.  
    6.  typedef struct _AFD_SEND_INFO_UDP {
    7.      PAFD_WSABUF                         BufferArray;
    8.      ULONG                               BufferCount;
    9.      ULONG                               AfdFlags;
    10.      ULONG                               Padding[9];
    11.      ULONG                               SizeOfRemoteAddress;
    12.      PVOID                               RemoteAddress;
    13.  } AFD_SEND_INFO_UDP, *PAFD_SEND_INFO_UDP;
    14.  
    15. typedef struct _TA_ADDRESS_IP {
    16.     LONG  TAAddressCount;
    17.     struct  _AddrIp {
    18.         USHORT          AddressLength;
    19.         USHORT          AddressType;
    20.         TDI_ADDRESS_IP  Address[1];
    21.     } Address [1];
    22. } TA_IP_ADDRESS, *PTA_IP_ADDRESS;
    23.  
    24. typedef struct _TA_ADDRESS {
    25.   USHORT  AddressLength;
    26.   USHORT  AddressType;
    27.   UCHAR   Address[1];
    28. } TA_ADDRESS, *PTA_ADDRESS;
    29.  
    30. typedef struct _TRANSPORT_ADDRESS {
    31.   LONG  TAAddressCount;
    32.   TA_ADDRESS  Address[1];
    33. } TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS;
    С этими структурами замучался..
    Не получается отсчитать до sin_addr

    В eax у меня указатель на SendInfo
    Делаю так, и ничего :dntknw:
    Код (Text):
    1. assume eax:ptr AFD_SEND_INFO_UDP
    2. mov eax,[eax].RemoteAddress.Address[0].AddressType.sin_addr
    Я вообще не понимаю зачем RtlCopyMemory делается на AddressType, вить там word
    Помогите плиз.
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    > зачем RtlCopyMemory делается на AddressType, вить там word
    Потому что копируют не два байта, а SocketAddressLength байт.

    > Не получается отсчитать до sin_addr ... eax у меня указатель на SendInfo
    Afaik в TDI_ADDRESS_IP поле называется in_addr, а не sin_addr.
    Код (Text):
    1. USHORT          TYPEDEF     WORD
    2. ULONG           TYPEDEF     DWORD
    3. LONG            TYPEDEF     SDWORD
    4. UCHAR           TYPEDEF     BYTE
    5. UINT            TYPEDEF     DWORD
    6. PCHAR           TYPEDEF     PTR SBYTE
    7. PVOID           TYPEDEF     PTR
    8.  
    9.  
    10. AFD_WSABUF      STRUCT      1t
    11. len         UINT        ?
    12. buf         PCHAR       ?
    13. AFD_WSABUF      ENDS
    14. PAFD_WSABUF     TYPEDEF     PTR AFD_WSABUF
    15.  
    16.  
    17. AFD_SEND_INFO_UDP   STRUCT      1t
    18. BufferArray     PAFD_WSABUF ?
    19. BufferCount     ULONG       ?
    20. AfdFlags        ULONG       ?
    21. Padding         ULONG       9t DUP (?)
    22. SizeOfRemoteAddress ULONG       ?
    23. RemoteAddress       PVOID       ?
    24. AFD_SEND_INFO_UDP   ENDS
    25. PAFD_SEND_INFO_UDP  TYPEDEF     PTR AFD_SEND_INFO_UDP
    26.  
    27.  
    28. TDI_ADDRESS_IP      STRUCT      1t
    29. sin_port        USHORT      ?
    30. in_addr         ULONG       ?
    31. sin_zero        UCHAR       8t DUP (?)
    32. TDI_ADDRESS_IP      ENDS
    33. PTDI_ADDRESS_IP     TYPEDEF     PTR TDI_ADDRESS_IP
    34.  
    35.  
    36. _AddrIp         STRUCT      1t
    37. AddressLength       USHORT      ?
    38. AddressType     USHORT      ?
    39. Address         TDI_ADDRESS_IP  1t DUP (<>)
    40. _AddrIp         ENDS
    41.  
    42.  
    43. TA_ADDRESS_IP       STRUCT      1t
    44. TAAddressCount      LONG        ?
    45. Address         _AddrIp     1t DUP (<>)
    46. TA_ADDRESS_IP       ENDS
    47. PTA_IP_ADDRESS      TYPEDEF     PTR TA_ADDRESS_IP
    48.  
    49. ...
    50.  
    51. assume  eax : PAFD_SEND_INFO_UDP
    52. mov eax,[eax].RemoteAddress
    53.  
    54. assume  eax : PTA_IP_ADDRESS
    55. mov eax,[eax].Address.Address.in_addr
    ps
    > С этими структурами замучался..
    imho на Си гораздо проще.
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    q_q, огромное спасибо!