Изучаю как IE скачивает данные по http на wininet. Меня интересуют ф-ии InternetReadFile и InternetQueryDataAvailable. При помощи перехвата апи смотрю что в нем происходит. Никак не найду закономерность. В атаче лог скачки http://wasm.ru/. Когда InternetQueryDataAvailable завершается успешно, то смотрим сколько имеется данных для скачки и вызываем InternetReadFile, тут нет никаких проблем. Но бывают случаи когда InternetQueryDataAvailable возвращает false, при этом GetLastError возвращает 997 и IE вызывает InternetReadFile c буфером определенного размера (Как он определяет размер???????!!!!!) Пример: Код (Text): ============================================================== InternetQueryDataAvailable = 0; [OUT]dwReaded = 0; LastError = 997 ============================================================== InternetReadFile = 1; [IN]dwSize = 1360; [OUT]dwRead = 1360; LastError = 12150 InternetQueryDataAvailable и InternetReadFile вызываются из urlmon, декомпиляция в иде ни к чему не привела, слишком много мусора. Вопрос: как IE определяет размер буфера после неудачного завершения InternetQueryDataAvailable? 977320129__lod.txt
InternetQueryDataAvailable возвращает размер поступивших непрочитаных данных. Если данных нет, то возвращается false, после чего IE выделяет фиксированый буфер и ждет поступления данных. Еще IE часто читает с помощью InternetReadFileEx. При чтении одного запроса может быть несколько раз вызвана InternetQueryDataAvailable и InternetReadFile/InternetReadFileEx. При подстановке фальшивых данных в IE надо хукать HttpOpenRequest/HttpSendRequest, вести таблицу соединений, после чего при вызове InternetQueryDataAvailable увеличивать размер буфера на AddDataLen-CurrentPositiоn байт. В обработчиках InternetReadFile/InternetReadFileEx при нехватке буфера надо отдавать только часть данных (со смещения CurrentPositiоn) и увеличивать CurrentPositiоn, пока не будут прочитаны все данные.
после чего IE выделяет фиксированый буфер и ждет поступления данных Просто не могу понять как IE "угадывает" размер буфера? При каждом вызове InternetReadFile(после неудачного InternetQueryDataAvailable) размер передаваемого буфера и колво записанных в него байт совпадают. Если InternetReadFile ждет пока не заполнится весь буфер, то не пойму какой смысл в InternetQueryDataAvailable.
Еще наблюдается такой непонятный факт, когда я в цикле скачиваю с hFile(его создает IE) данные - бывает что InternetReadFile возвращает 0, dwRead = 0(кол-во считанных байт), LastError = 997 и данные пишутся в буффер(имено те самые данные, которые должны быть записаны), таким образом когда я ориентируюсь на dwRead я пропускаю куски данных. Это меня совсем сбивает с толку!
Я, конечно, ламер, но если InternetReadFile вернул все нули, а данные в буфер записал, может быть файл уже был скачан ранее и лежал в локальной Temporary Internet Files?
Просмотр трафика показывает, что штмл код страницы качается с сервера, а картинки берутся из кеша. Все дело видимо в InternetOpen с параметром INTERNET_FLAG_ASYNC.