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()); }
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); }
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 }
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自動修正する場合は、ここをクリックしてください。" ))); } }
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); }