예제 #1
0
        public static void HalSendSMCMessage(XboxConsole Console, byte[] Request, ref byte[] Response)
        {
            if (Request.Length != 16)
            {
                throw new Exception("XDKUtilities.HalSendSMCMessage: Invalid request specified. It must be 16 bytes in length.");
            }
            if (!Enum.IsDefined(typeof(SMCRequestTypes), Request[0]))
            {
                throw new Exception("XDKUtilities.HalSendSMCMessage: Invalid request specified. The first byte needs to be a valid request value.");
            }
            var request  = new XDRPCArrayArgumentInfo <byte[]>(Request);
            var response = Response == null ? (XDRPCArgumentInfo) new XDRPCNullArgumentInfo() : new XDRPCArrayArgumentInfo <byte[]>(Response, ArgumentType.ByRef);

            Console.ExecuteRPC <uint>(XDRPCMode.Title, "xboxkrnl.exe", 41, request, response);
            if (!(response is XDRPCNullArgumentInfo))
            {
                Response = ((XDRPCArrayArgumentInfo <byte[]>)response).Value;
            }
        }
예제 #2
0
        public static byte[] ExGetXConfigSetting(XboxConsole Console, XCONFIG_CATEGORY_TYPES Category, short Entry, short SettingSize)
        {
            var dwCategory = new XDRPCArgumentInfo <short>((short)Category);
            var dwEntry    = new XDRPCArgumentInfo <short>(Entry);
            var pBuffer    = new XDRPCArrayArgumentInfo <byte[]>(new byte[SettingSize], ArgumentType.ByRef);
            var cbBuffer   = new XDRPCArgumentInfo <short>(SettingSize);
            var szSetting  = new XDRPCArgumentInfo <short>(0, ArgumentType.Out);
            var returnVal  = Console.ExecuteRPC <uint>(XDRPCMode.Title, "xboxkrnl.exe", 16, dwCategory, dwEntry, pBuffer, cbBuffer, szSetting);

            if (returnVal != 0x00000000)
            {
                throw new COMException("Exception from HRESULT: " + string.Format("0x{0:X}", returnVal), (int)returnVal);
            }
            if (szSetting.Value != SettingSize)
            {
                throw new XDRPCInvalidResponseException("XDKUtilities.ExGetXConfigSetting: The returned buffer size does not match the expected buffer size.");
            }
            return(pBuffer.Value);
        }
예제 #3
0
        public static string XamGetCachedTitleName(XboxConsole Console, uint TitleID)
        {
            if (TitleID == 0)
            {
                return(string.Empty);
            }
            var dwTitleId = new XDRPCArgumentInfo <uint>(TitleID);
            var pwsz      = new XDRPCArrayArgumentInfo <byte[]>(new byte[56], ArgumentType.Out, 56);
            var pcch      = new XDRPCArgumentInfo <int>(56, ArgumentType.ByRef);
            var returnVal = Console.ExecuteRPC <uint>(XDRPCMode.Title, "xam.xex", 694, dwTitleId, pwsz, pcch);

            if (returnVal == 0x3E5)
            {
                return(string.Empty);
            }
            if (returnVal != 0x00000000)
            {
                throw new COMException("Exception from HRESULT: " + string.Format("0x{0:X}", returnVal), (int)returnVal);
            }
            return(Encoding.BigEndianUnicode.GetString(pwsz.Value).Replace("\0", string.Empty));
        }
예제 #4
0
 public static string XamGetCachedTitleName(XboxConsole Console, uint TitleID)
 {
     if (TitleID == 0) return string.Empty;
     var dwTitleId = new XDRPCArgumentInfo<uint>(TitleID);
     var pwsz = new XDRPCArrayArgumentInfo<byte[]>(new byte[56], ArgumentType.Out, 56);
     var pcch = new XDRPCArgumentInfo<int>(56, ArgumentType.ByRef);
     var returnVal = Console.ExecuteRPC<uint>(XDRPCMode.Title, "xam.xex", 694, dwTitleId, pwsz, pcch);
     if (returnVal == 0x3E5) return string.Empty;
     if (returnVal != 0x00000000) throw new COMException("Exception from HRESULT: " + string.Format("0x{0:X}", returnVal), (int)returnVal);
     return Encoding.BigEndianUnicode.GetString(pwsz.Value).Replace("\0", string.Empty);
 }
