Re[2]: wininet hooks
От: linkoln  
Дата: 05.04.13 19:11
Оценка:
Здравствуйте, 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 );
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.