示例#1
0
        static public void MakeUPS(byte[] s, byte[] d, string upsFilename)
        {
            List <byte> ups = new List <byte>();

            ups.Add((byte)'U');
            ups.Add((byte)'P');
            ups.Add((byte)'S');
            ups.Add((byte)'1');
            append_val_code(ups, (uint)s.Length);
            append_val_code(ups, (uint)d.Length);

            uint length     = (uint)Math.Max(s.Length, d.Length);
            uint last_point = 0;

            for (uint i = 0; i < length; i++)
            {
                int ss = i < s.Length ? s[i] : 0;
                int dd = i < d.Length ? d[i] : 0;

                if (ss == dd)
                {
                    continue;
                }

                append_val_code(ups, (uint)(i - last_point));

                List <byte> diff = new List <byte>();
                diff.Add((byte)(ss ^ dd));

                uint n;
                for (n = i + 1; n < length; n++)
                {
                    ss = n < s.Length ? s[n] : 0;
                    dd = n < d.Length ? d[n] : 0;
                    if (ss == dd)
                    {
                        break;
                    }
                    diff.Add((byte)(ss ^ dd));
                }
                //i-n
                ups.AddRange(diff.ToArray());
                ups.Add(0);

                i          = n;
                last_point = n + 1;
            }
            U.CRC32 crc32 = new U.CRC32();
            U.append_u32(ups, crc32.Calc(s));
            U.append_u32(ups, crc32.Calc(d));
            U.append_u32(ups, crc32.Calc(ups.ToArray()));

            U.WriteAllBytes(upsFilename, ups.ToArray());
        }
示例#2
0
        string MakeReportLog()
        {
            StringBuilder sb = new StringBuilder();

            //User名を消す
            sb.Append(U.TrimPersonalInfomation(Log.LogToString(1024)));
            //情報を書き込む.
            sb.AppendLine("\r\n------\r\n");
            string FEVersion = "";

            if (Program.ROM != null)
            {
                FEVersion  = Program.ROM.RomInfo.VersionToFilename();
                FEVersion += " @ROMSize: " + Program.ROM.Data.Length;

                U.CRC32 crc32 = new U.CRC32();
                FEVersion += " @CRC32: " + U.ToHexString8(crc32.Calc(Program.ROM.Data));
            }

            sb.AppendLine(typeof(U).Assembly.GetName().Name + ":" + U.getVersion());
            sb.AppendLine("FEVersion:" + FEVersion);
            sb.AppendLine("Emu:" + OptionForm.GetEmulatorNameOnly());

            sb.AppendLine("MapID:");
            sb.AppendLine(U.ToHexString(this.X_MapID.Value) + ":" + this.X_MapName.Text);

            sb.AppendLine("UnitID:");
            sb.AppendLine(U.ToHexString(this.X_UnitID.Value) + ":" + this.X_UnitName.Text);

            //ユーザが書いた問題点
            sb.AppendLine("Problem:");
            sb.AppendLine(Problem.Text);
            return(sb.ToString());
        }
        bool IsOrignalROM(byte[] rom)
        {
            uint orignal_crc32 = Program.ROM.RomInfo.orignal_crc32;

            U.CRC32 crc32 = new U.CRC32();
            if (orignal_crc32 == crc32.Calc(rom))
            {//無改造ROM
                return(true);
            }
            return(false);
        }
示例#4
0
        public VersionForm()
        {
            InitializeComponent();

            //see   ビルド時間の取得
            //http://devlights.hatenablog.com/entry/2015/04/14/230841

            string ver;

#if DEBUG
            ver = "-Debug Build-";
#else
            ver = U.getVersion();
#endif

            StringBuilder sb = new StringBuilder();
            sb.AppendLine(
                R._("{1} Version:{0}\r\nCopyright: 2017-\r\nLicense: GPLv3\r\n\r\nこのソフトウェアはオープンソースのフリーソフトウェアです。\r\nGPLv3に従ってご自由にお使いください。"
                    , ver
                    , typeof(U).Assembly.GetName().Name
                    )
                );

            sb.AppendLine();
            if (Program.ROM != null)
            {
                string FEVersion = "";
                FEVersion  = Program.ROM.RomInfo.VersionToFilename();
                FEVersion += " @ROMSize: " + Program.ROM.Data.Length;

                U.CRC32 crc32       = new U.CRC32();
                uint    targetCRC32 = crc32.Calc(Program.ROM.Data);
                FEVersion += " @CRC32: " + U.ToHexString8(targetCRC32);
                sb.AppendLine("FEVersion:" + FEVersion);

                if (targetCRC32 == Program.ROM.RomInfo.orignal_crc32())
                {
                    sb.AppendLine(R._("[このROMは正規品の無改造ROMです。]"));
                }
            }

            if (IsOldVersion())
            {
                sb.AppendLine(MakeUpdateMessage());
            }


            Version.Text = sb.ToString();
            Version.Select(0, 0); //全選択解除.
#if DEBUG
            DevTranslateButton.Show();
#endif
        }
