Здравствуйте, ononim,
Выкинуть хуки сразу подумалось, но там кода — необходимый минимум, т.е. если чтото убрать — общая картина перестает полностью работать.
Решил пересобрать логи, пересмотреть по новому и подготовить что-то для поста сюда. Во время подготовки логов было замечено что я упустил один немаловажный момент — INTERNET_STATUS_RESPONSE_RECEIVED в каллбеке. Как его правильно обрабатывать я так и не понял,у меня еррор (ERROR_INTERNET_INCORRECT_HANDLE_STATE) валится при попытке вычитать данные при помощи как InternetReadFile так и pInternetReadFileEx. Читал заметки одного "Хакер"-а_телепата..лучше бы его не читал, а то запутал полностью. Вот как я обрабатываю данное событие:
BOOL
IeReadData (
IN PCONNECTION hConn,
IN OUT PULONG DataSize
)
{
ULONG size;
BYTE buff [MAX_PATH];
PVOID Buffer;
ULONG TotalSize;
BOOL result;
/*
Read data from wininet
return TRUE only if all data was received
otherwise return FALSE
*/
DPRINT( "<IeReadData BEGIN> for [%X]\n\tInetHandle: %X\n\tStage: %X\n\tDataSize: %X\n\n",
hConn,
hConn->InetHandle,
hConn->Stage,
*DataSize );
size = *DataSize;
Buffer = Alloc( isd,
size,
NULL,
hConn );
if (!Buffer)
return 0;
result = FALSE;
TotalSize = 0;
while (TRUE) {
if (!isd->vpt.pInternetReadFile( hConn->InetHandle, Buffer, size, &size )) {
if (Buffer != buff)
Free( isd,
Buffer,
NULL,
hConn );
break;
}
if (!size) {
/* all data has been readed from wininet */
result = TRUE;
break;
}
TotalSize += size;
if (Buffer == buff) {
Buffer = Alloc( isd,
size,
NULL,
hConn );
if (!Buffer) {
TotalSize -= size;
break;
}
MemCpy( Buffer,
buff,
size );
}
Buffer = buff;
size = sizeof( buff );
}
DPRINT( "<IeReadData DONE> for [%X]\n\tInetHandle: %X\n\tStage: %X\n\tTotalSize: %X\n\tError: %X\n\n",
hConn,
hConn->InetHandle,
hConn->Stage,
TotalSize,
GetLastError() );
*DataSize = TotalSize;
return result;
}
VOID
CALLBACK
InternetStatusCallbackHook (
IN HINTERNET hInternet,
IN DWORD_PTR Context,
IN DWORD InternetStatus,
IN PVOID StatusInformation,
IN DWORD StatusInformationLength
)
{
PCONNECTION hConn;
BOOL SkipOrigCall;
hConn = SearchConnection( hInternet );
if (hConn) {
SkipOrigCall = TRUE;
switch (InternetStatus) {
case INTERNET_STATUS_RESPONSE_RECEIVED:
if (StatusInformation && StatusInformationLength == sizeof(DWORD)) {
/* try read data from wininet buffer */
size = *(PDWORD)StatusInformation;
result = IeReadData( hConn,
&size );
if (result) {
/* all data received - return data to ie */
SkipOrigCall = FALSE;
}
} else
SkipOrigCall = FALSE;
break;
}
} else
SkipOrigCall = FALSE;
if (!SkipOrigCall)
((INTERNET_STATUS_CALLBACK)InternetStatusCallbackOrig)( hInternet,
Context,
InternetStatus,
StatusInformation,
StatusInformationLength );
}