Windows getaddrinfo挂起;不会回来

时间:2014-04-11 18:07:26

标签: windows sockets assembly getaddrinfo

尝试在汇编程序中实现一个独立于系统的套接字api作为私有项目,我编写了以下代码来解析sockaddr记录的字符串地址(DNS或直接IP)。 MSDN告诉我使用getaddrinfo。

[import getaddrinfo Ws2_32.dll]
[extern getaddrinfo]

[section .data use32 class=data]
  google db 'www.google.com', 0

[section .code use32 class=code]

main:
  push ebp
  mov ebp, esp
  call socket.initialise   ; calls successfully (debugger) WSAStartup 

  push google
  call address.translate

  [...]

; address.translate(string) : address
  address.translate:
    push ebp
    mov ebp, esp
    sub esp, 0x04
  .prepareSystemCall:
    xor eax, eax
    mov dword [ebp-0x04], eax
  .callSystemLookup:
    lea edx, [ebp-0x04]
    push edx
    push 0
    push 0
    push dword [ebp+0x08]
    call [getaddrinfo]    ; never returns
  .return:
    leave
    ret 4

但getaddrinfo的调用永远不会返回,因此没有错误代码或其他内容。为了找到问题,我在c中编写了相同的程序,它可以工作(!?)并查看生成的汇编程序代码:

004016DD 83EC 08              sub     esp, 8
004016E0 C745 DC 00000000     mov     [dword ss:ebp-24], 0
004016E7 8D45 DC              lea     eax, [dword ss:ebp-24]
004016EA 894424 0C            mov     [dword ss:esp+C], eax
004016EE C74424 08 00000000   mov     [dword ss:esp+8], 0
004016F6 C74424 04 00000000   mov     [dword ss:esp+4], 0
004016FE C70424 64504000      mov     [dword ss:esp], a.00405064  ;  ASCII "www.google.de"
00401705 E8 12020000          call    <jmp.&ws2_32.getaddrinfo>

它并不相同,但在调用之前,两个示例中的堆栈完全相同。为什么getaddrinfo不会返回?

我使用nasm和alink在Windows 7 64位上工作。

0 个答案:

没有答案