Вызов URLDownloadToFile из TLS callback

Тема в разделе "WASM.ASSEMBLER", создана пользователем Dzutte, 24 мар 2009.

  1. Dzutte

    Dzutte New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    17
    Приветствую!

    Столкнулся с интересной фишкой. Простейший код вида:
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'include\win32ax.inc'
    4.  
    5. entry       $
    6.     invoke UrlDownloadToFile,0,_url,_dest,0,0
    7.     or eax,eax
    8.     jne error
    9.     invoke MessageBox, 0, 'Download Complete!', 'Finish', MB_OK
    10.     invoke ShellExecute, 0, "Open", _dest, 0, 0, SW_SHOW
    11.     jmp exit
    12. error:
    13.     invoke MessageBox,0,'Download Failed!','Error',MB_OK
    14.     jmp exit
    15. exit:
    16.     invoke ExitProcess,0
    17.     ret
    18.  
    19. proc        callback,handle,reason,reserved
    20.             cmp     [reason],DLL_PROCESS_ATTACH
    21.             jnz     @f
    22.             invoke  MessageBox,0,0,0,0
    23. @@:         ret
    24. endp
    25. data        9
    26.             dd a ; StartAddressOfRawData;
    27.             dd a ; EndAddressOfRawData
    28.             dd a ; AddressOfIndex
    29.             dd c ; AddressOfCallBacks
    30. a           dd 0 ;
    31. c           dd callback ; Array Of Callbacks
    32.             dd 0        ; NULL - end of Array Of Callbacks
    33. end data
    34.  
    35. section '.data' data readable writeable
    36. _url db 'http://ya.ru/1.jpg',0
    37. _dest db 'c:\1.exe',0
    38.  
    39. section '.idata' import data readable writeable
    40.  
    41.     library urlmon,'urlmon.dll',\
    42.         user32,'user32.dll',\
    43.         kernel32,'kernel32.dll',\
    44.         shell,'SHELL32.DLL'
    45.        
    46.     import kernel32,\
    47.         ExitProcess,'ExitProcess'
    48.          
    49.     import urlmon,\
    50.         UrlDownloadToFile,'URLDownloadToFileA'
    51.  
    52.     import user32,\
    53.         MessageBox,'MessageBoxA'
    54.  
    55.     import shell,\
    56.        ShellExecute, 'ShellExecuteA'
    работает отлично. А вот если вызов UrlDownloadToFile перенести в callback - то на нём всё виснет... Попробовал продебажить - вызов, как положено, переадревуется UrlDownloadToFileW, далее идёт в недра urlmon.dll и где-то там подвисает... Кто-нибудь в курсе, с чем это связано? Видимо, не учёл что-то из особенностей TLS... :)
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    возможно связано с тем, что эта функция может создавать треды, а в колбеках это делать нельзя (как и в дллмейн)
     
  3. Dzutte

    Dzutte New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    17
    Точно! Она же создаёт поток... MSoft, cпасибо :) Дело именно в этом.