add psx db generation

This commit is contained in:
zeromus 2015-07-11 11:17:36 -05:00
parent 95deb6f3f9
commit 66eba89a94
5 changed files with 7151 additions and 134 deletions

View File

@ -35,6 +35,7 @@
<DefineConstants>TRACE;WINDOWS</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<ItemGroup>
<Reference Include="CSharp-SQLite">
@ -46,6 +47,8 @@
<Reference Include="System.Drawing" />
<Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.XML" />
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Compile Include="DB.cs" />
@ -59,6 +62,7 @@
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="DiscHash.cs" />
<Compile Include="PsxDBJob.cs" />
<Compile Include="RomHasher.cs" />
<EmbeddedResource Include="DBMan_MainForm.resx">
<DependentUpon>DBMan_MainForm.cs</DependentUpon>

File diff suppressed because it is too large Load Diff

View File

@ -12,14 +12,6 @@ namespace BizHawk.Client.DBMan
{
class DiscHash
{
Job job;
public void Run(string[] args)
{
using (job = new Job())
{
MyRun(args);
}
}
static List<string> FindExtensionsRecurse(string dir, string extUppercaseWithDot)
{
@ -48,13 +40,14 @@ namespace BizHawk.Client.DBMan
return ret;
}
void MyRun(string[] args)
public void Run(string[] args)
{
string indir = null;
string dpTemp = null;
string fpOutfile = null;
for(int i=0;;)
for (int i = 0; ; )
{
if (i == args.Length) break;
var arg = args[i++];
@ -66,7 +59,7 @@ namespace BizHawk.Client.DBMan
fpOutfile = args[i++];
}
using(var outf = new StreamWriter(fpOutfile))
using (var outf = new StreamWriter(fpOutfile))
{
Dictionary<uint, string> FoundHashes = new Dictionary<uint, string>();
@ -118,127 +111,4 @@ namespace BizHawk.Client.DBMan
} //MyRun()
} //class PsxRedump
public enum JobObjectInfoType
{
AssociateCompletionPortInformation = 7,
BasicLimitInformation = 2,
BasicUIRestrictions = 4,
EndOfJobTimeInformation = 6,
ExtendedLimitInformation = 9,
SecurityLimitInformation = 5,
GroupInformation = 11
}
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
public int nLength;
public IntPtr lpSecurityDescriptor;
public int bInheritHandle;
}
[StructLayout(LayoutKind.Sequential)]
struct JOBOBJECT_BASIC_LIMIT_INFORMATION
{
public Int64 PerProcessUserTimeLimit;
public Int64 PerJobUserTimeLimit;
public Int16 LimitFlags;
public UInt32 MinimumWorkingSetSize;
public UInt32 MaximumWorkingSetSize;
public Int16 ActiveProcessLimit;
public Int64 Affinity;
public Int16 PriorityClass;
public Int16 SchedulingClass;
}
[StructLayout(LayoutKind.Sequential)]
struct IO_COUNTERS
{
public UInt64 ReadOperationCount;
public UInt64 WriteOperationCount;
public UInt64 OtherOperationCount;
public UInt64 ReadTransferCount;
public UInt64 WriteTransferCount;
public UInt64 OtherTransferCount;
}
[StructLayout(LayoutKind.Sequential)]
struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION
{
public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
public IO_COUNTERS IoInfo;
public UInt32 ProcessMemoryLimit;
public UInt32 JobMemoryLimit;
public UInt32 PeakProcessMemoryUsed;
public UInt32 PeakJobMemoryUsed;
}
public class Job : IDisposable
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
static extern IntPtr CreateJobObject(object a, string lpName);
[DllImport("kernel32.dll")]
static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, uint cbJobObjectInfoLength);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process);
private IntPtr m_handle;
private bool m_disposed = false;
public Job()
{
m_handle = CreateJobObject(null, null);
JOBOBJECT_BASIC_LIMIT_INFORMATION info = new JOBOBJECT_BASIC_LIMIT_INFORMATION();
info.LimitFlags = 0x2000;
JOBOBJECT_EXTENDED_LIMIT_INFORMATION extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION();
extendedInfo.BasicLimitInformation = info;
int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION));
IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
if (!SetInformationJobObject(m_handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length))
throw new Exception(string.Format("Unable to set information. Error: {0}", Marshal.GetLastWin32Error()));
}
#region IDisposable Members
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
private void Dispose(bool disposing)
{
if (m_disposed)
return;
if (disposing) { }
Close();
m_disposed = true;
}
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle(IntPtr hObject);
public void Close()
{
CloseHandle(m_handle);
m_handle = IntPtr.Zero;
}
public bool AddProcess(IntPtr handle)
{
return AssignProcessToJobObject(m_handle, handle);
}
}
}

