Пример #1
0
        public static void Call()
        {
            IntPtr classAddress = NativeReflection.GetClass("/Script/UnrealEngine_Runtime.MyClass");

            StringTest_FunctionAddress    = NativeReflection.GetFunction(classAddress, "MyTestFunc2");
            StringTest_ParamsSize         = NativeReflection.GetFunctionParamsSize(StringTest_FunctionAddress);
            StringTest_inVal_Offset       = NativeReflection.GetPropertyOffset(StringTest_FunctionAddress, "inVal");
            StringTest_stringTest_Offset  = NativeReflection.GetPropertyOffset(StringTest_FunctionAddress, "stringTest");
            StringTest_ParamResult_Offset = NativeReflection.GetPropertyOffset(StringTest_FunctionAddress, "__return");

            UMyClass myClass = UObject.NewObject <UMyClass>();
            string   refVal  = "inref";
            string   arg     = "hello world";

            unsafe
            {
                byte * ParamsBufferAllocation = stackalloc byte[StringTest_ParamsSize];
                IntPtr ParamsBuffer           = new IntPtr(ParamsBufferAllocation);
                FStringMarshaler.ToNative(IntPtr.Add(ParamsBuffer, StringTest_inVal_Offset), refVal);
                //FStringMarshaler.ToNative(IntPtr.Add(ParamsBuffer, StringTest_stringTest_Offset), arg);

                NativeReflection.InvokeFunction(myClass.Address, StringTest_FunctionAddress, ParamsBuffer, StringTest_ParamsSize);

                refVal = FStringMarshaler.FromNative(IntPtr.Add(ParamsBuffer, StringTest_inVal_Offset));
                arg    = FStringMarshaler.FromNative(IntPtr.Add(ParamsBuffer, StringTest_stringTest_Offset));
                string toReturn = FStringMarshaler.FromNative(IntPtr.Add(ParamsBuffer, StringTest_ParamResult_Offset));
                NativeReflection.InvokeFunction_DestroyAll(StringTest_FunctionAddress, ParamsBuffer);
            }
        }
Пример #2
0
 static void LoadNativeType()
 {
     //if (NativeReflection.CachedTypeInfo.Enabled)
     //{
     //    NativeReflection.CachedTypeInfo typeInfo = NativeReflection.CachedTypeInfo.BuildClass("/Script/MaterialShaderQualitySettings.ShaderPlatformQualitySettings");
     //    QualityOverrides_IsValid = typeInfo.GetPropertyRefOffsetAndValidate("QualityOverrides", ref QualityOverrides_PropertyAddress, out QualityOverrides_Offset, Classes.UStructProperty);
     //}
     //else
     {
         IntPtr classAddress = NativeReflection.GetClass("/Script/MaterialShaderQualitySettings.ShaderPlatformQualitySettings");
         NativeReflectionCached.GetPropertyRef(ref QualityOverrides_PropertyAddress, classAddress, "QualityOverrides");
         QualityOverrides_Offset  = NativeReflectionCached.GetPropertyOffset(classAddress, "QualityOverrides");
         QualityOverrides_IsValid = NativeReflectionCached.ValidatePropertyClass(classAddress, "QualityOverrides", Classes.UStructProperty);
     }
 }
Пример #3
0
        public static unsafe void Load()
        {
            vtableRedirects = new List <FunctionRedirect>();
            AddVTableRedirects();

            // We have three classes UDummyObject3 : UDummyObject2 : UDummyObject1 : UObject
            //
            // UDummyObject1 overrides function "X"
            // UDummyObject2 doesn't function "X"
            // UDummyObject3 overrides function "X"
            //
            // Scan the vtable for each dummy object, search for an entry where vtable entry 1==2 && 1!=3
            // - We can assume this entry is our desired vtable index
            // - This may break down in situations where there is multiple inheritance
            // - If this fails to complete properly this will result in a crash (or worse)

            foreach (FunctionRedirect redirect in vtableRedirects)
            {
                IntPtr dummyClass1 = NativeReflection.GetClass("/Script/USharp." + redirect.DummyName + "1");
                IntPtr dummyClass2 = NativeReflection.GetClass("/Script/USharp." + redirect.DummyName + "2");
                IntPtr dummyClass3 = NativeReflection.GetClass("/Script/USharp." + redirect.DummyName + "3");

                IntPtr dummyObject1 = Native_UClass.GetDefaultObject(dummyClass1, true);
                IntPtr dummyObject2 = Native_UClass.GetDefaultObject(dummyClass2, true);
                IntPtr dummyObject3 = Native_UClass.GetDefaultObject(dummyClass3, true);

                IntPtr *dummyVTable1 = *(IntPtr **)dummyObject1;
                IntPtr *dummyVTable2 = *(IntPtr **)dummyObject2;
                IntPtr *dummyVTable3 = *(IntPtr **)dummyObject3;

                for (int i = 0; i < int.MaxValue; i++)
                {
                    IntPtr dummyFunc1 = dummyVTable1[i];
                    IntPtr dummyFunc2 = dummyVTable2[i];
                    IntPtr dummyFunc3 = dummyVTable3[i];

                    if (dummyFunc1 == dummyFunc2 && dummyFunc1 != dummyFunc3)
                    {
                        redirect.NativeCallback = dummyFunc1;
                        redirect.VTableIndex    = i;
                        break;
                    }
                }
            }
        }
