/* XMRig * Copyright (c) 2018-2019 tevador * Copyright (c) 2018-2021 SChernykh * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "crypto/rx/RxFix.h" #include "base/io/log/Log.h" #include namespace xmrig { static thread_local std::pair mainLoopBounds = { nullptr, nullptr }; static LONG WINAPI MainLoopHandler(_EXCEPTION_POINTERS *ExceptionInfo) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == 0xC0000005) { const char* accessType = nullptr; switch (ExceptionInfo->ExceptionRecord->ExceptionInformation[0]) { case 0: accessType = "read"; break; case 1: accessType = "write"; break; case 8: accessType = "DEP violation"; break; default: accessType = "unknown"; break; } LOG_VERBOSE(YELLOW_BOLD("[THREAD %u] Access violation at 0x%p: %s at address 0x%p"), GetCurrentThreadId(), ExceptionInfo->ExceptionRecord->ExceptionAddress, accessType, ExceptionInfo->ExceptionRecord->ExceptionInformation[1]); } else { LOG_VERBOSE(YELLOW_BOLD("[THREAD %u] Exception 0x%08X at 0x%p"), GetCurrentThreadId(), ExceptionInfo->ExceptionRecord->ExceptionCode, ExceptionInfo->ExceptionRecord->ExceptionAddress); } void* p = reinterpret_cast(ExceptionInfo->ContextRecord->Rip); // NOLINT(performance-no-int-to-ptr) const std::pair& loopBounds = mainLoopBounds; if ((loopBounds.first <= p) && (p < loopBounds.second)) { ExceptionInfo->ContextRecord->Rip = reinterpret_cast(loopBounds.second); return EXCEPTION_CONTINUE_EXECUTION; } return EXCEPTION_CONTINUE_SEARCH; } } // namespace xmrig void xmrig::RxFix::setMainLoopBounds(const std::pair &bounds) { mainLoopBounds = bounds; } void xmrig::RxFix::setupMainLoopExceptionFrame() { AddVectoredExceptionHandler(1, MainLoopHandler); }