2024-09-09 21:09:37 +06:00
|
|
|
#pragma once
|
2024-12-21 00:49:06 +03:00
|
|
|
|
|
|
|
#include <cstddef>
|
2024-09-09 21:09:37 +06:00
|
|
|
#include <vector>
|
|
|
|
|
2024-12-13 18:31:55 +03:00
|
|
|
#ifdef _DEBUG
|
2024-09-11 08:58:50 +06:00
|
|
|
#define DEBUG(X) X
|
|
|
|
#else
|
|
|
|
#define DEBUG(X)
|
|
|
|
#endif
|
|
|
|
|
2024-09-09 22:52:34 +06:00
|
|
|
struct Function
|
2024-09-09 21:09:37 +06:00
|
|
|
{
|
2024-09-09 22:52:34 +06:00
|
|
|
struct Block
|
2024-09-09 21:09:37 +06:00
|
|
|
{
|
2024-09-09 22:52:34 +06:00
|
|
|
size_t base{};
|
|
|
|
size_t size{};
|
2024-12-13 18:31:55 +03:00
|
|
|
size_t projectedSize{ static_cast<size_t>(-1) }; // scratch
|
2024-09-11 08:58:50 +06:00
|
|
|
DEBUG(size_t parent{});
|
2024-09-09 22:52:34 +06:00
|
|
|
|
2024-12-13 18:31:55 +03:00
|
|
|
Block()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Block(size_t base, size_t size)
|
|
|
|
: base(base), size(size)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Block(size_t base, size_t size, size_t projectedSize)
|
|
|
|
: base(base), size(size), projectedSize(projectedSize)
|
|
|
|
{
|
|
|
|
}
|
2024-09-09 21:09:37 +06:00
|
|
|
};
|
|
|
|
|
|
|
|
size_t base{};
|
|
|
|
size_t size{};
|
2024-09-09 22:52:34 +06:00
|
|
|
std::vector<Block> blocks{};
|
2024-12-13 18:31:55 +03:00
|
|
|
|
|
|
|
Function()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Function(size_t base, size_t size)
|
|
|
|
: base(base), size(size)
|
|
|
|
{
|
|
|
|
}
|
2024-09-11 08:58:50 +06:00
|
|
|
|
2024-09-09 21:09:37 +06:00
|
|
|
size_t SearchBlock(size_t address) const;
|
2024-09-09 22:52:34 +06:00
|
|
|
static Function Analyze(const void* code, size_t size, size_t base);
|
2024-09-09 21:09:37 +06:00
|
|
|
};
|