test and fix the invoke method function

This commit is contained in:
cheatengine@gmail.com 2014-03-26 23:46:33 +00:00
parent 2d224448fc
commit 36b254c4f6
2 changed files with 39 additions and 14 deletions

View File

@ -841,38 +841,45 @@ void CJavaServer::InvokeMethod(void)
switch (returnType)
{
case 0:
{
jni->CallVoidMethodA(obj, methodid, args);
WriteQword(0); //tell it it's done
break;
}
case 1:
{
jboolean r=jni->CallBooleanMethodA(obj, methodid, args);
WriteByte(r);
WriteQword(r);
break;
}
case 2:
{
jbyte r=jni->CallByteMethodA(obj, methodid, args);
WriteByte(r);
WriteQword(r);
break;
}
case 3:
{
jchar r=jni->CallCharMethodA(obj, methodid, args);
WriteWord(r);
WriteQword(r);
break;
}
case 4:
{
jshort r=jni->CallShortMethodA(obj, methodid, args);
WriteWord(r);
WriteQword(r);
break;
}
case 5:
{
jint r=jni->CallIntMethodA(obj, methodid, args);
WriteDword(r);
WriteQword(r);
break;
}
@ -886,14 +893,14 @@ void CJavaServer::InvokeMethod(void)
case 7:
{
jfloat r=jni->CallFloatMethodA(obj, methodid, args);
Write(&r, sizeof(r));
WriteQword(*(DWORD *)&r);
break;
}
case 8:
{
jdouble r=jni->CallDoubleMethodA(obj, methodid, args);
Write(&r, sizeof(r));
WriteQword(*(UINT64 *)&r);
break;
}
@ -928,7 +935,8 @@ jint JNICALL FindClassObjects_heap_reference_callback(jlong class_tag, jlong siz
if (class_tag==tagtofind)
*tag_ptr=tagtofind+1;
return JVMTI_VISIT_OBJECTS;;
return JVMTI_VISIT_OBJECTS;
}
void CJavaServer::FindClassObjects(void)

View File

@ -747,8 +747,9 @@ end
function java_parseSignature_type(sig, i)
local result=''
local char=string.sub(sig,i,i)
if (char=='Z') or (char=='B') or (char=='C') or (char=='S') or (char=='I') or (char=='J') or (char=='F') or (char=='D') then
if (char=='V') or (char=='Z') or (char=='B') or (char=='C') or (char=='S') or (char=='I') or (char=='J') or (char=='F') or (char=='D') then
result=char
elseif char=='L' then
local classtype
@ -767,7 +768,7 @@ function java_parseSignature_type(sig, i)
result='['..result
end
return result
return result,i
end
@ -775,7 +776,7 @@ end
function java_parseSignature_method(sig, i, result)
result.parameters={}
while i<#sig do
while i<=#sig do
local parem
local char=string.sub(sig,i,i)
@ -799,7 +800,7 @@ function java_parseSignature(sig)
--parse the given signature
local result={}
local i=1
while i<#sig do
while i<=#sig do
local char=string.sub(sig,i,i)
if char=='(' then
@ -818,6 +819,7 @@ end
Java_TypeSigToIDConversion={}
Java_TypeSigToIDConversion['V']=0 --void
Java_TypeSigToIDConversion['Z']=1 --boolean
Java_TypeSigToIDConversion['B']=2 --byte
Java_TypeSigToIDConversion['C']=3 --char
@ -890,7 +892,7 @@ function java_invokeMethod_sendParameter(typeid, a, skiptypeid)
end
function java_invokeMethod(returntype, object, methodid, ...)
function java_invokeMethod(object, methodid, ...)
local argumentcount=#arg
local name, sig, gen=java_getMethodName(methodid)
@ -923,7 +925,7 @@ function java_invokeMethod(returntype, object, methodid, ...)
javapipe.writeByte(argumentcount)
local i
for i=1, #argumentcount do
for i=1, argumentcount do
local typeid
typeid=Java_TypeSigToIDConversion[string.sub(parsedsignature.parameters[i],1,1)]
if typeid==10 then
@ -949,6 +951,21 @@ function java_invokeMethod(returntype, object, methodid, ...)
return result
end
function java_findMethod(class, name, sig)
local cm=java_getClassMethods(class)
local i
for i=1,#cm do
if cm[i].name==name then
if (sig==nil) or (sig==cm[i].signature) then
return cm[i].jmethodid
end
end
end
return nil --still here
end
function java_findClass(signature)
local result=nil
javapipe.lock()