Segment out protection checks a bit more

This commit is contained in:
Matt Nadareski
2021-09-29 12:17:34 -07:00
parent 9643442281
commit f28cfe3d69
6 changed files with 50 additions and 42 deletions

View File

@@ -328,7 +328,6 @@ namespace MPF.Aaru
info.CommonDiscInfo.EXEDateBuildDate = playstationDate;
}
info.CopyProtection.AntiModchip = GetPlayStationAntiModchipDetected(drive?.Letter) ? YesNo.Yes : YesNo.No;
break;
case RedumpSystem.SonyPlayStation2:

View File

@@ -107,7 +107,6 @@ namespace MPF.DD
info.CommonDiscInfo.EXEDateBuildDate = playstationDate;
}
info.CopyProtection.AntiModchip = GetPlayStationAntiModchipDetected(drive?.Letter) ? YesNo.Yes : YesNo.No;
break;
case RedumpSystem.SonyPlayStation2:

View File

@@ -6,8 +6,6 @@ using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using BurnOutSharp.ProtectionType;
using MPF.Core;
using MPF.Core.Data;
using MPF.Core.Hashing;
using MPF.Core.Utilities;
@@ -1160,42 +1158,6 @@ namespace MPF.Data
}
}
/// <summary>
/// Get the existance of an anti-modchip string from a PlayStation disc, if possible
/// </summary>
/// <param name="driveLetter">Drive letter to use to check</param>
/// <returns>Anti-modchip existance if possible, false on error</returns>
protected static bool GetPlayStationAntiModchipDetected(char? driveLetter)
{
// If there's no drive letter, we can't do this part
if (driveLetter == null)
return false;
// If the folder no longer exists, we can't do this part
string drivePath = driveLetter + ":\\";
if (!Directory.Exists(drivePath))
return false;
// Scan through each file to check for the anti-modchip strings
var antiModchip = new PSXAntiModchip();
foreach (string path in Directory.EnumerateFiles(drivePath, "*", SearchOption.AllDirectories))
{
try
{
byte[] fileContent = File.ReadAllBytes(path);
string protection = antiModchip.CheckContents(path, fileContent, false, null, null);
if (!string.IsNullOrWhiteSpace(protection))
return true;
}
catch
{
// No-op, we don't care what the error was
}
}
return false;
}
/// <summary>
/// Get the EXE date from a PlayStation disc, if possible
/// </summary>

View File

@@ -12,6 +12,7 @@ using BurnOutSharp;
using MPF.Core.Converters;
using MPF.Core.Data;
using MPF.Core.Utilities;
using MPF.Utilities;
using Newtonsoft.Json;
using RedumpLib.Data;
using RedumpLib.Web;
@@ -936,6 +937,12 @@ namespace MPF.Data
info.CommonDiscInfo.EXEDateBuildDate = (Options.AddPlaceholders ? Template.RequiredValue : "");
break;
case RedumpSystem.SonyPlayStation:
resultProgress?.Report(Result.Success("Checking for anti-modchip strings... this might take a while!"));
info.CopyProtection.AntiModchip = await GetPlayStationAntiModchipDetected(protectionProgress) ? YesNo.Yes : YesNo.No;
resultProgress?.Report(Result.Success("Anti-modchip string scan complete!"));
break;
case RedumpSystem.SonyPlayStation2:
info.CommonDiscInfo.LanguageSelection = new LanguageSelection?[] { LanguageSelection.BiosSettings, LanguageSelection.LanguageSelector, LanguageSelection.OptionsMenu };
break;
@@ -1374,7 +1381,7 @@ namespace MPF.Data
{
if (Options.ScanForProtection)
{
(bool success, string output) = await Validators.RunProtectionScanOnPath($"{Drive.Letter}:\\", this.Options, progress);
(bool success, string output) = await Protection.RunProtectionScanOnPath($"{Drive.Letter}:\\", this.Options, progress);
if (success)
return output;
else
@@ -1384,6 +1391,16 @@ namespace MPF.Data
return "(CHECK WITH PROTECTIONID)";
}
/// <summary>
/// Get the existance of an anti-modchip string from a PlayStation disc, if possible
/// </summary>
/// <param name="path">Path to scan for anti-modchip strings</param>
/// <returns>Anti-modchip existance if possible, false on error</returns>
private async Task<bool> GetPlayStationAntiModchipDetected(IProgress<ProtectionProgress> progress = null)
{
return await Protection.GetPlayStationAntiModchipDetected($"{Drive.Letter}:\\", progress);
}
/// <summary>
/// Get the split values for ISO-based media
/// </summary>

View File

@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using BurnOutSharp;
using BurnOutSharp.ProtectionType;
using MPF.Core.Data;
namespace MPF.Utilities
@@ -53,6 +55,35 @@ namespace MPF.Utilities
}
}
/// <summary>
/// Get the existance of an anti-modchip string from a PlayStation disc, if possible
/// </summary>
/// <param name="path">Path to scan for anti-modchip strings</param>
/// <returns>Anti-modchip existance if possible, false on error</returns>
public static async Task<bool> GetPlayStationAntiModchipDetected(string path, IProgress<ProtectionProgress> progress = null)
{
return await Task.Run(() =>
{
var antiModchip = new PSXAntiModchip();
foreach (string file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories))
{
try
{
byte[] fileContent = File.ReadAllBytes(file);
string protection = antiModchip.CheckContents(file, fileContent, false, null, null);
if (!string.IsNullOrWhiteSpace(protection))
return true;
}
catch
{
// No-op, we don't care what the error was
}
}
return false;
});
}
/// <summary>
/// Sanitize unnecessary protection duplication from output
/// </summary>

View File

@@ -914,7 +914,7 @@ namespace MPF.GUI.ViewModels
var progress = new Progress<ProtectionProgress>();
progress.ProgressChanged += ProgressUpdated;
(bool success, string output) = await Validators.RunProtectionScanOnPath(drive.Letter + ":\\", App.Options, progress);
(bool success, string output) = await Protection.RunProtectionScanOnPath(drive.Letter + ":\\", App.Options, progress);
// If SmartE is detected on the current disc, remove `/sf` from the flags for DIC only
if (Env.Options.InternalProgram == InternalProgram.DiscImageCreator && output.Contains("SmartE"))