parent
ebe9f19dae
commit
30e9eadcf9
|
|
@ -6,13 +6,29 @@
|
|||
namespace art {
|
||||
|
||||
class Thread : public edxp::HookedObject {
|
||||
struct ObjPtr { void *data; ObjPtr(ObjPtr const &) = delete; } ;
|
||||
CREATE_FUNC_SYMBOL_ENTRY(ObjPtr, DecodeJObject, void *thiz, jobject obj) {
|
||||
|
||||
#ifdef __i386__
|
||||
typedef void (*DecodeJObjectType)(void **, void *thiz, jobject obj);
|
||||
inline static void (*DecodeJObjectSym)(void **, void *thiz, jobject obj);
|
||||
static void *DecodeJObject(void *thiz, jobject obj) {
|
||||
if (LIKELY(DecodeJObjectSym)) {
|
||||
// Special call conversion
|
||||
void *ret = nullptr;
|
||||
DecodeJObjectSym(&ret, thiz, obj);
|
||||
// Stack unbalanced since we faked return value as 1st param
|
||||
__asm__("sub $0x4, %esp");
|
||||
return ret;
|
||||
} else
|
||||
return nullptr;
|
||||
}
|
||||
#else
|
||||
CREATE_FUNC_SYMBOL_ENTRY(void *, DecodeJObject, void *thiz, jobject obj) {
|
||||
if (DecodeJObjectSym)
|
||||
return DecodeJObjectSym(thiz, obj);
|
||||
else
|
||||
return ObjPtr{nullptr};
|
||||
return nullptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
public:
|
||||
Thread(void *thiz) : HookedObject(thiz) {}
|
||||
|
|
@ -24,7 +40,7 @@ namespace art {
|
|||
|
||||
void *DecodeJObject(jobject obj) {
|
||||
if (thiz_ && DecodeJObjectSym) {
|
||||
return DecodeJObject(thiz_, obj).data;
|
||||
return DecodeJObject(thiz_, obj);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue