Причина кажущихся случайными сбоев в wininet.dll?

Я получаю сбои глубоко в wininet.dll. Произошел сбой при попытке прочитать нулевую ячейку памяти в HTTP_REQUEST_HANDLE_OBJECT::ReleaseConnection

Является ли это ошибкой в ​​реальной DLL, а не вызвано неправильным использованием?

wininet!HTTP_REQUEST_HANDLE_OBJECT::ReleaseConnection+0x60
wininet!HTTP_REQUEST_HANDLE_OBJECT::CloseConnection+0x84
wininet!HTTP_REQUEST_HANDLE_OBJECT::ReadData_Fsm+0x5e8
wininet!CFsm_ReadData::RunSM+0x2e!wininet!CFsm_ReadData::RunSM+0x2e
wininet! +0x39
wininet!DoFsm+0x25
wininet!HTTP_REQUEST_HANDLE_OBJECT::ReadData+0x38
wininet!HTTP_REQUEST_HANDLE_OBJECT::HttpReadData_Fsm+0x43
wininet!CFsm_HttpReadData::RunSM+0x2e
:wininet!CFsm :Run+0x39
wininet!DoFsm+0x25
wininet!HttpReadData+0x67
wininet!ReadFile_Fsm+0x2d
wininet!CFsm_ReadFile::RunSM+0x2b
wininet!CFsm::Run+0x39
wininet!DoFsm+0x25
wininet!InternetReadFile+0x3ca

Контекст: я пытаюсь загрузить файл. я звоню

InternetReadFile(hFile, lpBuffer, dwNumberOfBytesToRead, lpdwNumberOfBytesRead);

Дескриптор hFile HINTERNET выглядит нормально (значение 0x00cc0024, что кажется допустимым), dwNumberOfBytesToRead равно 20000.

Размер моего буфера 131000, что тоже нормально.

Дело в том, что мой код работает в 99,9999% случаев!


person crazyx    schedule 12.08.2010    source источник
comment
Вероятно, вы передаете ему неверные данные. Какой вызов из вашей программы вызывает сбой? Пожалуйста, вставьте вызов и соответствующий окружающий код.   -  person Thomas    schedule 12.08.2010
comment
Вам потребуется предоставить намного больше контекста, т. е. пример того, как вы вызываете WinInet, что вызывает ошибку, и уровень операционной системы и пакета обновлений, который вы используете. повторное тестирование. Учитывая, что это основная часть ОС Windows, скорее всего, вина лежит на вас (хотя всегда есть шанс, что вы нашли пока неизвестную ошибку в Windows =)   -  person Rob    schedule 12.08.2010
comment
Я пытаюсь скачать файл. Я вызываю InternetReadFile (hFile, lpBuffer, dwNumberOfBytesToRead, lpdwNumberOfBytesRead); Дескриптор hFile HINTERNET выглядит нормально (значение 0x00cc0024, что кажется допустимым), dwNumberOfBytesToRead равно 20000.   -  person crazyx    schedule 12.08.2010
comment
Ганс: Я не уверен, что если бы это было повреждение кучи, маловероятно, что он читал бы ячейку памяти 0. Повреждения кучи обычно считывают случайную ячейку памяти. Чтение 0 больше похоже на то, что ваш код стреляет себе в ногу.   -  person crazyx    schedule 13.08.2010


Ответы (2)


Проверьте использование lpdwNumberOfBytesRead. Это должно быть либо

DWORD *lpdwNumberOfBytesRead = &someDWORDsomewhere;
InternetReadFile (..., lpdwNumberOfBytesRead);

or

DWORD NumBytes
InternetReadFile (..., &NumBytes);

У меня такое ощущение, что вы выполняете первый метод, не устанавливая переменную указателя где-то действительно.

person wallyk    schedule 12.08.2010
comment
Я использую второй метод, дело в том, что мой код работает в 99,9999% случаев! Однако спасибо за указатель. - person crazyx; 13.08.2010
comment
Если вам нужен быстрый и правильный ответ, опубликуйте соответствующий код. - person wallyk; 13.08.2010

Я обнаружил, что проблема заключалась в вызове InternetCloseHandle в других потоках с уже закрытым дескриптором. Обычно это просто возвращает ERROR_INVALID_HANDLE, но в некоторых случаях вызывает сбой wininet либо в InternetCloseHandle, либо как в этом случае.

person crazyx    schedule 16.08.2010