Пример #4
0
        public static void Call2()
        {
            IntPtr classAddress = NativeReflection.GetClass("/Script/UnrealEngine_Runtime.MyClass");

            Test2_FunctionAddress = NativeReflection.GetFunction(classAddress, "MyTestFunc3");
            Test2_ParamsSize      = NativeReflection.GetFunctionParamsSize(Test2_FunctionAddress);
            Test2_Param1_Offset   = NativeReflection.GetPropertyOffset(Test2_FunctionAddress, "myStruct");

            UMyClass            myClass = UObject.NewObject <UMyClass>();
            FMyStructCustomCtor val     = StructDefault <FMyStructCustomCtor> .Value;

            unsafe
            {
                byte * ParamsBufferAllocation = stackalloc byte[Test2_ParamsSize];
                IntPtr ParamsBuffer           = new IntPtr(ParamsBufferAllocation);
                FMyStructCustomCtor.ToNative(IntPtr.Add(ParamsBuffer, Test2_Param1_Offset), val);

                NativeReflection.InvokeFunction(myClass.Address, Test2_FunctionAddress, ParamsBuffer, Test2_ParamsSize);

                NativeReflection.InvokeFunction_DestroyAll(Test2_FunctionAddress, ParamsBuffer);
            }
        }
Пример #5
0
 static void LoadNativeType()
 {
     //if (NativeReflection.CachedTypeInfo.Enabled)
     //{
     //    NativeReflection.CachedTypeInfo typeInfo = NativeReflection.CachedTypeInfo.BuildClass("/Script/USharp.BPTest1");
     //    MyMap_IsValid = typeInfo.GetPropertyRefOffsetAndValidate("MyMap", ref MyMap_PropertyAddress, out MyMap_Offset, Classes.UMapProperty);
     //    MySet_IsValid = typeInfo.GetPropertyRefOffsetAndValidate("MySet", ref MySet_PropertyAddress, out MySet_Offset, Classes.USetProperty);
     //    NativeReflection.CachedTypeInfo CallMe6_FunctionInfo = typeInfo.GetFunction("CallMe6");
     //    CallMe6_FunctionAddress = CallMe6_FunctionInfo.Address;
     //    CallMe6_ParamsSize = CallMe6_FunctionInfo.Size;
     //    CallMe6_test_IsValid = CallMe6_FunctionInfo.GetPropertyOffsetAndValidate("test", out CallMe6_test_Offset, Classes.UStructProperty);
     //    CallMe6_test2_IsValid = CallMe6_FunctionInfo.GetPropertyOffsetAndValidate("test2", out CallMe6_test2_Offset, Classes.UStructProperty);
     //    CallMe6_IsValid = CallMe6_FunctionInfo.Exists && CallMe6_test_IsValid && CallMe6_test2_IsValid;
     //    CallMe6_FunctionInfo.LogIsValid(CallMe6_IsValid);
     //    NativeReflection.CachedTypeInfo CallMe5_FunctionInfo = typeInfo.GetFunction("CallMe5");
     //    CallMe5_FunctionAddress = CallMe5_FunctionInfo.Address;
     //    CallMe5_ParamsSize = CallMe5_FunctionInfo.Size;
     //    CallMe5_a1_IsValid = CallMe5_FunctionInfo.GetPropertyRefOffsetAndValidate("a1", ref CallMe5_a1_PropertyAddress, out CallMe5_a1_Offset, Classes.UArrayProperty);
     //    CallMe5_a2_IsValid = CallMe5_FunctionInfo.GetPropertyRefOffsetAndValidate("a2", ref CallMe5_a2_PropertyAddress, out CallMe5_a2_Offset, Classes.UArrayProperty);
     //    CallMe5_IsValid = CallMe5_FunctionInfo.Exists && CallMe5_a1_IsValid && CallMe5_a2_IsValid;
     //    CallMe5_FunctionInfo.LogIsValid(CallMe5_IsValid);
     //    NativeReflection.CachedTypeInfo CallMe4_FunctionInfo = typeInfo.GetFunction("CallMe4");
     //    CallMe4_FunctionAddress = CallMe4_FunctionInfo.Address;
     //    CallMe4_ParamsSize = CallMe4_FunctionInfo.Size;
     //    CallMe4_ReturnValue_IsValid = CallMe4_FunctionInfo.GetPropertyRefOffsetAndValidate("ReturnValue", ref CallMe4_ReturnValue_PropertyAddress, out CallMe4_ReturnValue_Offset, Classes.UArrayProperty);
     //    CallMe4_IsValid = CallMe4_FunctionInfo.Exists && CallMe4_ReturnValue_IsValid;
     //    CallMe4_FunctionInfo.LogIsValid(CallMe4_IsValid);
     //    NativeReflection.CachedTypeInfo CallMe3_FunctionInfo = typeInfo.GetFunction("CallMe3");
     //    CallMe3_FunctionAddress = CallMe3_FunctionInfo.Address;
     //    CallMe3_ParamsSize = CallMe3_FunctionInfo.Size;
     //    CallMe3_ReturnValue_IsValid = CallMe3_FunctionInfo.GetPropertyRefOffsetAndValidate("ReturnValue", ref CallMe3_ReturnValue_PropertyAddress, out CallMe3_ReturnValue_Offset, Classes.UArrayProperty);
     //    CallMe3_IsValid = CallMe3_FunctionInfo.Exists && CallMe3_ReturnValue_IsValid;
     //    CallMe3_FunctionInfo.LogIsValid(CallMe3_IsValid);
     //    NativeReflection.CachedTypeInfo CallMe2_FunctionInfo = typeInfo.GetFunction("CallMe2");
     //    CallMe2_FunctionAddress = CallMe2_FunctionInfo.Address;
     //    CallMe2_ParamsSize = CallMe2_FunctionInfo.Size;
     //    CallMe2_IsValid = CallMe2_FunctionInfo.Exists;
     //    CallMe2_FunctionInfo.LogIsValid(CallMe2_IsValid);
     //    NativeReflection.CachedTypeInfo CallMe_FunctionInfo = typeInfo.GetFunction("CallMe");
     //    CallMe_FunctionAddress = CallMe_FunctionInfo.Address;
     //    CallMe_ParamsSize = CallMe_FunctionInfo.Size;
     //    CallMe_IsValid = CallMe_FunctionInfo.Exists;
     //    CallMe_FunctionInfo.LogIsValid(CallMe_IsValid);
     //}
     //else
     {
         IntPtr classAddress = NativeReflection.GetClass("/Script/USharp.BPTest1");
         NativeReflectionCached.GetPropertyRef(ref MyMap_PropertyAddress, classAddress, "MyMap");
         MyMap_Offset  = NativeReflectionCached.GetPropertyOffset(classAddress, "MyMap");
         MyMap_IsValid = NativeReflectionCached.ValidatePropertyClass(classAddress, "MyMap", Classes.UMapProperty);
         NativeReflectionCached.GetPropertyRef(ref MySet_PropertyAddress, classAddress, "MySet");
         MySet_Offset            = NativeReflectionCached.GetPropertyOffset(classAddress, "MySet");
         MySet_IsValid           = NativeReflectionCached.ValidatePropertyClass(classAddress, "MySet", Classes.USetProperty);
         CallMe6_FunctionAddress = NativeReflectionCached.GetFunction(classAddress, "CallMe6");
         CallMe6_ParamsSize      = NativeReflection.GetFunctionParamsSize(CallMe6_FunctionAddress);
         CallMe6_test_Offset     = NativeReflectionCached.GetPropertyOffset(CallMe6_FunctionAddress, "test");
         CallMe6_test_IsValid    = NativeReflectionCached.ValidatePropertyClass(CallMe6_FunctionAddress, "test", Classes.UStructProperty);
         CallMe6_test2_Offset    = NativeReflectionCached.GetPropertyOffset(CallMe6_FunctionAddress, "test2");
         CallMe6_test2_IsValid   = NativeReflectionCached.ValidatePropertyClass(CallMe6_FunctionAddress, "test2", Classes.UStructProperty);
         CallMe6_IsValid         = CallMe6_FunctionAddress != IntPtr.Zero && CallMe6_test_IsValid && CallMe6_test2_IsValid;
         NativeReflection.LogFunctionIsValid("/Script/USharp.BPTest1:CallMe6", CallMe6_IsValid);
         CallMe5_FunctionAddress = NativeReflectionCached.GetFunction(classAddress, "CallMe5");
         CallMe5_ParamsSize      = NativeReflection.GetFunctionParamsSize(CallMe5_FunctionAddress);
         NativeReflectionCached.GetPropertyRef(ref CallMe5_a1_PropertyAddress, CallMe5_FunctionAddress, "a1");
         CallMe5_a1_Offset  = NativeReflectionCached.GetPropertyOffset(CallMe5_FunctionAddress, "a1");
         CallMe5_a1_IsValid = NativeReflectionCached.ValidatePropertyClass(CallMe5_FunctionAddress, "a1", Classes.UArrayProperty);
         NativeReflectionCached.GetPropertyRef(ref CallMe5_a2_PropertyAddress, CallMe5_FunctionAddress, "a2");
         CallMe5_a2_Offset  = NativeReflectionCached.GetPropertyOffset(CallMe5_FunctionAddress, "a2");
         CallMe5_a2_IsValid = NativeReflectionCached.ValidatePropertyClass(CallMe5_FunctionAddress, "a2", Classes.UArrayProperty);
         CallMe5_IsValid    = CallMe5_FunctionAddress != IntPtr.Zero && CallMe5_a1_IsValid && CallMe5_a2_IsValid;
         NativeReflection.LogFunctionIsValid("/Script/USharp.BPTest1:CallMe5", CallMe5_IsValid);
         CallMe4_FunctionAddress = NativeReflectionCached.GetFunction(classAddress, "CallMe4");
         CallMe4_ParamsSize      = NativeReflection.GetFunctionParamsSize(CallMe4_FunctionAddress);
         NativeReflectionCached.GetPropertyRef(ref CallMe4_ReturnValue_PropertyAddress, CallMe4_FunctionAddress, "ReturnValue");
         CallMe4_ReturnValue_Offset  = NativeReflectionCached.GetPropertyOffset(CallMe4_FunctionAddress, "ReturnValue");
         CallMe4_ReturnValue_IsValid = NativeReflectionCached.ValidatePropertyClass(CallMe4_FunctionAddress, "ReturnValue", Classes.UArrayProperty);
         CallMe4_IsValid             = CallMe4_FunctionAddress != IntPtr.Zero && CallMe4_ReturnValue_IsValid;
         NativeReflection.LogFunctionIsValid("/Script/USharp.BPTest1:CallMe4", CallMe4_IsValid);
         CallMe3_FunctionAddress = NativeReflectionCached.GetFunction(classAddress, "CallMe3");
         CallMe3_ParamsSize      = NativeReflection.GetFunctionParamsSize(CallMe3_FunctionAddress);
         NativeReflectionCached.GetPropertyRef(ref CallMe3_ReturnValue_PropertyAddress, CallMe3_FunctionAddress, "ReturnValue");
         CallMe3_ReturnValue_Offset  = NativeReflectionCached.GetPropertyOffset(CallMe3_FunctionAddress, "ReturnValue");
         CallMe3_ReturnValue_IsValid = NativeReflectionCached.ValidatePropertyClass(CallMe3_FunctionAddress, "ReturnValue", Classes.UArrayProperty);
         CallMe3_IsValid             = CallMe3_FunctionAddress != IntPtr.Zero && CallMe3_ReturnValue_IsValid;
         NativeReflection.LogFunctionIsValid("/Script/USharp.BPTest1:CallMe3", CallMe3_IsValid);
         CallMe2_FunctionAddress = NativeReflectionCached.GetFunction(classAddress, "CallMe2");
         CallMe2_ParamsSize      = NativeReflection.GetFunctionParamsSize(CallMe2_FunctionAddress);
         CallMe2_IsValid         = CallMe2_FunctionAddress != IntPtr.Zero;
         NativeReflection.LogFunctionIsValid("/Script/USharp.BPTest1:CallMe2", CallMe2_IsValid);
         CallMe_FunctionAddress = NativeReflectionCached.GetFunction(classAddress, "CallMe");
         CallMe_ParamsSize      = NativeReflection.GetFunctionParamsSize(CallMe_FunctionAddress);
         CallMe_IsValid         = CallMe_FunctionAddress != IntPtr.Zero;
         NativeReflection.LogFunctionIsValid("/Script/USharp.BPTest1:CallMe", CallMe_IsValid);
     }
 }