예제 #5
0
 public static void HalSendSMCMessage(XboxConsole Console, byte[] Request, ref byte[] Response)
 {
     if (Request.Length != 16) throw new Exception("XDKUtilities.HalSendSMCMessage: Invalid request specified. It must be 16 bytes in length.");
     if (!Enum.IsDefined(typeof(SMCRequestTypes), Request[0])) throw new Exception("XDKUtilities.HalSendSMCMessage: Invalid request specified. The first byte needs to be a valid request value.");
     var request = new XDRPCArrayArgumentInfo<byte[]>(Request);
     var response = Response == null ? (XDRPCArgumentInfo)new XDRPCNullArgumentInfo() : new XDRPCArrayArgumentInfo<byte[]>(Response, ArgumentType.ByRef);
     Console.ExecuteRPC<uint>(XDRPCMode.Title, "xboxkrnl.exe", 41, request, response);
     if (!(response is XDRPCNullArgumentInfo)) Response = ((XDRPCArrayArgumentInfo<byte[]>)response).Value;
 }
예제 #6
0
 public static uint Call(this XDevkit.IXboxConsole xbCon, uint address, params object[] arg)
 {
     if (((XDevkit.IXboxConsole) xbCon).SupportsRPC())
     {
         bool flag = false;
         if (xbCon != null)
         {
             XDRPCExecutionOptions options = new XDRPCExecutionOptions(XDRPCMode.Title, address);
             XDRPCArgumentInfo[] args = new XDRPCArgumentInfo[arg.Length];
             XDRPCArgumentInfo<float>[] infoArray2 = new XDRPCArgumentInfo<float>[arg.Length];
             for (int i = 0; i < arg.Length; i++)
             {
                 object obj2 = arg[i];
                 if (obj2 is string)
                 {
                     args[i] = new XDRPCStringArgumentInfo((string) obj2);
                 }
                 else if (obj2 is int)
                 {
                     args[i] = new XDRPCArgumentInfo<int>((int) obj2);
                 }
                 else if (obj2 is uint)
                 {
                     args[i] = new XDRPCArgumentInfo<uint>((uint) obj2);
                 }
                 else if (obj2 is float)
                 {
                     infoArray2[i] = new XDRPCArgumentInfo<float>((float) obj2);
                     flag = true;
                 }
                 else if (obj2 is long)
                 {
                     args[i] = new XDRPCArgumentInfo<long>((long) obj2);
                 }
                 else if (obj2 is byte[])
                 {
                     args[i] = new XDRPCArrayArgumentInfo<byte[]>((byte[]) obj2);
                 }
                 else if (obj2 is short)
                 {
                     args[i] = new XDRPCArgumentInfo<short>((short) obj2);
                 }
                 else if (obj2 is byte)
                 {
                     args[i] = new XDRPCArgumentInfo<byte>((byte) obj2);
                 }
                 else if (obj2 is char[])
                 {
                     args[i] = new XDRPCArrayArgumentInfo<char[]>((char[]) obj2);
                 }
                 else if (obj2 is char)
                 {
                     args[i] = new XDRPCArgumentInfo<char>((char) obj2);
                 }
                 else
                 {
                     Console.WriteLine("Invalid Arg");
                     return 0;
                 }
             }
             try
             {
                 if (flag)
                 {
                     return (uint) ((XDevkit.IXboxConsole) xbCon).ExecuteRPC<float>(options, infoArray2);
                 }
                 return ((XDevkit.IXboxConsole) xbCon).ExecuteRPC<uint>(options, args);
             }
             catch (Exception)
             {
                 return 0;
             }
         }
         return 0;
     }
     long[] argument = new long[9];
     if (firstRan == 0)
     {
         byte[] buffer = new byte[4];
         xbCon.DebugTarget.GetMemory(0x91c088ae, 4, buffer, out meh);
         xbCon.DebugTarget.InvalidateMemoryCache(true, 0x91c088ae, 4);
         Array.Reverse(buffer);
         bufferAddress = BitConverter.ToUInt32(buffer, 0);
         firstRan = 1;
         stringPointer = bufferAddress + 0x5dc;
         floatPointer = bufferAddress + 0xa8c;
         bytePointer = bufferAddress + 0xc80;
         xbCon.DebugTarget.SetMemory(bufferAddress, 100, nulled, out meh);
         xbCon.DebugTarget.SetMemory(stringPointer, 100, nulled, out meh);
     }
     if (bufferAddress == 0)
     {
         byte[] buffer2 = new byte[4];
         xbCon.DebugTarget.GetMemory(0x91c088ae, 4, buffer2, out meh);
         xbCon.DebugTarget.InvalidateMemoryCache(true, 0x91c088ae, 4);
         Array.Reverse(buffer2);
         bufferAddress = BitConverter.ToUInt32(buffer2, 0);
     }
     stringPointer = bufferAddress + 0x5dc;
     floatPointer = bufferAddress + 0xa8c;
     bytePointer = bufferAddress + 0xc80;
     int num4 = 0;
     int index = 0;
     foreach (object obj3 in arg)
     {
         if (obj3 is byte)
         {
             byte[] buffer3 = (byte[]) obj3;
             argument[index] = BitConverter.ToUInt32(buffer3, 0);
         }
         else if (obj3 is byte[])
         {
             byte[] buffer4 = (byte[]) obj3;
             xbCon.DebugTarget.SetMemory(bytePointer, (uint) buffer4.Length, buffer4, out meh);
             argument[index] = bytePointer;
             bytePointer += (uint) (buffer4.Length + 2);
         }
         else if (obj3 is float)
         {
             byte[] buffer5 = BitConverter.GetBytes(float.Parse(Convert.ToString(obj3)));
             xbCon.DebugTarget.SetMemory(floatPointer, (uint) buffer5.Length, buffer5, out meh);
             argument[index] = floatPointer;
             floatPointer += (uint) (buffer5.Length + 2);
         }
         else if (obj3 is float[])
         {
             byte[] dst = new byte[12];
             int num6 = 0;
             for (num6 = 0; num6 <= 2; num6++)
             {
                 byte[] buffer7 = new byte[4];
                 Buffer.BlockCopy((Array) obj3, num6 * 4, buffer7, 0, 4);
                 Array.Reverse(buffer7);
                 Buffer.BlockCopy(buffer7, 0, dst, 4 * num6, 4);
             }
             xbCon.DebugTarget.SetMemory(floatPointer, (uint) dst.Length, dst, out meh);
             argument[index] = floatPointer;
             floatPointer += 2;
         }
         else if (obj3 is string)
         {
             byte[] buffer8 = Encoding.ASCII.GetBytes(Convert.ToString(obj3));
             xbCon.DebugTarget.SetMemory(stringPointer, (uint) buffer8.Length, buffer8, out meh);
             argument[index] = stringPointer;
             string str = Convert.ToString(obj3);
             stringPointer += (uint) (str.Length + 1);
         }
         else
         {
             argument[index] = Convert.ToInt64(obj3);
         }
         num4++;
         index++;
     }
     byte[] data = getData(argument);
     xbCon.DebugTarget.SetMemory(bufferAddress + 8, (uint) data.Length, data, out meh);
     byte[] bytes = BitConverter.GetBytes(num4);
     Array.Reverse(bytes);
     xbCon.DebugTarget.SetMemory(bufferAddress + 4, 4, bytes, out meh);
     Thread.Sleep(0);
     byte[] array = BitConverter.GetBytes(address);
     Array.Reverse(array);
     xbCon.DebugTarget.SetMemory(bufferAddress, 4, array, out meh);
     Thread.Sleep(50);
     byte[] buffer12 = new byte[4];
     xbCon.DebugTarget.GetMemory(bufferAddress + 0xffc, 4, buffer12, out meh);
     xbCon.DebugTarget.InvalidateMemoryCache(true, bufferAddress + 0xffc, 4);
     Array.Reverse(buffer12);
     return BitConverter.ToUInt32(buffer12, 0);
 }
