예제 #1
0
        /*
         * Processes codes in the string array splitList
         */
        public static Form1.CodeDB ParseCodeString(string data, Form1.CodeDB db)
        {
            if (data == null)
            {
                return(db);
            }

            Form1.CodeDB ret = db;

            splitList = data.Split('\n');
            ret.CData = new Form1.ncCode[0];

            foreach (string s in splitList)
            {
                if (s != "" && s != "\r" && s.Split(' ').Length > 2)
                {
                    Form1.ncCode     temp   = new Form1.ncCode();
                    Form1.ncCodeType tempCT = ncCodeTypes.Where(i => i.Command == s[0]).FirstOrDefault();
                    if (tempCT.Command != '\0')
                    {
                        temp = tempCT.ParseCode(s.Replace("\r", ""));
                    }
                    if (temp.codeArg2 != null)
                    {
                        Array.Resize(ref ret.CData, ret.CData.Length + 1);
                        ret.CData[ret.CData.Length - 1] = temp;
                    }
                }
            }

            return(ret);
        }
예제 #2
0
 public static bool isCodeValid(Form1.ncCode c)
 {
     if (c.codeType != null && c.codeType != '\0') //valid code
     {
         if (c.codeArg2 != null && c.codeArg2.Length != 0)
         {
             if (c.codeArg1_BA != null && c.codeArg1_BA.Length != 0)
             {
                 return(true);
             }
         }
     }
     return(false);
 }
예제 #3
0
        /*
         * Processes joker code types (both D and E type)
         */
        /*
         * public static int ParseJokerD(string[] splitList, int cnt, ref Form1.CodeDB Code, int ind2)
         * {
         *  String code = misc.sLeft(splitList[cnt], 19);
         *  String val = misc.sRight(code, 8);
         *  if (val.IndexOf(' ') >= 0)
         *      return 0;
         *  Code.CData[ind2].jsize = int.Parse(misc.sLeft(val, 2), NumberStyles.HexNumber);
         *  Array.Resize(ref Code.CData, Code.CData.Length + Code.CData[ind2].jsize);
         *  int x = 0, y = 0, ret = Code.CData[ind2].jsize;
         *
         *  Code.CData[ind2].jbool = BitConverter.GetBytes(int.Parse(misc.ReverseE("00" + misc.sRight(val, 6), 8), NumberStyles.HexNumber));
         *
         *  ind2++;
         *  for (x = 0; x < ret; x++)
         *  {
         *      do
         *      {
         *          y++;
         *          if ((cnt + y) >= splitList.Length)
         *              return ind2;
         *          code = misc.sLeft(splitList[cnt + y], 19);
         *      } while (code == null || code == "" || CheckForComment(code) == 1);
         *
         *      int len = 0;
         *      Code.CData[ind2].type = code[0];
         *
         *      switch (Code.CData[ind2].type)
         *      {
         *          case '0':
         *              len = 2;
         *              break;
         *          case '1':
         *              len = 4;
         *              break;
         *          case '2': case '6': case 'D': case 'E':
         *              len = 8;
         *              break;
         *      }
         *
         *      Code.CData[ind2].addr = ulong.Parse(misc.sMid(code, 2, 8), NumberStyles.HexNumber);
         *      Code.CData[ind2].val = BitConverter.GetBytes(int.Parse(misc.ReverseE(misc.sRight(code, len), 8), NumberStyles.HexNumber));
         *      ind2++;
         *  }
         *
         *  return ind2;
         * }
         */


        #region CodeType Parsers

        public static Form1.ncCode parseTextCode(string code)
        {
            Form1.ncCode ret = parseCode(code);
            if (code == null || code == "" || ret.codeArg2 == null)
            {
                return(new Form1.ncCode());
            }

            string[] codeArr  = code.Split(' ');
            string   writeStr = "";

            for (int off = 2; off < codeArr.Length; off++)
            {
                writeStr += codeArr[off] + " ";
            }
            writeStr     = writeStr.TrimEnd(' ');
            ret.codeArg2 = misc.StringToByteArray(writeStr);
            Array.Resize(ref ret.codeArg2, ret.codeArg2.Length + 1);

            return(ret);
        }
예제 #4
0
        private void ConditionalEditor_Shown(object sender, EventArgs e)
        {
            cbType.SelectedIndex = 0;
            cbComp.SelectedIndex = 0;

            if (!isEditing)
            {
                tbCodes.Text = String.Join("\r\n", code.Split(new char[] { '\r', '\n' }));

                cond       = new CondCode();
                cond.addr  = 0;
                cond.codes = tbCodes.Text;
                cond.value = "00000000";
                cond.type  = CodeType.Hex;
            }
            else
            {
                Form1.ncCode ncCd = codes.ParseCodeStringFull(code)[0];
                string       text = ""; // ncCd.codeType.ToString() + " " + ncCd.codeArg1.ToString("X8") + " " + misc.ByteAToStringHex(ncCd.codeArg2, "") + "\r\n";
                int          selStart = rtb.SelectionStart, selEnd = 0;
                SelStart = selStart;

                while (rtb.Text[selStart] != '\n')
                {
                    selStart++;
                }
                selStart++;



                for (int x = (int)ncCd.codeArg0; x > 0;)
                {
                    if (selStart >= rtb.Text.Length)
                    {
                        break;
                    }

                    selEnd = selStart + 1;
                    while (selEnd < rtb.Text.Length && rtb.Text[selEnd] != '\n')
                    {
                        selEnd++;
                    }

                    string line = rtb.Text.Substring(selStart, selEnd - selStart);
                    if (codes.ParseCodeStringFull(line)[0].codeType != '\0')
                    {
                        text += line + "\r\n";
                        x--;
                    }
                    else
                    {
                        text += ((line.IndexOf("\n") >= 0 && line.IndexOf("\r") < 0) ? line.Replace("\n", "\r\n") : line) + "\r\n";
                    }

                    selStart = selEnd + 1;
                }

                SelEnd = selEnd;

                cond       = new CondCode();
                cond.addr  = (uint)ncCd.codeArg1;
                cond.codes = text;
                cond.value = misc.ByteAToStringHex(ncCd.codeArg2, "");
                cond.type  = CodeType.Hex;


                tbCodes.Text         = text;
                tbAddr.Text          = ncCd.codeArg1.ToString("X8");
                tbValue.Text         = cond.value;
                cbType.SelectedIndex = 0;
                cbComp.SelectedIndex = ncCd.codeType.ToString().ToUpper() == "D" ? 0 : 1;
            }
        }
