2022-02-16 07:24:35 +08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "common.hpp"
|
|
|
|
|
|
|
|
namespace lsplant::art {
|
|
|
|
|
|
|
|
class Thread {
|
|
|
|
struct ObjPtr {
|
|
|
|
void *data;
|
|
|
|
};
|
|
|
|
|
|
|
|
CREATE_MEM_FUNC_SYMBOL_ENTRY(ObjPtr, DecodeJObject, Thread *thiz, jobject obj) {
|
|
|
|
if (DecodeJObjectSym)
|
|
|
|
return DecodeJObjectSym(thiz, obj);
|
|
|
|
else
|
2022-03-11 19:37:11 +08:00
|
|
|
return {.data = nullptr};
|
2022-02-16 07:24:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
CREATE_FUNC_SYMBOL_ENTRY(Thread *, CurrentFromGdb) {
|
|
|
|
if (CurrentFromGdbSym) [[likely]]
|
|
|
|
return CurrentFromGdbSym();
|
|
|
|
else
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
2022-03-11 19:37:11 +08:00
|
|
|
static Thread *Current() { return CurrentFromGdb(); }
|
2022-02-16 07:24:35 +08:00
|
|
|
|
|
|
|
static bool Init(const HookHandler &handler) {
|
2022-03-11 19:37:11 +08:00
|
|
|
if (!RETRIEVE_MEM_FUNC_SYMBOL(DecodeJObject, "_ZNK3art6Thread13DecodeJObjectEP8_jobject")) {
|
2022-02-16 07:24:35 +08:00
|
|
|
return false;
|
|
|
|
}
|
2022-03-11 19:37:11 +08:00
|
|
|
if (!RETRIEVE_FUNC_SYMBOL(CurrentFromGdb, "_ZN3art6Thread14CurrentFromGdbEv")) {
|
2022-02-16 07:24:35 +08:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *DecodeJObject(jobject obj) {
|
|
|
|
if (DecodeJObjectSym) [[likely]] {
|
|
|
|
return DecodeJObject(this, obj).data;
|
|
|
|
}
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
};
|
2022-03-11 19:37:11 +08:00
|
|
|
} // namespace lsplant::art
|