View File

@ -111,6 +111,11 @@ namespace BizHawk.Client.DBMan
new DiscHash().Run(args.Skip(1).ToArray());
return;
}
if (args.Length > 0 && args[0] == "--psxdb")
{
new PsxDBJob().Run(args.Skip(1).ToArray());
return;
}
//if (args.Length > 0 && args[0] == "--disccmp")
//{
// new DiscCmp().Run(args.Skip(1).ToArray());

View File

@ -0,0 +1,127 @@
using System;
using System.Globalization;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BizHawk.Common;
using BizHawk.Emulation.DiscSystem;
namespace BizHawk.Client.DBMan
{
class PsxDBJob
{
class HashRecord
{
public string name, bizhash, datahash;
public bool matched;
}
public void Run(string[] args)
{
string fpHash = null, fpRedump = null, fpOutfile = null;
for (int i = 0; ; )
{
if (i == args.Length) break;
var arg = args[i++];
if (arg == "--hashes")
fpHash = args[i++];
if (arg == "--redump")
fpRedump = args[i++];
if (arg == "--outfile")
fpOutfile = args[i++];
}
var hashes = new Dictionary<string, HashRecord>();
Console.WriteLine("Loading redump data");
RedumpPSX rdpsx = new RedumpPSX();
rdpsx.Load(fpRedump);
Console.WriteLine("Loading hash data");
var splitSlashes = new string[]{"//"};
foreach (var line in File.ReadAllLines(fpHash))
{
var parts = line.Split(splitSlashes, StringSplitOptions.None);
var hr = new HashRecord()
{
name = parts[1],
bizhash = parts[0].Substring(8, 8),
datahash = parts[0].Substring(26, 8),
};
hashes[hr.datahash] = hr;
}
Console.WriteLine("merging");
foreach (var rr in rdpsx.Records)
{
HashRecord hr;
if (!hashes.TryGetValue(rr.crc, out hr))
continue;
hr.matched = true;
//correct name to redump current
hr.name = rr.name;
}
Console.WriteLine("writing results");
using (var outf = new StreamWriter(fpOutfile))
{
foreach (var hr in hashes.Values)
{
if (!hr.matched)
continue;
outf.WriteLine("{0}\tG\t{1}\tPSX\t\tdh={2}", hr.bizhash, hr.name, hr.datahash);
}
}
}
}
class RedumpPSX
{
public class RedumpRecord
{
public string name;
public string crc;
}
public List<RedumpRecord> Records = new List<RedumpRecord>();
public void Load(string datpath)
{
var xd = XDocument.Load(datpath);
Dictionary<uint, string> knownHashes = new Dictionary<uint, string>();
var games = xd.Root.Descendants("game").ToArray();
for(int i=0;i<games.Length;i++)
{
var game = games[i];
if (i % 100 == 0)
Console.WriteLine("{0}/{1}", i, games.Length);
var name = game.Attribute("name").Value;
BizHawk.Emulation.DiscSystem.DiscHasher.SpecialCRC32 spec_crc_calc = new Emulation.DiscSystem.DiscHasher.SpecialCRC32();
spec_crc_calc.Current = 0;
foreach (var rom in game.Elements("rom"))
{
var ext = Path.GetExtension(rom.Attribute("name").Value).ToLower();
if (ext == ".cue") continue;
uint onecrc = uint.Parse(rom.Attribute("crc").Value, NumberStyles.HexNumber);
int size = int.Parse(rom.Attribute("size").Value);
spec_crc_calc.Incorporate(onecrc, size);
}
//Console.WriteLine("{0:X8}", spec_crc_calc.Current);
Records.Add(new RedumpRecord()
{
name = name,
crc = spec_crc_calc.Current.ToString("X8")
});
}
}
}
}