gethostbyname WSAHOST_NOT_FOUND

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

  1. nickless

    nickless New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    4
    Код (Text):
    1. section '.code' code readable writable executable  
    2. start:
    3.     invoke WSAStartup, VERSION1_1, wsadata
    4.     test eax, eax
    5.     jz @f
    6.     int3
    7. @@:
    8.     cmp [wsadata.wVersion], VERSION1_1
    9.     je @f
    10.     int3
    11. @@:
    12.     invoke socket, AF_INET, SOCK_STREAM, PF_UNSPEC ;семейство, тип сокета, протокол
    13.     cmp eax, INVALID_SOCKET
    14.     jne @f
    15.     int3
    16. @@:
    17.     mov [hsock], eax
    18.  
    19.     mov [saddr_in.sin_family], AF_INET      ;семейство
    20.     invoke htons, [port]
    21.     mov [saddr_in.sin_port], ax             ;порт
    22.     invoke gethostbyname, server
    23.     jnz @f
    24.     int3
    25. @@:
    26. ..........
    27. section '.data' data readable writable
    28. server db "ya.ru", 0
    29. port dw 80
    30. saddr_in sockaddr_in 0
    31. wsadata WSADATA ?
    32. hsock dd ?
    gethostbyname возвращает ошибку 2AF9 (WSAHOST_NOT_FOUND). wtf?

    бинарь: http://data.cod.ru/64432537034
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    немного не по теме, но почему вместо invoke htons, [port]
    не юзать bswap ?
     
  3. nickless

    nickless New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    4
    GoldFinch, из уважения к мелкомягким, не зря же они такую большую и сложную функцию писали :lol:
     
  4. nickless

    nickless New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    4
    Проверьте пожалуйста код у себя, работает ли эта функция у вас?
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    у меня тоже не работает (WSAHOST_NOT_FOUND), правда я сейчас через прокси сижу, даже пинг не работает

    тест-код
    Код (Text):
    1. ;================ MACRO DEFINITIONS =====================
    2. ;High-level-like imported api calls macro.
    3. ;Lite version with procedure calls and string constants with "\n" support.
    4. macro IMPORTS [dll,funclist] {
    5. common  data import
    6. forward dd 0,0,0,rva a#dll, rva v#dll
    7. common  dd 0,0,0,0,0
    8.     end data
    9. forward v#dll: irp func,funclist \{
    10.         p\#func dd rva a\#func
    11.         macro func [line*] \\{common
    12.           match (arglist)tail,line* \\\{ push_r arglist \\\}
    13.           call [p\#func] \\} \}
    14.     dd 0
    15. forward a#dll db `dll#".dll",0
    16.     irp func,funclist \{a\#func db 0,0,\`func,0\} }
    17. macro push_r [arg] { reverse
    18.       if arg eqtype ""
    19.      call @f
    20.      local str
    21.      str db arg,0
    22.  @@:     fix_str str,$-str
    23.       else
    24.      pushd arg
    25.       end if }
    26. macro fix_str pStr,nLen {
    27.       repeat nLen-1
    28.          load w word from pStr+%-1
    29.          if w="\n"
    30.         store word 0x0D0A at pStr+%-1
    31.          end if
    32.       end repeat }
    33. ;==============================================
    34. ;Some console output macro (print and println)
    35. macro __print text {
    36.       local size,str
    37.       push_r size,0,0
    38.       call @f
    39.       str db text
    40.  @@:  size = $-str
    41.       fix_str str,size
    42.       WriteFile([stdout]) }
    43. macro __printf format,[arglist] {
    44. common  wsprintfA(gMsgBuf,format,arglist)
    45.     local ..argcount
    46.     ..argcount=0
    47. forward ..argcount=..argcount+1
    48. common  add esp,8+..argcount*4
    49.     WriteFile([stdout],gMsgBuf,eax,0,0) }
    50. macro print format,[arg] {common
    51.       if arg eq
    52.      __print format
    53.       else
    54.      __printf format,arg
    55.       end if }
    56. macro println format,[arglist] {common print format#"\n",arglist}
    57. ;********************* PROGPAM CODE **************************************************
    58. format PE console
    59. section 'O_o' code readable executable writeable
    60. IMPORTS KERNEL32, < GetStdHandle,WriteFile,ReadFile,CreateFileA,SetFilePointer,GetLastError,CopyFileA,LoadLibraryA,CloseHandle,\
    61.             FreeLibrary,DeleteFileA,ExitProcess>,\
    62.     USER32,<wsprintfA>,\
    63.     WS2_32,<WSAStartup,gethostbyname,WSAGetLastError>
    64.  
    65.     entry $
    66.     GetStdHandle(-11) ;STD_OUTPUT_HANDLE
    67.     mov [stdout],eax
    68.     GetStdHandle(-10) ;STD_INPUT_HANDLE
    69.     mov [stdin],eax
    70.     ;===========================================
    71.     WSAStartup(0x0202,wsadata)
    72.     println "WSAStartup OK"
    73.     gethostbyname("ya.ru")
    74.     test eax,eax
    75.     jnz _ok
    76.     WSAGetLastError()
    77.     println "gethostbyname failed with error %d",eax
    78.     jmp _exit
    79. _ok:
    80.     println "gethostbyname returned OK"
    81.     ;....
    82.     ;===========================================
    83. _exit:
    84.     println "\nPress [Enter] to close log."
    85.     ReadFile([stdin],gMsgBuf,1,nRead,0)
    86.     ExitProcess(0)
    87. ;_____________________________________________
    88. ;Uninitialized data. Must be at end of section
    89. nRead dd ?
    90. org $-4
    91. nWritten dd ?
    92. stdout dd ?
    93. stdin dd ?
    94. gMsgBuf db 1024 dup (?)
    95. ;---------------
    96. wsadata db 0x4000 dup ? ;it's enough
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Всё из-за того, что WSALookupServiceBegin внутри gethostbyname возвращает WSASERVICE_NOT_FOUND.
    Почему так происходит так и не понял.
     
  7. nickless

    nickless New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    4
    Нашел ошибку:
    Код (Text):
    1. invoke htons, [port]    ;!!!
    2. .........
    3. port dw 80       ;!!!!!!
    push word ptr[xxxxxx] честно толкает в стэк два байта, а не дополненный нулями дворд. В результате стэку приходит ппц:)

    GoldFinch
    Код (Text):
    1. 004011F1   .  E8 06000000            CALL test.004011FC                             ;  PUSH ASCII "ya.ru"
    2. 004011F6   .  79 61 2E 72 75 00      ASCII "ya.ru",0
    3. 004011FC   >  FF15 90104000          CALL DWORD PTR DS:[<&WS2_32.gethostbyname>]    ; \gethostbyname
    Красиво нах;)
     
  8. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    это косяк инвока что он не выставляет принудительно размер операнда, т.е. не юзает pushd вместо push

    "call @f /db 'xxx',0/@@:" красиво, но тормозит прогу, годится только для небольших тестовых программ некритичных к быстродействию