Алгоритм скачки по http на Wininet

Тема в разделе "WASM.WIN32", создана пользователем Android, 20 апр 2006.

  1. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Изучаю как IE скачивает данные по http на wininet. Меня интересуют ф-ии InternetReadFile и InternetQueryDataAvailable. При помощи перехвата апи смотрю что в нем происходит. Никак не найду закономерность. В атаче лог скачки http://wasm.ru/.

    Когда InternetQueryDataAvailable завершается успешно, то смотрим сколько имеется данных для скачки и вызываем InternetReadFile, тут нет никаких проблем.

    Но бывают случаи когда InternetQueryDataAvailable возвращает false, при этом GetLastError возвращает 997 и IE вызывает InternetReadFile c буфером определенного размера (Как он определяет размер???????!!!!!)



    Пример:
    Код (Text):
    1.  
    2. ============================================================== 
    3. InternetQueryDataAvailable = 0; [OUT]dwReaded = 0; LastError = 997 
    4.    
    5. ============================================================== 
    6. InternetReadFile = 1; [IN]dwSize = 1360; [OUT]dwRead = 1360; LastError = 12150
    7.  




    InternetQueryDataAvailable и InternetReadFile вызываются из urlmon, декомпиляция в иде ни к чему не привела, слишком много мусора.



    Вопрос: как IE определяет размер буфера после неудачного завершения InternetQueryDataAvailable?



    [​IMG] 977320129__lod.txt
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    InternetQueryDataAvailable возвращает размер поступивших непрочитаных данных. Если данных нет, то возвращается false, после чего IE выделяет фиксированый буфер и ждет поступления данных.

    Еще IE часто читает с помощью InternetReadFileEx.

    При чтении одного запроса может быть несколько раз вызвана InternetQueryDataAvailable и InternetReadFile/InternetReadFileEx.

    При подстановке фальшивых данных в IE надо хукать HttpOpenRequest/HttpSendRequest, вести таблицу соединений, после чего при вызове InternetQueryDataAvailable увеличивать размер буфера на AddDataLen-CurrentPositiоn байт. В обработчиках InternetReadFile/InternetReadFileEx при нехватке буфера надо отдавать только часть данных (со смещения CurrentPositiоn) и увеличивать CurrentPositiоn, пока не будут прочитаны все данные.
     
  3. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    после чего IE выделяет фиксированый буфер и ждет поступления данных

    Просто не могу понять как IE "угадывает" размер буфера? При каждом вызове InternetReadFile(после неудачного InternetQueryDataAvailable) размер передаваемого буфера и колво записанных в него байт совпадают. Если InternetReadFile ждет пока не заполнится весь буфер, то не пойму какой смысл в InternetQueryDataAvailable.
     
  4. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Подстановку фальшивых данных думаю проще будет сделать с помощью COM
     
  5. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Еще наблюдается такой непонятный факт, когда я в цикле скачиваю с hFile(его создает IE) данные - бывает что InternetReadFile возвращает 0, dwRead = 0(кол-во считанных байт), LastError = 997 и данные пишутся в буффер(имено те самые данные, которые должны быть записаны), таким образом когда я ориентируюсь на dwRead я пропускаю куски данных. Это меня совсем сбивает с толку!
     
  6. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Я, конечно, ламер, но если InternetReadFile вернул все нули, а данные в буфер записал, может быть файл уже был скачан ранее и лежал в локальной Temporary Internet Files?
     
  7. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Просмотр трафика показывает, что штмл код страницы качается с сервера, а картинки берутся из кеша. Все дело видимо в InternetOpen с параметром INTERNET_FLAG_ASYNC.
     
  8. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine