public Int32 GenerateCallInt(ParameterInfo parameterInfo) { var attr = parameterInfo.GetCustomAttributes(typeof(ASMRef), false); // var method = attr[0] as ASMMethodAttribute; if (attr.Length > 0)//Ref) { Ref = true; var ptr = GCHandleBypass.Alloc(Value, GCHandleType.Pinned).AddrOfPinnedObject().ToInt32(); RefResultPtr = ptr; return(ptr); } else { if (_isIntOrSmaller()) { return((int)(object)Value); } else { WentRefForced = true; //force ref due 32 bit OS (R0, R1, R2, etc = 32 bit int) var ptr = GCHandleBypass.Alloc(Value, GCHandleType.Pinned).AddrOfPinnedObject().ToInt32(); RefResultPtr = ptr; return(ptr); } } }
IEnumerable <byte> DCD_bytes(params object[] objects) { //int asd = 10; // var od = GCHandleBypass.Alloc(asd, GCHandleType.Pinned); // var ad = od.AddrOfPinnedObject(); // var lk = asd; var addresses = objects.Reverse().Select(obj => BitConverter.GetBytes(GCHandleBypass.Alloc(obj, GCHandleType.Pinned).AddrOfPinnedObject().ToInt32())).ToArray(); foreach (var bArray in addresses) { foreach (var b in bArray) { yield return(b); } } }
public void TestCall(int funcAddress, object[] obj) { var addr = funcAddress; var objAddr = obj.Select(o => GCHandleBypass.Alloc(o, GCHandleType.Pinned).AddrOfPinnedObject().ToInt32()).ToArray(); //var msgIntPtr = GCHandleBypass.Alloc(msgInt, GCHandleType.Pinned).AddrOfPinnedObject().ToInt32(); //var args = DCD_bytes(addr, msgIntPtr).ToArray(); // asm.AddRange(new byte[] // { //0x04, 0xE0, 0x2D, 0xE5, //0x08, 0x30, 0x9F, 0xE5, //0x0F, 0xE0, 0xA0, 0xE1, //0x03, 0xF0, 0xA0, 0xE1, //0x04, 0xF0, 0x9D, 0xE4, ///*0x48, 0x95, 0x46, 0x15 [insert 32 bit func ptr] > */ //0x00, 0x00, 0x9F, 0xE5, //0x0E, 0xF0, 0xA0, 0xE1 /*(return)*/ // }); asm.AddRange(new byte[] { 0x04, 0xE0, 0x2D, 0xE5, //[SKIP]skip for edit //str lr, [sp, #-4]! //0x08, 0x30, 0x9F, 0xE5, //ldr r3 = #8 }); List <byte> asm2 = new List <byte>(); //for (int i = objAddr.Length * 0x10 - 0x10, reg = objAddr.Length; i > -1; i -= 0x10, reg -=0x10) //{ // asm.AddRange(LDR((byte)i, (byte)(reg))); //} var asa = Enumerable.Range(0, objAddr.Length).Select(o => { var ia = (int)(0xE59F0010 + (0x8 * o) + (o * 0x1000)); return(BitConverter.GetBytes(ia)); }).Reverse().ToArray(); foreach (var item in asa) { asm.AddRange(item); } var asm2R = asm2.ToArray(); //asm.AddRange(LDR(0x10, 0)); asm.AddRange(LDR(0x8, /*(byte)(objAddr.Length * 0x10 + 0x10)*/ 0x30)); asm.AddRange(new byte[] { 0x0F, 0xE0, 0xA0, 0xE1, //[SKIP]mov lr, pc 0x03, 0xF0, 0xA0, 0xE1, //[SKIP]mov pc, r3 0x04, 0xF0, 0x9D, 0xE4 //[SKIP]ldr pc, [sp], #4 }); //var bits = BitConverter.GetBytes(addr); asm.AddRange(BitConverter.GetBytes(addr)); //place DCD args foreach (var item in objAddr) { asm.AddRange(BitConverter.GetBytes(item)); //place DCD args } //asm.AddRange(BitConverter.GetBytes(msgIntPtr)); //place DCD args asm.AddRange(new byte[] { 0x00, 0x00, 0x9F, 0xE5, //[SKIP]ldr r0, [pc] 0x0E, 0xF0, 0xA0, 0xE1 /*(return)*/ }); }