Вопрос Как контрить EXCEPTION_ACCESS_VIOLATION?

ппоршень
Пользователь
Статус
Оффлайн
Регистрация
15 Фев 2020
Сообщения
294
Реакции[?]
46
Поинты[?]
32K
Есть функция которая ищет целочисленные значения в памяти процесса. Её код:
C++:
template <class type> _inline auto find( type buffer, umemory_pointer start = vmsearch_start, umemory_pointer end = vmsearch_end ) -> std::vector<umemory_pointer> {
    std::vector<umemory_pointer> results;
    for( ; start<end; start += sizeof buffer ) {
        try {
            if( ( *( type * ) ( start ) )==buffer ) {
                results.push_back( start );
            }
        }
        catch ( std::exception ) {   
            continue;
        }
    }
    return results;
}
Она лишь занимается тем что перебирает адреса от 0x00000000 до 0xFFFFFFFF (x86), но конечно по адресу 0x0000000 ничего не будет аллокнуто, поэтому вылетит EXCEPTION_ACCESS_VIOLATION. Мне нужно игнорировать это исключение и идти дальше по циклу. Но обычный try catch в C++ его не ловит, а с __try __except код просто не компилируется из за ошибки C2712. Как контрить EXCEPTION_ACCESS_VIOLATION в этом цикле?
 
ЧВК EB_LAN
Забаненный
Статус
Оффлайн
Регистрация
12 Сен 2021
Сообщения
425
Реакции[?]
121
Поинты[?]
162K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
создай VEH (Vectored Exception Handler) и просто в нем создай проверку на этот екзептион и возвращай continue execution / continue search (точно не помню, сорян)
 
ппоршень
Пользователь
Статус
Оффлайн
Регистрация
15 Фев 2020
Сообщения
294
Реакции[?]
46
Поинты[?]
32K
создай VEH (Vectored Exception Handler) и просто в нем создай проверку на этот екзептион и возвращай continue execution / continue search (точно не помню, сорян)
у меня есть этот хандлер, только либо я долбаеб, либо он не работает
C++:
#include "logger.h"

_c_eul_exception_handler *g_exceptionHandler = new c_eul_exception_handler;

_c_eul_exception_handler::_c_eul_exception_handler( void ) {
    this->m_old_error_mode = SetErrorMode( 0 );
    this->m_exception_handler = SetUnhandledExceptionFilter( &vectored_eul_exception_handler );
}

_c_eul_exception_handler::~_c_eul_exception_handler( void ) {
    SetErrorMode( this->m_old_error_mode );
    SetUnhandledExceptionFilter( reinterpret_cast< decltype( &vectored_eul_exception_handler ) >( this->m_exception_handler ) );
}

auto _c_eul_exception_handler::attach( void ) -> e_ustatus {
    if( !this->m_old_error_mode||!this->m_exception_handler ) {
        return e_ustatus::US_EXCEPTHANDLER_ATTACH_ERROR;
    }
    return e_ustatus::US_SUCCESS;
}

long __stdcall vectored_eul_exception_handler( EXCEPTION_POINTERS *exception_info ) {
    const auto exception_code = exception_info->ExceptionRecord->ExceptionCode;
    if( exception_code==EXCEPTION_BREAKPOINT||exception_code==DBG_PRINTEXCEPTION_C||exception_code==DBG_PRINTEXCEPTION_WIDE_C ) {
        return EXCEPTION_CONTINUE_SEARCH;
    }
    printwrn( mdef_format( "Exception was thrown: {}", exception_code ) );
    return EXCEPTION_CONTINUE_EXECUTION;
}
 
ЧВК EB_LAN
Забаненный
Статус
Оффлайн
Регистрация
12 Сен 2021
Сообщения
425
Реакции[?]
121
Поинты[?]
162K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
у меня есть этот хандлер, только либо я долбаеб, либо он не работает
C++:
#include "logger.h"

_c_eul_exception_handler *g_exceptionHandler = new c_eul_exception_handler;

_c_eul_exception_handler::_c_eul_exception_handler( void ) {
    this->m_old_error_mode = SetErrorMode( 0 );
    this->m_exception_handler = SetUnhandledExceptionFilter( &vectored_eul_exception_handler );
}

_c_eul_exception_handler::~_c_eul_exception_handler( void ) {
    SetErrorMode( this->m_old_error_mode );
    SetUnhandledExceptionFilter( reinterpret_cast< decltype( &vectored_eul_exception_handler ) >( this->m_exception_handler ) );
}

auto _c_eul_exception_handler::attach( void ) -> e_ustatus {
    if( !this->m_old_error_mode||!this->m_exception_handler ) {
        return e_ustatus::US_EXCEPTHANDLER_ATTACH_ERROR;
    }
    return e_ustatus::US_SUCCESS;
}

long __stdcall vectored_eul_exception_handler( EXCEPTION_POINTERS *exception_info ) {
    const auto exception_code = exception_info->ExceptionRecord->ExceptionCode;
    if( exception_code==EXCEPTION_BREAKPOINT||exception_code==DBG_PRINTEXCEPTION_C||exception_code==DBG_PRINTEXCEPTION_WIDE_C ) {
        return EXCEPTION_CONTINUE_SEARCH;
    }
    printwrn( mdef_format( "Exception was thrown: {}", exception_code ) );
    return EXCEPTION_CONTINUE_EXECUTION;
}
Так у тебя же нету проверки на аццес виолатион, бро
 
ппоршень
Пользователь
Статус
Оффлайн
Регистрация
15 Фев 2020
Сообщения
294
Реакции[?]
46
Поинты[?]
32K
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,595
Реакции[?]
603
Поинты[?]
44K
из мем акцесс еррора не вернуться живым - ты запросил доступ к неаллоцированной памяти, в чём соль?
попробуй использовать SEH, конечно, но воняет лютым говном.
 
ЧВК EB_LAN
Забаненный
Статус
Оффлайн
Регистрация
12 Сен 2021
Сообщения
425
Реакции[?]
121
Поинты[?]
162K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
оно же в любом случае по итогу вернет EXCEPTION_CONTINUE_EXECUTION, или это не так работает?
Нет... Она никак не относится к ацесс виолашиону, они относится только к 3 екзептионам которые ты прописал....
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,595
Реакции[?]
603
Поинты[?]
44K
в <eh.h> валяется _set_se_translator, что юзается как лямбда (первая ссылка из гугла)
 
ппоршень
Пользователь
Статус
Оффлайн
Регистрация
15 Фев 2020
Сообщения
294
Реакции[?]
46
Поинты[?]
32K
Нет... Она никак не относится к ацесс виолашиону, они относится только к 3 екзептионам которые ты прописал....
я дописал туда access violation и ничего не поменялось
 
Разработчик
Статус
Оффлайн
Регистрация
18 Мар 2020
Сообщения
439
Реакции[?]
870
Поинты[?]
195K
Она лишь занимается тем что перебирает адреса от 0x00000000 до 0xFFFFFFFF (x86), но конечно по адресу 0x0000000 ничего не будет аллокнуто, поэтому вылетит EXCEPTION_ACCESS_VIOLATION.
Вообще не выкупил прикола твоего кода, если проходишься по всей памяти своего процесса, то почему не используешь VirtualQuery для этого? Ты бы мог снизить риск попадания в такие ситуации с исключениями просто проверяя переменные структуры, которую тебе на блюдечке даёт VirtualQuery, а не в тупую сидеть пытаться прочитать невалидную память
Да и в целом к коду вопросов много, но это ладно, бог с ним :roflanEbalo:
 
Сверху Снизу