Есть такой код: Код (Text): WSPSendTo( const struct sockaddr *SocketAddress, int SocketAddressLength, { AFD_SEND_INFO_UDP SendInfo; PTRANSPORT_ADDRESS RemoteAddress; UCHAR TdiBuffer[0x16]; /* Set up Address in TDI Format */ RemoteAddress = (PTRANSPORT_ADDRESS)TdiBuffer; RemoteAddress->TAAddressCount = 1; RemoteAddress->Address[0].AddressLength = SocketAddressLength - sizeof(SocketAddress->sa_family); RtlCopyMemory(&RemoteAddress->Address[0].AddressType, SocketAddress, SocketAddressLength); SendInfo.RemoteAddress = RemoteAddress; } Необходимые структуры: Код (Text): typedef struct _AFD_WSABUF { UINT len; PCHAR buf; } AFD_WSABUF, *PAFD_WSABUF; typedef struct _AFD_SEND_INFO_UDP { PAFD_WSABUF BufferArray; ULONG BufferCount; ULONG AfdFlags; ULONG Padding[9]; ULONG SizeOfRemoteAddress; PVOID RemoteAddress; } AFD_SEND_INFO_UDP, *PAFD_SEND_INFO_UDP; typedef struct _TA_ADDRESS_IP { LONG TAAddressCount; struct _AddrIp { USHORT AddressLength; USHORT AddressType; TDI_ADDRESS_IP Address[1]; } Address [1]; } TA_IP_ADDRESS, *PTA_IP_ADDRESS; typedef struct _TA_ADDRESS { USHORT AddressLength; USHORT AddressType; UCHAR Address[1]; } TA_ADDRESS, *PTA_ADDRESS; typedef struct _TRANSPORT_ADDRESS { LONG TAAddressCount; TA_ADDRESS Address[1]; } TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS; С этими структурами замучался.. Не получается отсчитать до sin_addr В eax у меня указатель на SendInfo Делаю так, и ничего Код (Text): assume eax:ptr AFD_SEND_INFO_UDP mov eax,[eax].RemoteAddress.Address[0].AddressType.sin_addr Я вообще не понимаю зачем RtlCopyMemory делается на AddressType, вить там word Помогите плиз.
Flasher > зачем RtlCopyMemory делается на AddressType, вить там word Потому что копируют не два байта, а SocketAddressLength байт. > Не получается отсчитать до sin_addr ... eax у меня указатель на SendInfo Afaik в TDI_ADDRESS_IP поле называется in_addr, а не sin_addr. Код (Text): USHORT TYPEDEF WORD ULONG TYPEDEF DWORD LONG TYPEDEF SDWORD UCHAR TYPEDEF BYTE UINT TYPEDEF DWORD PCHAR TYPEDEF PTR SBYTE PVOID TYPEDEF PTR AFD_WSABUF STRUCT 1t len UINT ? buf PCHAR ? AFD_WSABUF ENDS PAFD_WSABUF TYPEDEF PTR AFD_WSABUF AFD_SEND_INFO_UDP STRUCT 1t BufferArray PAFD_WSABUF ? BufferCount ULONG ? AfdFlags ULONG ? Padding ULONG 9t DUP (?) SizeOfRemoteAddress ULONG ? RemoteAddress PVOID ? AFD_SEND_INFO_UDP ENDS PAFD_SEND_INFO_UDP TYPEDEF PTR AFD_SEND_INFO_UDP TDI_ADDRESS_IP STRUCT 1t sin_port USHORT ? in_addr ULONG ? sin_zero UCHAR 8t DUP (?) TDI_ADDRESS_IP ENDS PTDI_ADDRESS_IP TYPEDEF PTR TDI_ADDRESS_IP _AddrIp STRUCT 1t AddressLength USHORT ? AddressType USHORT ? Address TDI_ADDRESS_IP 1t DUP (<>) _AddrIp ENDS TA_ADDRESS_IP STRUCT 1t TAAddressCount LONG ? Address _AddrIp 1t DUP (<>) TA_ADDRESS_IP ENDS PTA_IP_ADDRESS TYPEDEF PTR TA_ADDRESS_IP ... assume eax : PAFD_SEND_INFO_UDP mov eax,[eax].RemoteAddress assume eax : PTA_IP_ADDRESS mov eax,[eax].Address.Address.in_addr ps > С этими структурами замучался.. imho на Си гораздо проще.