Files
HexwellandClaude Fable 5 971296f174 refactor: separate libhijacker headers from shared contracts
source/include mixed libhijacker's private implementation headers (util.hpp
with its hand-rolled UniquePtr/String/Vector, plus kernel/, elf/, dbg/,
hijacker/) with genuinely cross-module contracts, and the whole directory was
pulled in as -isystem, so any module could reach libhijacker internals and
every warning in those headers was suppressed.

Move the libhijacker-private headers to source/libhijacker/include and expose
it as a PUBLIC include directory, so the two modules that actually use it —
util for hijacker.hpp, shellui for SHA-1 — now declare that dependency.

Split sha1.hpp: the public-domain SHA-1 goes to third_party/sha1, while
NID_KEY, Sha1 and genSha1 (which needed libhijacker's StringView) move into
the nid.hpp that uses them. shellui only ever wanted the plain digest.

Drop source/include's SYSTEM marker now that it holds only first-party
contracts. That surfaced problems -isystem had been hiding:

  * 68 format-string mismatches in dbg.hpp, printing uintptr_t with %llx
  * freebsd-helper.h redefining PROT_* and TRACEBUF over the SDK's
  * ini.h's header-only helpers declared static rather than static inline

The GNU extensions that TYPE_BEGIN/TYPE_FIELD rely on are now silenced per
header instead of by the blanket -isystem.

Also drop three redundant util.hpp includes (bootstrapper, shellui) that
referenced none of its symbols, and fix backtrace.hpp being included through
relative ../include paths.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-26 20:13:50 +08:00

195 lines
3.6 KiB
C++

#pragma once
#include "kernel.hpp"
#include "kernel/kernel.hpp"
namespace {
static constexpr size_t TRAPFRAME_SIZE = 0x110;
}
class TrapFrame : public KernelObject<TrapFrame, TRAPFRAME_SIZE> {
static constexpr size_t RAX_OFFSET = 0x30;
static constexpr size_t RBX_OFFSET = 0x38;
static constexpr size_t RCX_OFFSET = 0x18;
static constexpr size_t RDX_OFFSET = 0x10;
static constexpr size_t RSI_OFFSET = 0x08;
static constexpr size_t RDI_OFFSET = 0x00;
static constexpr size_t R8_OFFSET = 0x20;
static constexpr size_t R9_OFFSET = 0x28;
static constexpr size_t R10_OFFSET = 0x48;
static constexpr size_t R11_OFFSET = 0x50;
static constexpr size_t R12_OFFSET = 0x58;
static constexpr size_t R13_OFFSET = 0x60;
static constexpr size_t R14_OFFSET = 0x68;
static constexpr size_t R15_OFFSET = 0x70;
static constexpr size_t RBP_OFFSET = 0x40;
static constexpr size_t RSP_OFFSET = 0x100;
static constexpr size_t RIP_OFFSET = 0xe8;
public:
TrapFrame(uintptr_t addr) : KernelObject(addr) {}
TrapFrame &setFrame(const TrapFrame *frame) {
memcpy(buf, frame->buf, sizeof(buf));
return *this;
}
uint64_t getRax() {
return get<uint64_t, RAX_OFFSET>();
}
TrapFrame &setRax(uint64_t rax) {
set<RAX_OFFSET>(rax);
return *this;
}
uint64_t getRbx() {
return get<uint64_t, RBX_OFFSET>();
}
TrapFrame &setRbx(uint64_t rbx) {
set<RBX_OFFSET>(rbx);
return *this;
}
uint64_t getRcx() {
return get<uint64_t, RCX_OFFSET>();
}
TrapFrame &setRcx(uint64_t rcx) {
set<RCX_OFFSET>(rcx);
return *this;
}
uint64_t getRdx() {
return get<uint64_t, RDX_OFFSET>();
}
TrapFrame &setRdx(uint64_t rdx) {
set<RDX_OFFSET>(rdx);
return *this;
}
uint64_t getRsi() {
return get<uint64_t, RSI_OFFSET>();
}
TrapFrame &setRsi(uint64_t rsi) {
set<RSI_OFFSET>(rsi);
return *this;
}
uint64_t getRdi() {
return get<uint64_t, RDI_OFFSET>();
}
TrapFrame &setRdi(uint64_t rdi) {
set<RDI_OFFSET>(rdi);
return *this;
}
uint64_t getR8() {
return get<uint64_t, R8_OFFSET>();
}
TrapFrame &setR8(uint64_t r8) {
set<R8_OFFSET>(r8);
return *this;
}
uint64_t getR9() {
return get<uint64_t, R9_OFFSET>();
}
TrapFrame &setR9(uint64_t r9) {
set<R9_OFFSET>(r9);
return *this;
}
uint64_t getR10() {
return get<uint64_t, R10_OFFSET>();
}
TrapFrame &setR10(uint64_t r10) {
set<R10_OFFSET>(r10);
return *this;
}
uint64_t getR11() {
return get<uint64_t, R11_OFFSET>();
}
TrapFrame &setR11(uint64_t r11) {
set<R11_OFFSET>(r11);
return *this;
}
uint64_t getR12() {
return get<uint64_t, R12_OFFSET>();
}
TrapFrame &setR12(uint64_t r12) {
set<R12_OFFSET>(r12);
return *this;
}
uint64_t getR13() {
return get<uint64_t, R13_OFFSET>();
}
TrapFrame &setR13(uint64_t r13) {
set<R13_OFFSET>(r13);
return *this;
}
uint64_t getR14() {
return get<uint64_t, R14_OFFSET>();
}
TrapFrame &setR14(uint64_t r14) {
set<R14_OFFSET>(r14);
return *this;
}
uint64_t getR15() {
return get<uint64_t, R15_OFFSET>();
}
TrapFrame &setR15(uint64_t r15) {
set<R15_OFFSET>(r15);
return *this;
}
uint64_t getRbp() {
return get<uint64_t, RBP_OFFSET>();
}
TrapFrame &setRbp(uint64_t rbp) {
set<RBP_OFFSET>(rbp);
return *this;
}
uint64_t getRsp() {
return get<uint64_t, RSP_OFFSET>();
}
TrapFrame &setRsp(uint64_t rsp) {
set<RSP_OFFSET>(rsp);
return *this;
}
uint64_t getRip() {
return get<uint64_t, RIP_OFFSET>();
}
TrapFrame &setRip(uint64_t rip) {
set<RIP_OFFSET>(rip);
return *this;
}
};