예제 #7
0
        public static uint Call(this XDevkit.IXboxConsole xbCon, uint address, params object[] arg)
        {
            if (((XDevkit.IXboxConsole)xbCon).SupportsRPC())
            {
                bool flag = false;
                if (xbCon != null)
                {
                    XDRPCExecutionOptions       options    = new XDRPCExecutionOptions(XDRPCMode.Title, address);
                    XDRPCArgumentInfo[]         args       = new XDRPCArgumentInfo[arg.Length];
                    XDRPCArgumentInfo <float>[] infoArray2 = new XDRPCArgumentInfo <float> [arg.Length];
                    for (int i = 0; i < arg.Length; i++)
                    {
                        object obj2 = arg[i];
                        if (obj2 is string)
                        {
                            args[i] = new XDRPCStringArgumentInfo((string)obj2);
                        }
                        else if (obj2 is int)
                        {
                            args[i] = new XDRPCArgumentInfo <int>((int)obj2);
                        }
                        else if (obj2 is uint)
                        {
                            args[i] = new XDRPCArgumentInfo <uint>((uint)obj2);
                        }
                        else if (obj2 is float)
                        {
                            infoArray2[i] = new XDRPCArgumentInfo <float>((float)obj2);
                            flag          = true;
                        }
                        else if (obj2 is long)
                        {
                            args[i] = new XDRPCArgumentInfo <long>((long)obj2);
                        }
                        else if (obj2 is byte[])
                        {
                            args[i] = new XDRPCArrayArgumentInfo <byte[]>((byte[])obj2);
                        }
                        else if (obj2 is short)
                        {
                            args[i] = new XDRPCArgumentInfo <short>((short)obj2);
                        }
                        else if (obj2 is byte)
                        {
                            args[i] = new XDRPCArgumentInfo <byte>((byte)obj2);
                        }
                        else if (obj2 is char[])
                        {
                            args[i] = new XDRPCArrayArgumentInfo <char[]>((char[])obj2);
                        }
                        else if (obj2 is char)
                        {
                            args[i] = new XDRPCArgumentInfo <char>((char)obj2);
                        }
                        else
                        {
                            Console.WriteLine("Invalid Arg");
                            return(0);
                        }
                    }
                    try
                    {
                        if (flag)
                        {
                            return((uint)((XDevkit.IXboxConsole)xbCon).ExecuteRPC <float>(options, infoArray2));
                        }
                        return(((XDevkit.IXboxConsole)xbCon).ExecuteRPC <uint>(options, args));
                    }
                    catch (Exception)
                    {
                        return(0);
                    }
                }
                return(0);
            }
            long[] argument = new long[9];
            if (firstRan == 0)
            {
                byte[] buffer = new byte[4];
                xbCon.DebugTarget.GetMemory(0x91c088ae, 4, buffer, out meh);
                xbCon.DebugTarget.InvalidateMemoryCache(true, 0x91c088ae, 4);
                Array.Reverse(buffer);
                bufferAddress = BitConverter.ToUInt32(buffer, 0);
                firstRan      = 1;
                stringPointer = bufferAddress + 0x5dc;
                floatPointer  = bufferAddress + 0xa8c;
                bytePointer   = bufferAddress + 0xc80;
                xbCon.DebugTarget.SetMemory(bufferAddress, 100, nulled, out meh);
                xbCon.DebugTarget.SetMemory(stringPointer, 100, nulled, out meh);
            }
            if (bufferAddress == 0)
            {
                byte[] buffer2 = new byte[4];
                xbCon.DebugTarget.GetMemory(0x91c088ae, 4, buffer2, out meh);
                xbCon.DebugTarget.InvalidateMemoryCache(true, 0x91c088ae, 4);
                Array.Reverse(buffer2);
                bufferAddress = BitConverter.ToUInt32(buffer2, 0);
            }
            stringPointer = bufferAddress + 0x5dc;
            floatPointer  = bufferAddress + 0xa8c;
            bytePointer   = bufferAddress + 0xc80;
            int num4  = 0;
            int index = 0;

            foreach (object obj3 in arg)
            {
                if (obj3 is byte)
                {
                    byte[] buffer3 = (byte[])obj3;
                    argument[index] = BitConverter.ToUInt32(buffer3, 0);
                }
                else if (obj3 is byte[])
                {
                    byte[] buffer4 = (byte[])obj3;
                    xbCon.DebugTarget.SetMemory(bytePointer, (uint)buffer4.Length, buffer4, out meh);
                    argument[index] = bytePointer;
                    bytePointer    += (uint)(buffer4.Length + 2);
                }
                else if (obj3 is float)
                {
                    byte[] buffer5 = BitConverter.GetBytes(float.Parse(Convert.ToString(obj3)));
                    xbCon.DebugTarget.SetMemory(floatPointer, (uint)buffer5.Length, buffer5, out meh);
                    argument[index] = floatPointer;
                    floatPointer   += (uint)(buffer5.Length + 2);
                }
                else if (obj3 is float[])
                {
                    byte[] dst  = new byte[12];
                    int    num6 = 0;
                    for (num6 = 0; num6 <= 2; num6++)
                    {
                        byte[] buffer7 = new byte[4];
                        Buffer.BlockCopy((Array)obj3, num6 * 4, buffer7, 0, 4);
                        Array.Reverse(buffer7);
                        Buffer.BlockCopy(buffer7, 0, dst, 4 * num6, 4);
                    }
                    xbCon.DebugTarget.SetMemory(floatPointer, (uint)dst.Length, dst, out meh);
                    argument[index] = floatPointer;
                    floatPointer   += 2;
                }
                else if (obj3 is string)
                {
                    byte[] buffer8 = Encoding.ASCII.GetBytes(Convert.ToString(obj3));
                    xbCon.DebugTarget.SetMemory(stringPointer, (uint)buffer8.Length, buffer8, out meh);
                    argument[index] = stringPointer;
                    string str = Convert.ToString(obj3);
                    stringPointer += (uint)(str.Length + 1);
                }
                else
                {
                    argument[index] = Convert.ToInt64(obj3);
                }
                num4++;
                index++;
            }
            byte[] data = getData(argument);
            xbCon.DebugTarget.SetMemory(bufferAddress + 8, (uint)data.Length, data, out meh);
            byte[] bytes = BitConverter.GetBytes(num4);
            Array.Reverse(bytes);
            xbCon.DebugTarget.SetMemory(bufferAddress + 4, 4, bytes, out meh);
            Thread.Sleep(0);
            byte[] array = BitConverter.GetBytes(address);
            Array.Reverse(array);
            xbCon.DebugTarget.SetMemory(bufferAddress, 4, array, out meh);
            Thread.Sleep(50);
            byte[] buffer12 = new byte[4];
            xbCon.DebugTarget.GetMemory(bufferAddress + 0xffc, 4, buffer12, out meh);
            xbCon.DebugTarget.InvalidateMemoryCache(true, bufferAddress + 0xffc, 4);
            Array.Reverse(buffer12);
            return(BitConverter.ToUInt32(buffer12, 0));
        }