mirror of
https://github.com/mirkobrombin/raven.git
synced 2026-11-03 21:46:32 +00:00
48 lines
1.7 KiB
C++
48 lines
1.7 KiB
C++
#include "exceptions.h"
|
|
|
|
#include <stdexcept>
|
|
|
|
namespace raven {
|
|
|
|
NativeResult native_raise_exception(NativeProcess &process)
|
|
{
|
|
const auto arguments = process.api_arguments(4);
|
|
NativeResult result{NativeStop::exception, static_cast<uint32_t>(arguments[0]),
|
|
process.context().registers.rip - 1, 0};
|
|
result.exception_flags = static_cast<uint32_t>(arguments[1]);
|
|
if (arguments[3]) {
|
|
const auto count = static_cast<uint32_t>(arguments[2]);
|
|
if (count > 15)
|
|
throw std::runtime_error("RaiseException exceeds the Windows parameter limit");
|
|
if (!count)
|
|
return result;
|
|
const auto bytes = process.read_memory(arguments[3], size_t(count) * 8);
|
|
result.exception_information.resize(count);
|
|
for (size_t index = 0; index < bytes.size(); ++index)
|
|
result.exception_information[index / 8] |= uint64_t(bytes[index]) << ((index % 8) * 8);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
NativeResult native_raise_rtl_exception(NativeProcess &process, bool status_only)
|
|
{
|
|
const auto arguments=process.api_arguments(1);
|
|
NativeResult result{NativeStop::exception,uint32_t(arguments[0]),process.context().registers.rip-1,0};
|
|
if (status_only) { result.exception_flags=1; return result; }
|
|
const auto bytes=process.read_memory(arguments[0],152);
|
|
const auto field=[&](size_t offset,size_t size) {
|
|
uint64_t value=0;
|
|
for (size_t byte=0; byte<size; ++byte) value|=uint64_t(bytes[offset+byte])<<(byte*8);
|
|
return value;
|
|
};
|
|
result.value=field(0,4);
|
|
result.exception_flags=uint32_t(field(4,4));
|
|
result.instruction=field(16,8);
|
|
const auto count=field(24,4);
|
|
if (count>15) throw std::runtime_error("RtlRaiseException exceeds the Windows parameter limit");
|
|
for (size_t index=0; index<count; ++index) result.exception_information.push_back(field(32+index*8,8));
|
|
return result;
|
|
}
|
|
|
|
}
|