Проблемы с InternetReadFile

Тема в разделе "WASM.BEGINNERS", создана пользователем SiruS, 2 сен 2006.

  1. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    Помогите разобраться. Проверил и перепроверил все что можно, но этот загрузчик файлов неработает! По всей видимости ошибка где-то рядом с InternetReadFile, но немогу понять где. Код чуть-чуть поправил из фасмовского SWID и добавил то что мне было нужно. Компилировать как консольное приложение.

    Код (Text):
    1. .386
    2. .model  flat, stdcall
    3. option  casemap:none
    4.  
    5. include windows.inc
    6.  
    7. include user32.inc
    8. include kernel32.inc
    9. include masm32.inc
    10. include wininet.inc
    11. include oleaut32.inc
    12.  
    13. includelib user32.lib
    14. includelib kernel32.lib
    15. includelib masm32.lib
    16. includelib wininet.lib
    17. includelib oleaut32.lib
    18.  
    19. .data
    20. dl_id   db "Microsoft Internet Explorer",0
    21. done    db ">>> [ Download complete ]",0
    22. fail    db ">>> [ Missing CMD parameter ]",0
    23. error   db ">>> [ Invalid CMD line parameters ]",0
    24. nosession   db ">>> [ Unable to create new remote session! ]",0
    25. nourl       db ">>> [ There are no connection with remote host! ]",0Dh,">>> [ Please check is connection alive? ]",0
    26. noopenfile  db ">>> [ Unable to create\open local file! ]",0Dh,">>> [ Please check your settings! ]",0
    27. noremotefile    db ">>> [ Error while reading remote file! ]",0
    28.  
    29. hFile dd 0
    30. hInt dd 0
    31. hUrl dd 0
    32. dwRWfile dd 0
    33. dwRWurl dd 0
    34.  
    35. .data?
    36. url     dd 1024 dup(?)
    37. save    dd 256 dup(?)
    38. savebuf dd 1024 dup (?)
    39. buff    dd 1024*8 dup (?)
    40.  
    41. .code
    42. start:
    43. invoke GetCL,1,addr url
    44. .if eax == 1
    45.     invoke GetCL,2,addr save
    46.     .if eax == 1
    47.         invoke InternetOpen,addr dl_id,INTERNET_OPEN_TYPE_DIRECT,0,0,0
    48.         test eax,eax
    49.         jnz @F
    50.         invoke StdOut,addr nosession
    51.         jmp @exit
    52. @@:
    53.         mov hInt,eax
    54.         invoke InternetOpenUrl,eax,addr url,0,0,0,0
    55.         test eax,eax
    56.         jnz @F
    57.         invoke StdOut,addr nourl
    58.         jmp _close_inet
    59. @@:
    60.         mov hUrl,eax
    61.         invoke CreateFile,addr save,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    62.         test eax,eax
    63.         jns @F
    64.         invoke StdOut,addr noopenfile
    65.         jmp _close_inet
    66. @@:
    67.         mov hFile,eax
    68. _read_remote_file:
    69.         invoke InternetReadFile,hUrl,offset buff,8192,dwRWurl ; ОШИБКА ГДЕ-ТО ЗДЕСЬ
    70.         .if eax == TRUE
    71.             jnz @F
    72.         .else
    73.             invoke StdOut,addr noremotefile
    74.             jmp _error_read_remote_file
    75.         .endif
    76. @@:
    77.         cmp dwRWurl,0
    78.         je @F
    79.         invoke WriteFile,hFile,addr buff,dwRWurl,dwRWfile,0
    80.         jmp _read_remote_file
    81. @@:
    82.         invoke StdOut,addr done
    83. _error_read_remote_file:
    84.         invoke CloseHandle,hFile
    85. _close_inet:
    86.         invoke InternetCloseHandle,hInt
    87.     .endif
    88. .else
    89.     invoke StdOut,addr error
    90.     jmp @exit
    91. .endif
    92.  
    93. @exit:
    94.     invoke ExitProcess,0
    95.    
    96. end start
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    SiruS
    Последний параметр InternetReadFile - _адрес_ переменной в которую будет помещено количество принятых байтов. + Аналогично InternetOpen парой к InternetOpenUrl нужен InternetCloseHandle.
     
  3. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    q_q

    Я знаю что последний параметр это кол-во принятых байт, но почему-то он постоянно равен 0. С InternetCloseHandle это я протупил, спасибо. Что ты хотел сказать говоря что
    ? Мож что-то исправить в коде надо, ткни меня носом :)
     
  4. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    Или может лучше помогите написать callback процедуру к URLDownloadToFile, так чтобы я видел количество переданных байт.
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    SiruS
    знаю что последний параметр это кол-во принятых байт
    Не правильно знаешь, да к тому же не внимательно читаешь. Не количество, а _адрес_ переменной в которой будет возвращено количество.

    почему-то он постоянно равен 0
    Потому что ты его разместил в сегменте инициализированных данных, инициализировал нулем, передал этот ноль в InternetReadFile, которая проверив, что переданный адрес равен нулю не пытается ничего записать по нему.

    может лучше помогите написать callback процедуру к URLDownloadToFile
    В чем собственно проблема? Покажи свой код.
     
  6. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    q_q

    Код (Text):
    1. .386
    2. .model  flat, stdcall
    3. option  casemap:none
    4.  
    5. include windows.inc
    6.  
    7. include user32.inc
    8. include kernel32.inc
    9. include masm32.inc
    10. include comdlg32.inc
    11. include urlmon.inc
    12.  
    13. includelib user32.lib
    14. includelib kernel32.lib
    15. includelib masm32.lib
    16. includelib comdlg32.lib
    17. includelib urlmon.lib
    18.  
    19. .data
    20. done    db ">>> [ Download done! ]",0
    21. fail    db ">>> [ Download failed! ]",0
    22. error   db ">>> [ Invalid CMD line parameters ]",0
    23.  
    24. .data?
    25. url     dd 1024 dup(?)
    26. save    dd 256 dup(?)
    27.  
    28. .code
    29. start:
    30.  
    31. invoke GetCL,1,addr url
    32. .if eax == 1
    33.     invoke GetCL,2,addr save
    34.     .if eax == 1
    35.         invoke URLDownloadToFile,0,addr url,addr save,0,0 ; вот сюда вместо 0 надо дописать процедуру обратной связи
    36.         .if eax == 0
    37.             invoke StdOut,addr done
    38.             jmp @exit
    39.         .else
    40.             invoke StdOut,addr fail
    41.             jmp @exit
    42.         .endif
    43.     .else
    44.         invoke StdOut,addr error
    45.         jmp @exit
    46.     .endif
    47. .else
    48.     invoke StdOut,addr error
    49.     jmp @exit
    50. .endif
    51.  
    52. @exit:
    53.     invoke ExitProcess,0
    54.    
    55. end start
    Можешь помочь?

    Я поправил предыдущий код, но он все равно выдает ошибку в том же месте.
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    invoke InternetReadFile,hUrl,offset buff,8192,addr dwRWurl
    и dwRWurl перемести в секцию .data?
     
  8. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    slow

    Спасибо, с секцией данных я давно разобрался. А вот с указателем на dwRWurl я очень глупо попался :dntknw: Еще раз спасибо всем, кто принял участие в исправлении меня неисправимого (с) и тугого как сибирский валенок :)