예제 #5
0
        public static Form1.ncCode parseCode(string code)
        {
            Form1.ncCode ret = new Form1.ncCode();
            if (code == null || code == "")
            {
                return(ret);
            }

            string[] codeArr = code.Split(' ');
            for (int x = 0; x < 3; x++)
            {
                if (codeArr[x] != "")
                {
                    try
                    {
                        switch (x)
                        {
                        case 0:
                            ret.codeType = codeArr[0][0];
                            if (codeArr[0].Length > 1)
                            {
                                ret.codeArg0 = uint.Parse(misc.sRight(codeArr[0], codeArr[0].Length - 1), System.Globalization.NumberStyles.HexNumber);
                            }
                            break;

                        case 1:
                            try
                            {
                                ret.codeArg1 = ulong.Parse(codeArr[1], System.Globalization.NumberStyles.HexNumber);
                            }
                            catch { }
                            ret.codeArg1_BA = misc.StringBAToBA(codeArr[1]);
                            break;

                        case 2:
                            switch (ret.codeType)
                            {
                            case '1':
                                ret.codeArg2 = new byte[0];
                                break;

                            case '2':
                                Single flt = Single.Parse(codeArr[2]);
                                ret.codeArg2 = BitConverter.GetBytes(flt);
                                Array.Reverse(ret.codeArg2);
                                break;

                            default:
                                ret.codeArg2 = misc.StringBAToBA(codeArr[2]);
                                break;
                            }
                            break;
                        }
                    }
                    catch { }
                }
            }

            if (ret.codeType != '\0' && ret.codeArg2 != null)
            {
                return(ret);
            }
            else
            {
                return(new Form1.ncCode());
            }
        }
예제 #6
0
        /*
         * Loops through each code (if it is a write) it grabs what the data is
         */
        public static Form1.ncCode[] CreateBackupPS3(Form1.CodeDB Codes)
        {
            if (Codes.CData == null)
            {
                return(new Form1.ncCode[0]);
            }

            Form1.ncCode[] ret            = new Form1.ncCode[0];
            int            isPointerWrite = 0;
            ulong          arg1           = 0;

            foreach (Form1.ncCode nC in Codes.CData)
            {
                if (nC.codeType == '0' || nC.codeType == '1' || nC.codeType == '2')
                {
                    Array.Resize(ref ret, ret.Length + 1);
                    int ind = ret.Length - 1;
                    ret[ind]          = new Form1.ncCode();
                    ret[ind].codeType = nC.codeType;
                    ret[ind].codeArg0 = nC.codeArg0;
                    if (isPointerWrite == 1)
                    {
                        ret[ind].codeArg1 = arg1;
                        isPointerWrite    = 0;
                    }
                    else if (isPointerWrite == 2)
                    {
                        byte[] arg1_BA = BitConverter.GetBytes((uint)arg1);
                        if (BitConverter.IsLittleEndian)
                        {
                            Array.Reverse(arg1_BA);
                        }
                        ret[ind].codeArg2 = arg1_BA;
                        isPointerWrite    = 0;
                    }
                    else
                    {
                        ret[ind].codeArg1 = nC.codeArg1;
                    }
                    ret[ind].codeArg2 = new byte[nC.codeArg2.Length];
                    Form1.apiGetMem(ret[ind].codeArg1, ref ret[ind].codeArg2);
                }
                else if (nC.codeType == '6')
                {
                    byte[] arg1_BA = BitConverter.GetBytes((uint)arg1);
                    if (BitConverter.IsLittleEndian)
                    {
                        Array.Reverse(arg1_BA);
                    }

                    byte[] addr     = new byte[4];
                    ulong  arg1Addr = (isPointerWrite == 1) ? arg1 : nC.codeArg1;
                    byte[] arg2Off  = (isPointerWrite == 2) ? arg1_BA : nC.codeArg2;
                    Form1.apiGetMem(arg1Addr, ref addr);
                    if (!Form1.doFlipArray)
                    {
                        Array.Reverse(addr);
                    }
                    ulong newAddrUL = BitConverter.ToUInt32(addr, 0);
                    newAddrUL     += misc.ByteArrayToLong(arg2Off, 0, arg2Off.Length);
                    arg1           = newAddrUL;
                    isPointerWrite = ((nC.codeArg0 == 1) ? 2 : 1);
                }
            }

            return(ret);
        }