diff --git a/Cheat Engine/LuaHandler.pas b/Cheat Engine/LuaHandler.pas index 4f032a39..407f38b7 100755 --- a/Cheat Engine/LuaHandler.pas +++ b/Cheat Engine/LuaHandler.pas @@ -343,7 +343,7 @@ begin lua_pushstring(l, e.Message); - if (GetCurrentThreadId=MainThreadID) and (e.Message='Access violation') and mainform.miEnableLCLDebug.checked then + if (GetCurrentThreadId=MainThreadID) and mainform.miEnableLCLDebug.checked then begin DebugLn('Lua Exception: '+e.Message); lazlogger.DumpExceptionBackTrace; diff --git a/Cheat Engine/LuaStream.pas b/Cheat Engine/LuaStream.pas index 1f6cdce2..ee911821 100755 --- a/Cheat Engine/LuaStream.pas +++ b/Cheat Engine/LuaStream.pas @@ -130,7 +130,12 @@ var stream: Tstream; begin stream:=luaclass_getClassObject(L); - lua_pushinteger(L,stream.ReadByte); + try + lua_pushinteger(L,stream.ReadByte); + except + lua_pushstring(L,'stream error'); + lua_error(L); + end; result:=1; end; @@ -139,7 +144,11 @@ var stream: Tstream; begin stream:=luaclass_getClassObject(L); - stream.WriteByte(lua_tointeger(L,1)); + try + stream.WriteByte(lua_tointeger(L,1)); + + finally + end; result:=0; end; @@ -148,7 +157,12 @@ var stream: Tstream; begin stream:=luaclass_getClassObject(L); - lua_pushinteger(L,stream.ReadWord); + try + lua_pushinteger(L,stream.ReadWord); + except + lua_pushstring(L,'stream error'); + lua_error(L); + end; result:=1; end; @@ -166,7 +180,12 @@ var stream: Tstream; begin stream:=luaclass_getClassObject(L); - lua_pushinteger(L,stream.ReadDword); + try + lua_pushinteger(L,stream.ReadDword); + except + lua_pushstring(L,'stream error'); + lua_error(L); + end; result:=1; end; @@ -184,7 +203,12 @@ var stream: Tstream; begin stream:=luaclass_getClassObject(L); - lua_pushinteger(L,stream.ReadQword); + try + lua_pushinteger(L,stream.ReadQword); + except + lua_pushstring(L,'stream error'); + lua_error(L); + end; result:=1; end; @@ -203,7 +227,13 @@ var f: single; begin stream:=luaclass_getClassObject(L); - stream.Read(f,sizeof(f)); + try + stream.Read(f,sizeof(f)); + except + lua_pushstring(L,'stream error'); + lua_error(L); + end; + lua_pushnumber(L,f); result:=1; end; @@ -225,7 +255,13 @@ var d: double; begin stream:=luaclass_getClassObject(L); - stream.Read(d,sizeof(d)); + try + stream.Read(d,sizeof(d)); + except + lua_pushstring(L,'stream error'); + lua_error(L); + end; + lua_pushnumber(L,d); result:=1; end; diff --git a/Cheat Engine/bin/autorun/java.lua b/Cheat Engine/bin/autorun/java.lua index f9ef67bf..e083ff5f 100755 --- a/Cheat Engine/bin/autorun/java.lua +++ b/Cheat Engine/bin/autorun/java.lua @@ -56,6 +56,8 @@ JAVACMD_SETFIELDVALUES=42 JAVACMD_GETOBJECTCLASSNAMES=43 +JAVACMD_GETFIELDSIGNATUREBYOBJECT=44 + JAVACMD_TERMINATESERVER=255 @@ -1732,11 +1734,46 @@ function java_getFieldDeclaringClass(klass, fieldid) return result end -function java_getFieldSignature(fieldid) +function java_getFieldSignatureByObject(object, fieldid) +--slightly faster as 2 pipecalls can be skipped if you don't have the class (get class, release class) + local result={} + + local ms=createMemoryStream() + ms.writeByte(JAVACMD_GETFIELDSIGNATUREBYOBJECT) + ms.writeQword(object) + ms.writeQword(fieldid) + ms.Position=0 + + javapipe.lock() + javapipe.writeFromStream(ms) + ms.clear() + local sz=javapipe.readDword() + javapipe.readIntoStream(ms, sz) + javapipe.unlock() + + ms.position=0 + + + local length + length=ms.readWord() + result.name=ms.readString(length) + + length=ms.readWord() + result.signature=ms.readString(length) + + length=ms.readWord() + result.generic=ms.readString(length) + + ms.destroy() + return result +end + +function java_getFieldSignature(class, fieldid) local result={} local ms=createMemoryStream() ms.writeByte(JAVACMD_GETFIELDSIGNATURE) + ms.writeQword(class) ms.writeQword(fieldid) ms.Position=0 @@ -1898,11 +1935,7 @@ end function java_getField(jObject, fieldid, signature) if signature==nil then - --I need to figure it out myself I guess... - local klass=java_getObjectClass(jObject) - signature=java_getFieldSignature(fieldid).signature - - java_dereferenceLocalObject(klass) + signature=java_getFieldSignatureByObject(jObject, fieldid).signature end --parse the signature @@ -1938,10 +1971,7 @@ end function java_setField(jObject, fieldid, signature, value) if signature==nil then --I need to figure it out myself I guess... - local klass=java_getObjectClass(jObject) - signature=java_getFieldSignature(fieldid).signature - - java_dereferenceLocalObject(klass) + signature=java_getFieldSignatureByObject(jObject, fieldid).signature end local vartype=Java_TypeSigToIDConversion[string.sub(signature,1,1)] @@ -2585,16 +2615,12 @@ function varscan_showResults(count) local classname=java_getObjectClassName(object) local fieldname='fieldindex '..java.varscan.currentresults[i].fieldindex - if fieldid then - fieldname=string.format("%x (%s)", fieldid, fieldname) - --[[ - local fieldsig=java_getFieldSignature(object, fieldid) + if fieldid then + local fieldsig=java_getFieldSignatureByObject(object, fieldid) if fieldsig.name then fieldname=fieldsig.name.. ' ('..fieldname..')' end - --]] end - java.varscan.Results.Items.Add('Obj('..classname..'::'..fieldname..')') end @@ -2693,12 +2719,22 @@ function miJavaVariableScanClick(sender) varscan.ValueText=createLabel(varscan.controls) varscan.ValueText.Caption=translate("Value") + + varscan.ScanType=createComboBox(varscan.controls) + varscan.ScanType.Items.add('Exact Value') + varscan.ScanType.Items.add('Increased Value') + varscan.ScanType.Items.add('Decreased Value') + varscan.ScanType.Items.add('Changed Value') + varscan.ScanType.Items.add('Unchanged Value') + -- varscan.ScanType.visible=false varscan.FirstScan=createButton(varscan.controls) varscan.FirstScan.Caption=translate("First Scan") + varscan.FirstScan.AutoSize=true varscan.NextScan=createButton(varscan.controls) varscan.NextScan.Caption=translate("Next Scan") + varscan.NextScan.AutoSize=true local width=6*dpim+math.max(varscan.form.Canvas.getTextWidth(varscan.FirstScan.Caption), varscan.form.Canvas.getTextWidth(varscan.NextScan.Caption)) --guess which one will be bigger... (just in case someone translates this) @@ -2719,7 +2755,14 @@ function miJavaVariableScanClick(sender) varscan.ValueText.AnchorSideBottom.Control=varscan.ValueBox varscan.ValueText.AnchorSideBottom.Side=asrTop varscan.ValueText.Anchors="[akLeft, akBottom]" - + + varscan.ScanType.AnchorSideLeft.Control=varscan.ValueBox + varscan.ScanType.AnchorSideLeft.Side=asrLeft + varscan.ScanType.AnchorSideRight.Control=varscan.ValueBox + varscan.ScanType.AnchorSideRight.Side=asrRight + varscan.ScanType.AnchorSideTop.Control=varscan.ValueBox + varscan.ScanType.AnchorSideTop.Side=asrBottom + varscan.ScanType.Anchors="[akTop, akLeft, akRight]" varscan.FirstScan.AnchorSideLeft.Control=varscan.ValueBox varscan.FirstScan.AnchorSideLeft.Side=asrLeft diff --git a/Cheat Engine/bin/autorun/java/cejvmtiagent.c b/Cheat Engine/bin/autorun/java/cejvmtiagent.c index 5da0b8ff..75bbb3a5 100644 --- a/Cheat Engine/bin/autorun/java/cejvmtiagent.c +++ b/Cheat Engine/bin/autorun/java/cejvmtiagent.c @@ -94,6 +94,7 @@ int _ZN3art9ArtMethod18HasAnyCompiledCodeEv(void* ArtMethod); #define JAVAVMD_GETOBJECTCLASSNAME 41 #define JAVACMD_SETFIELDVALUES 42 #define JAVACMD_GETOBJECTCLASSNAMES 43 +#define JAVACMD_GETFIELDSIGNATUREBYOBJECT 44 @@ -263,15 +264,64 @@ void js_getscanresults(PCEJVMTIAgent agent) void js_getFieldSignature(PCEJVMTIAgent agent) { - debug_log("js_getFieldSignature"); - /* - jfieldID fieldid=(jfieldID)ps_readQword(agent->pipe); + jclass c=(jclass)ps_readQword(agent->pipe); + jfieldID fid=(jfieldID)ps_readQword(agent->pipe); -GetFieldDeclaringClass(jvmtiEnv* env, - jclass klass, - jfieldID field, - jclass* declaring_class_ptr) - + PMemoryStream ms=ms_create(512); + + jint error; + char *name=NULL, *sig=NULL, *gen=NULL; + int len; + + if (_jvmti->GetFieldName(agent->jvmti, c, fid, &name, &sig, &gen)==JVMTI_ERROR_NONE) + { + if (name) + { + len=(int)strlen(name); + ms_writeWord(ms, len); + ms_write(ms, name, len); + _jvmti->Deallocate(agent->jvmti, (unsigned char *)name); + } + else + ms_writeWord(ms, 0); + + if (sig) + { + len=(int)strlen(sig); + ms_writeWord(ms, len); + ms_write(ms, sig, len); + _jvmti->Deallocate(agent->jvmti, (unsigned char *)sig); + } + else + ms_writeWord(ms, 0); + + if (gen) + { + len=(int)strlen(gen); + ms_writeWord(ms, len); + ms_write(ms, gen, len); + _jvmti->Deallocate(agent->jvmti,(unsigned char *)gen); + } + else + ms_writeWord(ms, 0); + + } + else + { + ms_writeWord(ms, 0); + ms_writeWord(ms, 0); + ms_writeWord(ms, 0); + } + + ps_writeMemStream(agent->pipe, ms); + ms_destroy(ms); +} + +void js_getFieldSignatureByObject(PCEJVMTIAgent agent) +{ + debug_log("js_getFieldSignatureByObject"); + jobject object=(jobject)ps_readQword(agent->pipe); + jfieldID fieldid=(jfieldID)ps_readQword(agent->pipe); debug_log("js_getFieldSignatureByObject"); @@ -292,7 +342,6 @@ GetFieldDeclaringClass(jvmtiEnv* env, len=(int)strlen(name); ms_writeWord(ms, len); ms_write(ms, name, len); - //debug_log("fieldname: %s", name); _jvmti->Deallocate(agent->jvmti, (unsigned char *)name); } else @@ -321,6 +370,7 @@ GetFieldDeclaringClass(jvmtiEnv* env, } else { + debug_log("js_getFieldSignatureByObject: GetFieldName failed"); ms_writeWord(ms, 0); ms_writeWord(ms, 0); ms_writeWord(ms, 0); @@ -328,9 +378,16 @@ GetFieldDeclaringClass(jvmtiEnv* env, _env->DeleteLocalRef(agent->env, klass); } + else + { + debug_log("js_getFieldSignatureByObject: invalid object"); + ms_writeWord(ms, 0); + ms_writeWord(ms, 0); + ms_writeWord(ms, 0); + } ps_writeMemStream(agent->pipe, ms); - ms_destroy(ms); */ + ms_destroy(ms); } @@ -2219,6 +2276,10 @@ void launchCEJVMTIServer(JNIEnv *env, jvmtiEnv *jvmti, void* soa) js_getFieldSignature(agent); break; + case JAVACMD_GETFIELDSIGNATUREBYOBJECT: + js_getFieldSignatureByObject(agent); + break; + default: debug_log("Invalid command. Terminating server"); terminated=1;