private void DoWork(object sender, DoWorkEventArgs e) { var file = e.Argument.ToString(); if (string.IsNullOrEmpty(file)) { return; } var sw = new Stopwatch(); var fi = new FileInfo(file); if (Common.Types.ContainsKey(fi.Length)) { SetTitle(string.Format("{0} Type: {2} File: {1}", _version, Path.GetFileName(file), Common.Types[fi.Length].Name.Value)); Common.SendStatus("Reading image into memory and checking statistics..."); Logger.LogPath = Path.GetDirectoryName(file) + "\\" + Path.GetFileNameWithoutExtension(file) + "_PS3Check.log"; Logger.WriteLine2("********************************************"); Logger.WriteLine2(_version); Logger.WriteLine2(string.Format("Check started: {0}", DateTime.Now)); Logger.WriteLine2("********************************************"); sw.Start(); Logger.WriteLine("Reading image into memory and checking statistics..."); e.Result = Checks.StartCheck(file, ref sw); } else { Common.SendStatus("ERROR: Bad file size! Check aborted..."); } }
public void ParseConfig(string file) { Common.SendStatus(string.Format("Parsing {0}", file)); Common.Types.Clear(); using (var xml = XmlReader.Create(file)) { var dataCheckKey = 0; var dataCheckOk = false; var skUkey = 0; long size = 0; var skuWarn = false; var skuName = ""; var skuWarnMsg = ""; var skuMinVer = ""; while (xml.Read()) { if (!xml.IsStartElement()) { continue; } switch (xml.Name.ToLower()) { case "type": if (long.TryParse(xml["size"], out size)) { if (!Common.Types.ContainsKey(size)) { Common.Types.Add(size, new Common.TypeData()); } Common.Types[size].Name.Value = xml["name"]; } break; #region Statistics part case "stats": if (!Common.Types.ContainsKey(size)) { break; } xml.Read(); Common.Types[size].StatDescription.Value = xml.Value; if (!string.IsNullOrEmpty(Common.Types[size].StatDescription.Value)) { Common.Types[size].StatDescription.Value = Common.Types[size].StatDescription.Value.Trim(); Common.Types[size].StatDescription.Value += Environment.NewLine; Common.Types[size].StatDescription.Value.Replace("\\n", Environment.NewLine); } break; case "statspart": var key = xml["key"]; if (key == null) { break; } if (string.IsNullOrEmpty(key)) { key = "*"; } key = key.ToUpper(); if (!Common.Types[size].Statlist.Value.ContainsKey(key)) { double low; double high; var lowtxt = xml["low"]; if (lowtxt != null) { lowtxt = Regex.Replace(lowtxt, @"\s+", ""); lowtxt = lowtxt.Replace('.', ','); } var hightxt = xml["high"]; if (hightxt != null) { hightxt = Regex.Replace(hightxt, @"\s+", ""); hightxt = hightxt.Replace('.', ','); } if (!double.TryParse(lowtxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out low)) { low = 0; } else if (low < 0 || low > 100) { low = 0; } if (!double.TryParse(hightxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out high)) { high = 100; } else if (high > 100 || low > high || high < 0) { high = 100; } Common.Types[size].Statlist.Value.Add(key, new Holder <Common.StatCheck>(new Common.StatCheck(low, high))); } break; #endregion Statistics part #region Binary Check Entry case "binentry": if (!Common.Types.ContainsKey(size)) { break; } key = xml["name"]; if (String.IsNullOrEmpty(key)) { break; } if (!Common.Types[size].Bincheck.Value.ContainsKey(key)) { if (xml["ismulti"] != null && xml["ismulti"].Equals("true", StringComparison.CurrentCultureIgnoreCase)) { Common.Types[size].Bincheck.Value.Add(key, new Holder <Common.BinCheck>(new Common.BinCheck(new List <Common.MultiBin>(), true, xml["offset"], xml["description"], xml["ascii"]))); var id = xml["id"]; xml.Read(); Common.Types[size].Bincheck.Value[key].Value.ExpectedList.Value.Add(new Common.MultiBin(Regex.Replace(xml.Value, @"\s+", ""), id)); } else { var offset = xml["offset"]; var description = xml["description"]; var ascii = xml["ascii"]; xml.Read(); Common.Types[size].Bincheck.Value.Add(key, new Holder <Common.BinCheck>(new Common.BinCheck(null, false, offset, description, ascii, xml.Value))); } } else if (xml["ismulti"] != null && xml["ismulti"].Equals("true", StringComparison.CurrentCultureIgnoreCase)) { var id = xml["id"]; var disablepatch = !string.IsNullOrEmpty(xml["disablepatch"]) && xml["disablepatch"].Equals("true", StringComparison.CurrentCultureIgnoreCase); xml.Read(); var explist = Common.Types[size].Bincheck.Value[key].Value; explist.ExpectedList.Value.Add(new Common.MultiBin(Regex.Replace(xml.Value, @"\s+", ""), id, disablepatch)); } break; #endregion Binary Check Entry #region Data Check list case "datalist": if (!Common.Types.ContainsKey(size)) { break; } var dataCheckList = new Common.DataCheck { Name = xml["name"], ThresholdList = new Dictionary <string, double>() }; if (long.TryParse(xml["offset"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.Offset)) { dataCheckOk = long.TryParse(xml["size"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.Size); if (!dataCheckOk) { dataCheckOk = long.TryParse(xml["ldrsize"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.LdrSize); } if (dataCheckOk) { dataCheckKey++; dataCheckList.DataKey = dataCheckKey; Common.Types[size].DataCheckList.Value.Add(dataCheckList); } } break; #region Data treshold case "datatreshold": if (!Common.Types.ContainsKey(size)) { break; } if (!dataCheckOk) { break; } foreach (var entry in Common.Types[size].DataCheckList.Value) { if (entry.DataKey != dataCheckKey) { continue; } var dkey = xml["key"]; if (dkey == null) { break; } if (string.IsNullOrEmpty(dkey)) { dkey = "*"; } dkey = dkey.ToUpper(); xml.Read(); var tmptxt = xml.Value; if (tmptxt != null) { tmptxt = Regex.Replace(tmptxt, @"\s+", ""); tmptxt = tmptxt.Replace('.', ','); } double tmpval; if (!double.TryParse(tmptxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out tmpval)) { tmpval = 49; } else if (tmpval < 0 || tmpval > 100) { tmpval = 49; } entry.ThresholdList.Add(dkey, tmpval); break; } break; #endregion Data treshold #endregion Data Check List #region SKU Data List case "skudataentry": if (!Common.Types.ContainsKey(size)) { break; } var skuDataEntry = new Common.SKUDataEntry(); var skuoffset = xml["offset"]; var isok = (uint.TryParse(skuoffset, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out skuDataEntry.Offset)); if (isok) { var skusize = xml["size"]; isok = (uint.TryParse(skusize, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out skuDataEntry.Size)); } xml.Read(); skuDataEntry.Type = xml.Value; if (isok) { Common.Types[size].SKUDataList.Value.Add(skuDataEntry); } break; #endregion SKU Data List #region SKU List case "skulist": if (!Common.Types.ContainsKey(size)) { break; } skUkey++; skuWarn = xml["warn"] != null && xml["warn"].Equals("true", StringComparison.CurrentCultureIgnoreCase); skuName = xml["name"]; skuWarnMsg = xml["warnmsg"]; skuMinVer = xml["minver"]; break; case "skuentry": if (!Common.Types.ContainsKey(size)) { break; } var exists = false; foreach (var entry in Common.Types[size].SKUList.Value) { if (entry.SKUKey != skUkey) { continue; } exists = true; break; } var skuEntry = new Common.SKUEntry(); if (!exists) { skuEntry.Warn = skuWarn; skuEntry.WarnMsg = skuWarnMsg; } skuEntry.SKUKey = skUkey; skuEntry.Name = skuName; skuEntry.Type = xml["type"]; skuEntry.MinVer = skuMinVer; xml.Read(); skuEntry.Data = Regex.Replace(xml.Value, @"\s+", ""); Common.Types[size].SKUList.Value.Add(skuEntry); break; #endregion SKU List #region RepCheck Entry case "repcheck": if (!Common.Types.ContainsKey(size)) { break; } var tmp = new Common.RepCheckData { Name = xml["name"] }; if (!int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out tmp.Offset)) { break; // It's broken! } xml.Read(); if (!string.IsNullOrEmpty(xml.Value)) { var data = Encoding.Unicode.GetString(Common.HexToArray(Regex.Replace(xml.Value, @"\s+", "").ToUpper())); Common.Types[size].RepCheck.Value.Add(data, new Holder <Common.RepCheckData>(tmp)); } break; #endregion #region Datamatches Entries case "datamatchid": if (!Common.Types.ContainsKey(size)) { break; } var tmpid = xml["id"]; if (string.IsNullOrEmpty(tmpid)) { break; } if (!Common.Types[size].DataMatchList.Value.ContainsKey(tmpid)) { Common.Types[size].DataMatchList.Value.Add(tmpid, new Holder <Common.DataMatchID>(new Common.DataMatchID())); } xml.Read(); if (string.IsNullOrEmpty(xml.Value)) { break; } Common.Types[size].DataMatchList.Value[tmpid].Value.Name = xml.Value; break; case "datamatch": if (!Common.Types.ContainsKey(size)) { break; } var tmpid2 = xml["id"]; if (string.IsNullOrEmpty(tmpid2)) { break; } if (!Common.Types[size].DataMatchList.Value.ContainsKey(tmpid2)) { break; } var tmpmatch = new Common.DataMatch(); if (!int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out tmpmatch.Offset)) { break; } if (!int.TryParse(xml["length"], NumberStyles.HexNumber, null, out tmpmatch.Length)) { break; } if (!int.TryParse(xml["seqrep"], NumberStyles.HexNumber, null, out tmpmatch.SequenceRepetitions)) { tmpmatch.SequenceRepetitions = 0; } tmpmatch.DisableDisplay = !string.IsNullOrEmpty(xml["nodisp"]) && xml["nodisp"].Equals("true", StringComparison.CurrentCultureIgnoreCase); xml.Read(); if (string.IsNullOrEmpty(xml.Value)) { break; } tmpmatch.Name = xml.Value; Common.Types[size].DataMatchList.Value[tmpid2].Value.Data.Add(tmpmatch); break; #endregion #region Datafill Entry case "datafill": if (!Common.Types.ContainsKey(size)) { break; } var datafill = new Common.DataFillEntry { Name = xml["name"] }; int.TryParse(xml["offset"], NumberStyles.HexNumber, null, out datafill.Offset); int.TryParse(xml["size"], NumberStyles.HexNumber, null, out datafill.Length); int.TryParse(xml["sizefrom"], NumberStyles.HexNumber, null, out datafill.Sizefrom); int.TryParse(xml["ldrsize"], NumberStyles.HexNumber, null, out datafill.LdrSize); int.TryParse(xml["regionsize"], NumberStyles.HexNumber, null, out datafill.RegionSize); int.TryParse(xml["regionstart"], NumberStyles.HexNumber, null, out datafill.RegionStart); int.TryParse(xml["vtrmentrycount_offset"], NumberStyles.HexNumber, null, out datafill.vtrmentrycount_offset); xml.Read(); if (!byte.TryParse(xml.Value, NumberStyles.HexNumber, null, out datafill.Data)) { break; } Common.Types[size].DataFillEntries.Value.Add(datafill); break; #endregion #region ROS#Offset case "ros0offset": if (!Common.Types.ContainsKey(size)) { break; } xml.Read(); if (!int.TryParse(xml.Value, NumberStyles.HexNumber, null, out Common.Types[size].ROS0Offset)) { Common.Types[size].ROS0Offset = -1; } break; case "ros1offset": if (!Common.Types.ContainsKey(size)) { break; } xml.Read(); if (!int.TryParse(xml.Value, NumberStyles.HexNumber, null, out Common.Types[size].ROS1Offset)) { Common.Types[size].ROS1Offset = -1; } break; #endregion } } } Common.SendStatus("Parsing done!"); checkbtn.Enabled = true; }
private void ParseConfig(string file) { Common.SendStatus(string.Format("Parsing {0}", file)); Common.Types.Clear(); using (var xml = XmlReader.Create(file)) { var dataCheckKey = 0; var dataCheckOk = false; var skUkey = 0; long size = 0; var skuWarn = false; var skuName = ""; var skuWarnMsg = ""; var skuMinVer = ""; while (xml.Read()) { if (!xml.IsStartElement()) { continue; } switch (xml.Name.ToLower()) { case "type": if (long.TryParse(xml["size"], out size)) { if (!Common.Types.ContainsKey(size)) { Common.Types.Add(size, new Common.TypeData(true)); } Common.Types[size].Name.Value = xml["name"]; } break; #region Statistics part case "stats": if (Common.Types.ContainsKey(size)) { xml.Read(); } Common.Types[size].StatDescription.Value = xml.Value; break; case "statspart": if (!Common.Types.ContainsKey(size)) { break; } var key = xml["key"]; if (key == null) { break; } if (string.IsNullOrEmpty(key)) { key = "*"; } key = key.ToUpper(); if (!Common.Types[size].Statlist.Value.ContainsKey(key)) { double low; double high; var lowtxt = xml["low"]; if (lowtxt != null) { lowtxt = Regex.Replace(lowtxt, @"\s+", ""); lowtxt = lowtxt.Replace('.', ','); } var hightxt = xml["high"]; if (hightxt != null) { hightxt = Regex.Replace(hightxt, @"\s+", ""); hightxt = hightxt.Replace('.', ','); } if (!double.TryParse(lowtxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out low)) { low = 0; } else if (low < 0 || low > 100) { low = 0; } if (!double.TryParse(hightxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out high)) { high = 100; } else if (high > 100 || low > high || high < 0) { high = 100; } Common.Types[size].Statlist.Value.Add(key, new Holder <Common.StatCheck>(new Common.StatCheck(low, high))); } break; #endregion Statistics part #region Binary Check Entry case "binentry": if (!Common.Types.ContainsKey(size)) { break; } key = xml["name"]; if (String.IsNullOrEmpty(key)) { break; } if (!Common.Types[size].Bincheck.Value.ContainsKey(key)) { if (xml["ismulti"] != null && xml["ismulti"].Equals("true", StringComparison. CurrentCultureIgnoreCase)) { Common.Types[size].Bincheck.Value.Add(key, new Holder <Common.BinCheck>( new Common. BinCheck( new List < Common. MultiBin>(), true, xml["offset"], xml[ "description" ], xml["ascii"]))); var id = xml["id"]; xml.Read(); Common.Types[size].Bincheck.Value[key].Value.ExpectedList. Value.Add( new Common.MultiBin( Regex.Replace(xml.Value, @"\s+", ""), id)); } else { var offset = xml["offset"]; var description = xml["description"]; var ascii = xml["ascii"]; xml.Read(); Common.Types[size].Bincheck.Value.Add(key, new Holder <Common.BinCheck>( new Common. BinCheck( null, false, offset, description, ascii, xml.Value))); } } if (xml["ismulti"] != null && xml["ismulti"].Equals("true", StringComparison.CurrentCultureIgnoreCase)) { var id = xml["id"]; xml.Read(); Common.Types[size].Bincheck.Value[key].Value.ExpectedList.Value. Add(new Common.MultiBin( Regex.Replace(xml.Value, @"\s+", ""), id)); } break; #endregion Binary Check Entry #region Data Check list case "datalist": if (!Common.Types.ContainsKey(size)) { break; } var dataCheckList = new Common.DataCheck { Name = xml["name"], ThresholdList = new Dictionary <string, double>() }; if (long.TryParse(xml["offset"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.Offset)) { dataCheckOk = long.TryParse(xml["size"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.Size); if (!dataCheckOk) { dataCheckOk = long.TryParse(xml["ldrsize"], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out dataCheckList.LdrSize); } if (dataCheckOk) { dataCheckKey++; dataCheckList.DataKey = dataCheckKey; Common.Types[size].DataCheckList.Value.Add(dataCheckList); } } break; #region Data treshold case "datatreshold": if (!Common.Types.ContainsKey(size)) { break; } if (!dataCheckOk) { break; } foreach (var entry in Common.Types[size].DataCheckList.Value) { if (entry.DataKey != dataCheckKey) { continue; } var dkey = xml["key"]; if (dkey == null) { break; } if (string.IsNullOrEmpty(dkey)) { dkey = "*"; } dkey = dkey.ToUpper(); xml.Read(); var tmptxt = xml.Value; if (tmptxt != null) { tmptxt = Regex.Replace(tmptxt, @"\s+", ""); tmptxt = tmptxt.Replace('.', ','); } double tmpval; if (!double.TryParse(tmptxt, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out tmpval)) { tmpval = 49; } else if (tmpval < 0 || tmpval > 100) { tmpval = 49; } entry.ThresholdList.Add(dkey, tmpval); break; } break; #endregion Data treshold #endregion Data Check List #region SKU Data List case "skudataentry": if (!Common.Types.ContainsKey(size)) { break; } var skuDataEntry = new Common.SKUDataEntry(); var skuoffset = xml["offset"]; var isok = (uint.TryParse(skuoffset, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out skuDataEntry.Offset)); if (isok) { var skusize = xml["size"]; isok = (uint.TryParse(skusize, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out skuDataEntry.Size)); } xml.Read(); skuDataEntry.Type = xml.Value; if (isok) { Common.Types[size].SKUDataList.Value.Add(skuDataEntry); } break; #endregion SKU Data List #region SKU List case "skulist": if (!Common.Types.ContainsKey(size)) { break; } skUkey++; skuWarn = (xml["warn"].Equals("true", StringComparison.CurrentCultureIgnoreCase)); skuName = xml["name"]; skuWarnMsg = xml["warnmsg"]; skuMinVer = xml["minver"]; break; case "skuentry": if (!Common.Types.ContainsKey(size)) { break; } var exists = false; foreach (var entry in Common.Types[size].SKUList.Value) { if (entry.SKUKey != skUkey) { continue; } exists = true; break; } var skuEntry = new Common.SKUEntry(); if (!exists) { skuEntry.Warn = skuWarn; skuEntry.WarnMsg = skuWarnMsg; } skuEntry.SKUKey = skUkey; skuEntry.Name = skuName; skuEntry.Type = xml["type"]; skuEntry.MinVer = skuMinVer; xml.Read(); skuEntry.Data = Regex.Replace(xml.Value, @"\s+", ""); Common.Types[size].SKUList.Value.Add(skuEntry); break; #endregion SKU List } } } Common.SendStatus("Parsing done!"); checkbtn.Enabled = true; }
private void LoadHashList(string filename) { Common.SendStatus(string.Format("Parsing {0}", filename)); _hashlist.Clear(); Offsets.Clear(); var type = ""; using (var xml = XmlReader.Create(filename)) { while (xml.Read()) { if (!xml.IsStartElement()) { continue; } switch (xml.Name.ToLower()) { case "offset": var fsize = xml["fsize"]; HashListObject tmp; if (fsize != null) { var size = long.Parse(fsize); if (!Offsets.ContainsKey(size)) { Offsets.Add(size, new Holder <List <HashListObject> >(new List <HashListObject>())); } tmp = new HashListObject { Name = xml["name"], Type = xml["type"] }; fsize = xml["size"]; if (fsize == null) { throw new InvalidOperationException("size doesn't exist"); } tmp.Size = int.Parse(fsize, NumberStyles.AllowHexSpecifier); xml.Read(); fsize = xml.Value; if (fsize == null) { throw new InvalidOperationException("no offset"); } tmp.Offset = int.Parse(fsize, NumberStyles.AllowHexSpecifier); Offsets[size].Value.Add(tmp); } break; case "type": type = xml["name"]; if (type != null && !_hashlist.ContainsKey(type)) { _hashlist.Add(type, new Holder <Dictionary <string, HashListObject> >(new Dictionary <string, HashListObject>())); } break; case "hash": if (string.IsNullOrEmpty(type)) { throw new InvalidOperationException("No type specified..."); } tmp = new HashListObject { Name = xml["name"], Type = xml["type"], ROSVersion = xml["rosver"], Patched = !string.IsNullOrEmpty(xml["patched"]) && xml["patched"].Equals("true", StringComparison.CurrentCultureIgnoreCase) }; //fsize = xml["size"]; //long.TryParse(fsize, NumberStyles.AllowHexSpecifier, null, out tmp.Size); xml.Read(); _hashlist[type].Value.Add(xml.Value.ToUpper().Trim(), tmp); break; } } } Common.SendStatus("Parsing done!"); }
public static Common.ImgInfo StartCheck(string file, ref Stopwatch sw) { _checkID = 0; var fi = new FileInfo(file); var checkckount = 0; var ret = new Common.ImgInfo(); var checkdata = Common.Types[fi.Length]; var data = new byte[fi.Length]; #region Statistics check if (checkdata.Statlist.Value.Count > 0) { Logger.WriteLine("Statistics check started..."); checkckount++; if (!CheckStatisticsList(GetStatisticsAndFillData(fi, ref data), data.Length)) { Common.AddBad(ref ret); } Common.SendStatus("Statistics check Done!"); } else { Common.SendStatus("Skipping Statistics check (nothing to check) Instead: Reading image into memory..."); data = File.ReadAllBytes(fi.FullName); Logger.WriteLine(string.Format("{0,-50} (nothing to check)", "Statistics check skipped!")); } #endregion Statistics check #region Binary check if (checkdata.Bincheck.Value.Count > 0) { Logger.WriteLine("Binary check Started!"); foreach (var key in checkdata.Bincheck.Value.Keys) { checkckount++; Common.SendStatus(string.Format("Parsing Image... Checking Binary for: {0}", key)); var bintmp = string.Format("Binary check for {0} Started...", key); Logger.Write(string.Format("{0,-50} Result: ", bintmp)); if (!checkdata.Bincheck.Value[key].Value.IsMulti) { if (!CheckBinPart(ref data, key, ref ret.Reversed)) { Common.AddBad(ref ret); } } else if (!CheckBinPart(ref data, key)) { Common.AddBad(ref ret); } GC.Collect(); } } else { Logger.WriteLine(string.Format("{0,-50} (nothing to check)", "Binary check skipped!")); } Common.SendStatus("Binary check(s) Done!"); #endregion Binary check #region Data check if (checkdata.DataCheckList.Value.Count > 0) { Logger.WriteLine("Data check Started!"); foreach (var key in checkdata.DataCheckList.Value) { checkckount++; Common.SendStatus(string.Format("Parsing Image... Checking Data Statistics for: {0}", key)); var datatmp = string.Format("Data check for {0} Started...", key); Logger.Write(string.Format("{0,-50} Result: ", datatmp)); if (!CheckDataPart(ref data, key, ret.Reversed)) { Common.AddBad(ref ret); } GC.Collect(); } } else { Logger.WriteLine(string.Format("{0,-50} (nothing to check)", "Data check skipped!")); } Common.SendStatus("Data check(s) Done!"); #endregion Data check #region SKU List check if (checkdata.SKUList.Value.Count > 0) { Logger.WriteLine("SKU List check Started!"); Common.SendStatus("Checking SKU List..."); var skuCheckDataList = GetSKUCheckData(ret.Reversed, ref data, ref checkdata); var skuEntryList = new List <Common.SKUEntry>(checkdata.SKUList.Value); foreach (var entry in skuCheckDataList) { if (skuEntryList.Count < skuCheckDataList.Count) { break; } var tmplist = GetFilterList(skuEntryList, entry); var tmplist2 = new List <Common.SKUEntry>(skuEntryList); skuEntryList.Clear(); foreach (var skuEntry in tmplist2) { foreach (var tmpentry in tmplist) { if (skuEntry.SKUKey == tmpentry.SKUKey) { skuEntryList.Add(skuEntry); } } } } var datamsg = ""; foreach (var entry in skuCheckDataList) { datamsg += entry.Type.Equals("bootldrsize", StringComparison.CurrentCultureIgnoreCase) ? string.Format("{0} = {1:X4}{2}", entry.Type, entry.Size, Environment.NewLine) : string.Format("{0} = {1}{2}", entry.Type, entry.Data, Environment.NewLine); } if (skuEntryList.Count == skuCheckDataList.Count) { ret.SKUModel = skuEntryList[0].Name; ret.MinVer = skuEntryList[0].MinVer; Logger.WriteLine(string.Format("SKU Model: {0}", ret.SKUModel)); var msg = ""; if (skuEntryList[0].Warn) { foreach (var entry in skuEntryList) { if (string.IsNullOrEmpty(entry.WarnMsg)) { continue; } msg = entry.WarnMsg; break; } MessageBox.Show(msg, Resources.WARNING, MessageBoxButtons.OK, MessageBoxIcon.Warning); Logger.WriteLine(msg); datamsg += string.Format("{0}{1}", Environment.NewLine, msg); } } else { Common.AddBad(ref ret); ret.SKUModel = null; ret.MinVer = null; Logger.WriteLine("No matching SKU model found!"); foreach (var entry in skuCheckDataList) { Logger.WriteLine(entry.Type.Equals("bootldrsize", StringComparison.CurrentCultureIgnoreCase) ? string.Format("{0} = {1:X4}", entry.Type, entry.Size) : string.Format("{0} = {1}", entry.Type, entry.Data)); } } AddItem(new Common.PartsObject { Name = "SKUIdentity Data", ActualString = datamsg.Trim(), ExpectedString = "", Result = (skuEntryList.Count == skuCheckDataList.Count), }); } else { Logger.WriteLine(string.Format("{0,-50} (nothing to check)", "SKU List check skipped!")); } #endregion SKU List check #region Final Output Common.SendStatus(string.Format("All checks ({3} Checks) have been completed after {0} Minutes {1} Seconds and {2} Milliseconds", sw.Elapsed.Minutes, sw.Elapsed.Seconds, sw.Elapsed.Milliseconds, checkckount)); Logger.WriteLine(string.Format("All checks ({3} Checks) have been completed after {0} Minutes {1} Seconds and {2} Milliseconds", sw.Elapsed.Minutes, sw.Elapsed.Seconds, sw.Elapsed.Milliseconds, checkckount)); ret.IsOk = ret.BadCount == 0; ret.Status = ret.IsOk ? "Dump has been validated!" : "Dump is bad!"; if (!ret.IsOk) { MessageBox.Show(string.Format("ERROR: Your dump failed on {0} of {1} Checks\nPlease check the log for more information!", ret.BadCount, checkckount), Resources.Checks_StartCheck_ERROR___Bad_dump, MessageBoxButtons.OK, MessageBoxIcon.Error); } var tmp = ret.IsOk ? "Pass!" : "Failed!"; var outtmp = ret.IsOk ? string.Format("Tests done: {0}", checkckount) : string.Format("Bad count: {0} of {1} Tests", ret.BadCount, checkckount); Logger.WriteLine2(string.Format("{0,-50} Check result: {1}", outtmp, tmp)); sw.Stop(); #endregion Final Output return(ret); }