示例#5
0
        static void ROMCheck(List <FELint.ErrorSt> errors)
        {
            if (Program.ROM.Data.Length > 1024 * 1024 * 32)
            {
                errors.Add(new FELint.ErrorSt(FELint.Type.FELINT_SYSTEM_ERROR, U.NOT_FOUND
                                              , R._("ROMの容量が32MBを超えています。\r\nGBAでは、32MBを超えたROMは実行できません。"
                                                    )));
            }

            //ROM Headerのチェック
            //ロゴは商標があるので、ここには書けません。
            //よって、CRC32を取得してチェックしましょう
            byte[]  logo       = Program.ROM.getBinaryData(0x0, 0xA0);
            U.CRC32 crc32      = new U.CRC32();
            uint    logo_crc32 = crc32.Calc(logo);

            if (logo_crc32 != 0x96b08a28)
            {
                errors.Add(new FELint.ErrorSt(FELint.Type.ROM_HEADER, U.NOT_FOUND
                                              , R._("ROM先頭にあるロゴ領域が破壊されています。\r\n自動修正する場合は、ここをクリックしてください。"
                                                    )));
            }
        }
示例#6
0
        public static bool ApplyUPS(ROM retrom, string upsfilename)
        {
            byte[] patch = File.ReadAllBytes(upsfilename);
            if (patch.Length < 16)
            {
                R.ShowStopError("UPSファイルが壊れています。最低サイズ以下です。");
                return(false);
            }

            if (patch[0] != 'U' ||
                patch[1] != 'P' ||
                patch[2] != 'S' ||
                patch[3] != '1')
            {
                R.ShowStopError("UPSファイルが壊れています。ヘッダUPS1がありません。");
                return(false);
            }

            U.CRC32 crc32 = new U.CRC32();
            {
                uint patch_calc_crc32 = crc32.Calc(U.subrange(patch, 0, (uint)(patch.Length - 4)));
                uint patch_crc32      = U.u32(patch, (uint)(patch.Length - 4));
                if (patch_calc_crc32 != patch_crc32)
                {
                    R.ShowStopError("UPSファイルが壊れています。CRCが一致しません。");
                    return(false);
                }
            }
            {
                uint src_calc_crc32 = crc32.Calc(retrom.Data);
                uint src_crc32      = U.u32(patch, (uint)(patch.Length - 12));
                if (src_calc_crc32 != src_crc32)
                {
                    R.ShowStopError("現在開いているROMには適応できません。CRCが一致しません。");
                    return(false);
                }
            }

            uint i           = 4; //skip UPS1 header
            uint source_size = read_val_code(patch, i, out i);
            uint dest_size   = read_val_code(patch, i, out i);

            //無改造ROMのデータ
            byte[] bin = new byte[dest_size];
            Array.Copy(retrom.Data, 0, bin, 0, Math.Min(retrom.Data.Length, dest_size));

            uint romi = 0;
            uint end  = (uint)(patch.Length - 4 * 3);

            for (; i < end; i++)
            {
                uint skip_size = read_val_code(patch, i, out i);
                romi += skip_size;
                for (; i < end; i++)
                {
                    if (romi >= dest_size)
                    {
                        break;
                    }

                    bin[romi] = (byte)(bin[romi] ^ patch[i]);
                    romi++;
                    if (patch[i] == 0x00)
                    {
                        break;
                    }
                }
            }

            uint dest_calc_crc32 = crc32.Calc(bin);
            uint dest_crc32      = U.u32(patch, (uint)(patch.Length - 8));

            if (dest_calc_crc32 != dest_crc32)
            {
                R.ShowStopError("UPSを適応した結果が正しくありません。CRCが不一致です。");
                return(false);
            }

            retrom.SwapNewROMDataDirect(bin);
            retrom.ClearModifiedFlag();
            return(true);
        }