Beispiel #1
0
 internal void applyZeroes()
 {
     flags          = 0;
     iflags         = 0;
     token          = 0;
     klass          = (MonoClass *)0;
     signature      = (MonoMethodSignature *)0;
     name           = (byte *)0;
     method_pointer = IntPtr.Zero;
     invoke_pointer = IntPtr.Zero;
     bitfield       = 0;
     slot           = 0;
 }
Beispiel #2
0
        private static unsafe MonoMethod *IcallToFakeMonoMethod(string icallName)
        {
            string[] typeAndMethod    = icallName.Split(new[] { "::" }, StringSplitOptions.None);
            int      parenthesisIndex = typeAndMethod[1].IndexOf('(');

            if (parenthesisIndex >= 0)
            {
                typeAndMethod[1] = typeAndMethod[1].Substring(0, parenthesisIndex);
            }
            // We add a padding to the end of each allocated memory since our structs are supposed to be bigger than the one we have here
            MonoMethod *monoMethod = (MonoMethod *)Marshal.AllocHGlobal(sizeof(MonoMethod) + 0x100);

            monoMethod->applyZeroes();
            monoMethod->klass = (MonoClass *)Marshal.AllocHGlobal(sizeof(MonoClass) + 0x100);
            monoMethod->klass->applyZeroes();
            monoMethod->name = (byte *)Marshal.StringToHGlobalAnsi(typeAndMethod[1]);
            int lastDotIndex = typeAndMethod[0].LastIndexOf('.');

            if (lastDotIndex < 0)
            {
                *(IntPtr *)((long)&monoMethod->klass->nested_in_0x08 + monoClassOffset) = Marshal.StringToHGlobalAnsi("");
                *(IntPtr *)((long)&monoMethod->klass->nested_in_0x04 + monoClassOffset) = Marshal.StringToHGlobalAnsi(typeAndMethod[0]);
            }
            else
            {
                string name_space = typeAndMethod[0].Substring(0, lastDotIndex);
                string name       = typeAndMethod[0].Substring(lastDotIndex + 1);
                *(IntPtr *)((long)&monoMethod->klass->nested_in_0x08 + monoClassOffset) = Marshal.StringToHGlobalAnsi(name_space);
                *(IntPtr *)((long)&monoMethod->klass->nested_in_0x04 + monoClassOffset) = Marshal.StringToHGlobalAnsi(name);
            }

            MonoMethodSignature *monoMethodSignature = (MonoMethodSignature *)Marshal.AllocHGlobal(sizeof(MonoMethodSignature));

            monoMethodSignature->ApplyZeroes();
            monoMethod->signature = monoMethodSignature;

            return(monoMethod);
        }
Beispiel #3
0
        static unsafe IntPtr GetMethodSignature(MonoObject *methodobj)
        {
            var method         = (MethodBase)GetMonoObjectTarget(methodobj);
            var parameters     = method.GetParameters();
            var parameterCount = parameters.Length;
            var rv             = Marshal.AllocHGlobal(sizeof(MonoMethodSignature) + sizeof(MonoObjectPtr) * parameterCount);

            MonoMethodSignature *signature = (MonoMethodSignature *)rv;

            signature->Method = methodobj;
            xamarin_mono_object_retain(methodobj);
            signature->ParameterCount = parameterCount;
            signature->ReturnType     = (MonoObject *)GetMonoObject(GetMethodReturnType(method));

            MonoObject **mparams = &signature->Parameters;

            for (var i = 0; i < parameterCount; i++)
            {
                var p = parameters [i];
                mparams [i] = (MonoObject *)GetMonoObject(p.ParameterType);
            }

            return(rv);
        }