コード例 #1
0
        private void btnDouble_Click(object sender, EventArgs e)
        {
            if (TwoFileView)
            {
                if (SecondaryRom != null)
                {
                    const string message = "The second ROM will be unloaded.";
                    const string title   = "Remove second ROM";

                    if (MessageBox.Show(message, title, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
                    {
                        SecondaryRom         = null;
                        SecondaryRomFilename = SecondaryRomPath = null;
                        UpdateRomDisplay(false);
                        TwoFileView = false;
                    }
                }
                else
                {
                    TwoFileView = false;
                }
            }
            else
            {
                TwoFileView = true;
            }

            //btnDoubleROM.Checked = TwoFileView;
        }
コード例 #2
0
ファイル: Platforms.cs プロジェクト: snarfblam/ROM-Hasher
        /// <summary>
        /// Adds standard ROM details
        /// </summary>
        /// <param name="builder">Data builder</param>
        /// <param name="rom">ROM image</param>
        /// <param name="data">ROM information</param>
        private void AddStandardData(RomExDataBuilder builder, byte[] rom, RomData data)
        {
            const string general = RomExDataBuilder.GeneralCat;

            builder.AddData(general, "Platform", data.Platform.ID.GetDescription());
            builder.AddData(general, "ROM format", data.FormatName);
            if (data.ExternalHeader != null)
            {
                builder.AddData(general, "External Header", data.ExternalHeader.Value ? "Yes" : "No");
            }
            builder.AddData(general, "File Size", data.FileSize.ToString() + " (" + data.FileSize.ToString("x") + ")");
            builder.AddData(general, "ROM Size", data.RomSize.ToString() + " (" + data.RomSize.ToString("x") + ")");

            // ROM hashes
            var crc32 = data.GetHash(HashFlags.RomHash | HashFlags.CRC32);
            var sha1  = data.GetHash(HashFlags.RomHash | HashFlags.SHA1);

            if (crc32 != null)
            {
                builder.AddData(general, RomHash.GetHashName(HashFlags.RomHash | HashFlags.CRC32), Hex.FormatHex(crc32.Value));
            }
            if (sha1 != null)
            {
                builder.AddData(general, RomHash.GetHashName(HashFlags.RomHash | HashFlags.SHA1), Hex.FormatHex(sha1.Value));
            }

            // File hashes as a last resort when ROM hashes aren't present
            if (crc32 == null)
            {
                crc32 = data.GetHash(HashFlags.FileHash | HashFlags.CRC32);
                if (crc32 != null)
                {
                    builder.AddData(general, RomHash.GetHashName(HashFlags.FileHash | HashFlags.CRC32), Hex.FormatHex(crc32.Value));
                }
            }
            if (sha1 == null)
            {
                sha1 = data.GetHash(HashFlags.FileHash | HashFlags.SHA1);
                if (sha1 != null)
                {
                    builder.AddData(general, RomHash.GetHashName(HashFlags.FileHash | HashFlags.SHA1), Hex.FormatHex(sha1.Value));
                }
            }

            for (int i = 0; i < data.DatabaseMatches.Count; i++)
            {
                var match = data.DatabaseMatches[i];
                builder.AddData(general, match.Database.Name + " entry", match.Entry.name);
            }

            for (int i = 0; i < data.Hashes.Count; i++)
            {
                builder.AddData(
                    RomExDataBuilder.HashesCat,
                    RomHash.GetHashName(data.Hashes[i].Type),
                    Hex.FormatHex(data.Hashes[i].Value));
            }
        }
コード例 #3
0
        private static void AddDbMatches(RomData data, List <DBMatch> matches, RomDB db)
        {
            var dbmatches = db.FindMatches(data.Hashes);

            for (int i = 0; i < dbmatches.Count; i++)
            {
                matches.Add(new DBMatch(db, dbmatches[i]));
            }
        }
コード例 #4
0
ファイル: Platforms.cs プロジェクト: snarfblam/ROM-Hasher
        /// <summary>
        /// Gets extended information for a ROM and associated RomData object.
        /// </summary>
        /// <param name="rom">A ROM file</param>
        /// <param name="data">A RomData object with Platform and Hashes properties initialized.</param>
        /// <returns></returns>
        public IList <RomDataCategory> GetExtendedInfo(byte[] rom, RomData data)
        {
            var result = new RomExDataBuilder();

            AddStandardData(result, rom, data);
            AddPlatformExtendedData(result, rom, data);

            return(result);
        }
コード例 #5
0
ファイル: Platform_N64.cs プロジェクト: snarfblam/ROM-Hasher
            /// <summary>
            /// Identifies whether the specified RomData object has been marked as byte-swapped
            /// </summary>
            /// <param name="data">RomData object to examine</param>
            /// <returns>True if the RomData object has tag indicating it is byte-swapped</returns>
            public static N64ByteSwap IsByteswapped(RomData data)
            {
                object value;

                data.MiscData.TryGetValue(ByteswapTagID, out value);
                if (value is N64ByteSwap)
                {
                    return((N64ByteSwap)value);
                }
                return(N64ByteSwap.Unknown);
            }
コード例 #6
0
            internal override void InitRomData(RomData data, byte[] rom)
            {
                base.InitRomData(data, rom);

                int romOffset = SNES.HasExternalHeader(rom) ? SNES.ExternalHeaderSize : 0;

                if (rom.Length - romOffset >= SnesHeader.MinimumRomSize)
                {
                    SnesHeader snesheader = new SnesHeader(rom, romOffset);
                    data.MiscData.Add(DataTags.DecodedHeader, snesheader);
                }
            }
コード例 #7
0
            internal override void InitRomData(RomData data, byte[] rom)
            {
                base.InitRomData(data, rom);

                bool eHeader, iHeader, interleaved, s32X;

                iHeader = Gen.HasInternalHeader(rom, out interleaved, out eHeader, out s32X);

                if (s32X)
                {
                    data.MiscData.Add(Tag_32x, Tag_32x);
                }
            }
コード例 #8
0
        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            // Do stuff!

            Hashes = _Hashes.AsReadOnly();

            var rom = File.ReadAllBytes(RomPath);

            if (rom.Length > Program.Config.FileSizeForImmediateBusyWindow)
            {
                immediateBusyForm = true;
                UpdateBusyDisplay();
            }

            Platform platform     = null;
            string   miscPlatform = null;

            if (PromptForPlatform)
            {
                RomData.GetRomPlatform(rom, Path.GetExtension(RomPath).TrimStart('.'), "Select a platform.", "Select Platform", out platform, out miscPlatform);
            }
            else
            {
                RomData.GetRomPlatform(rom, Path.GetExtension(RomPath).TrimStart('.'), out platform, out miscPlatform);
            }

            bool userCancelledDialog = (platform == null); // See RomData.GetRomPlatform documentation

            if (userCancelledDialog)
            {
                this.Platform = null;
                Result        = null;
            }
            else
            {
                this.Platform = platform;
                Result        = RomData.GetRomData(rom, platform, miscPlatform, !IsSecondaryROM, !IsSecondaryROM, this);
            }

            lock (StatusLock) {
                Working = false;
                if (Result == null)
                {
                    Aborted = true;
                }
                else
                {
                    Complete = true;
                }
            }
        }
コード例 #9
0
        /// <summary>
        /// Finds ROM database matches for a given RomData object, and populates the RomData object with those matches.
        /// </summary>
        /// <param name="data">A RomData object that has its hash list populated but not its db match list</param>
        private static void FindDbMatches(RomData data)
        {
            List <DBMatch> matches = new List <DBMatch>();



            if (data.Platform != null)
            {
                List <RomDB> processedDbs = new List <RomDB>();

                // Recognized systems
                foreach (var db in RomDB.GetDBs(data.Platform.ID))
                {
                    AddDbMatches(data, matches, db);

                    processedDbs.Add(db);
                }

                if (!string.IsNullOrEmpty(data.MiscPlatform))
                {
                    // Unrecognized system
                    foreach (var db in RomDB.GetAllDBs())
                    {
                        // Don't process same DB twice
                        bool platformMatch = false;

                        foreach (var platform in db.MiscPlatforms)
                        {
                            if (platform.Equals(data.MiscPlatform, StringComparison.OrdinalIgnoreCase))
                            {
                                platformMatch = true;
                            }
                        }

                        if (platformMatch)
                        {
                            AddDbMatches(data, matches, db);

                            processedDbs.Add(db);
                        }
                    }
                }
            }

            data.DatabaseMatches = matches.AsReadOnly();
        }
コード例 #10
0
        /// <summary>
        /// Attempts to find the specified hash and append it to the string builder for RHDN-specific output.
        /// </summary>
        /// <param name="hashtype">The hash type (i.e. CRC32/MD5/SHA1). File/ROM/PRG/CHR should NOT be specified.</param>
        /// <returns>True if ANYTHING was appended to the string builder.</returns>
        /// <param name="rom"></param>
        /// <param name="sb"></param>
        private static bool AddHashToSB(StringBuilder sb, RomData rom, HashFlags hashtype)
        {
            string hashname = RomHash.GetHashName(HashFlags.RomHash | hashtype);
            var    hash     = rom.GetHash(HashFlags.RomHash | hashtype);

            if (hash == null)
            {
                hashname = hashname = RomHash.GetHashName(HashFlags.FileHash | hashtype);;
                hash     = rom.GetHash(HashFlags.FileHash | hashtype);
            }

            if (hash == null)
            {
                return(false);
            }

            sb.AppendLine(hashname + ": " + Hex.FormatHex(hash.Value));
            return(true);
        }
コード例 #11
0
        void secondaryHasher_WorkComplete(object sender, EventArgs e)
        {
            var hj = ((HashJob)sender);

            hj.WorkComplete -= secondaryHasher_WorkComplete;
            hj.WorkAborted  -= secondaryHasher_Aborted;

            if (this.IsDisposed)
            {
                return;
            }

            if (hj.Complete)
            {
                SecondaryRom         = hj.Result;
                SecondaryRomPath     = pending_SecondaryRomPath;
                SecondaryRomFilename = pending_SecondaryRomFilename;

                UpdateRomDisplay(false);
            }

            ExitBusyMode();
        }
コード例 #12
0
ファイル: Platform_NDS.cs プロジェクト: snarfblam/ROM-Hasher
 protected override void AddPlatformExtendedData(Platform.RomExDataBuilder builder, byte[] rom, RomData data)
 {
     // Nope
 }
コード例 #13
0
ファイル: Platform_NDS.cs プロジェクト: snarfblam/ROM-Hasher
 internal override void InitRomData(RomData data, byte[] rom)
 {
     base.InitRomData(data, rom);
 }
コード例 #14
0
 internal bool Is32X(RomData data)
 {
     return(data.MiscData.ContainsKey(Tag_32x));
 }
コード例 #15
0
ファイル: Platform_N64.cs プロジェクト: snarfblam/ROM-Hasher
 protected override void AddPlatformExtendedData(Platform.RomExDataBuilder builder, byte[] rom, RomData data)
 {
     builder.AddData(RomExDataBuilder.GeneralCat, "Byte-swapped", N64.IsByteswapped(rom).GetDescription());
 }
コード例 #16
0
            protected override void AddPlatformExtendedData(RomExDataBuilder builder, byte[] rom, RomData data)
            {
                byte[] romImage;
                // If our previously de-interleaved ROM is still in memory, use that instead of re-de-interleaving
                if (BinRomImage == null)
                {
                    romImage = GetBinFormat(rom);
                }
                else
                {
                    romImage = BinRomImage.Target as byte[];
                    if (romImage == null)
                    {
                        romImage = GetBinFormat(rom);
                    }
                }

                bool interleaved, ext, s32x;
                bool InternalHeaderFound = Gen.HasInternalHeader(rom, out interleaved, out ext, out s32x);

                builder.AddData(RomExDataBuilder.GeneralCat, "32X", s32x.AsYesNo());
                builder.AddData(RomExDataBuilder.GeneralCat, "Internal Header Found", InternalHeaderFound.AsYesNo());
                builder.AddData(RomExDataBuilder.GeneralCat, "Interleaved", interleaved.AsYesNo());

                if (InternalHeaderFound)
                {
                    const string hdr    = RomExDataBuilder.HeaderCat;
                    GenHeader    header = new GenHeader(romImage);
                    builder.AddData(hdr, "Platform", header.Platform);
                    builder.AddData(hdr, "Name", header.GameName);
                    builder.AddData(hdr, "International Name", header.AltName);
                    builder.AddData(hdr, "Copyright", GetCopyrightString(header.Copyright));
                    builder.AddData(hdr, "Memo", header.Memo);
                    builder.AddData(hdr, "Modem", header.Modem);
                    builder.AddData(hdr, "Product Type/ID", header.ProductID);
                    builder.AddData(hdr, "Region", header.Region);
                    builder.AddData(hdr, "ROM range", header.RomStart.ToString("X8") + "-" + header.RomEnd.ToString("X8"));
                    builder.AddData(hdr, "RAM range", header.RamStart.ToString("X8") + "-" + header.RamEnd.ToString("X8"));
                    builder.AddData(hdr, "Checksum", header.Checksum.ToString("X4"));
                    builder.AddData(hdr, "IO Devices", GetIOString(header.IOSupport));
                }
            }
コード例 #17
0
ファイル: Platform_GB.cs プロジェクト: snarfblam/ROM-Hasher
            protected override void AddPlatformExtendedData(RomExDataBuilder builder, byte[] rom, RomData data)
            {
                if (rom.Length >= GbHeader.GbHeaderOffset + GbHeader.GbHeaderSize)
                {
                    var HeaderCat = RomExDataBuilder.HeaderCat;
                    var header    = new GbHeader(rom, GbHeader.GbHeaderOffset);

                    builder.AddData(RomExDataBuilder.GeneralCat, "ROM checksum", header.RomChecksum.ToString("X4"));
                    builder.AddData(RomExDataBuilder.GeneralCat, "Checksum valid", header.RomChecksumValid.AsYesNo());

                    builder.AddData(HeaderCat, "Logo present", header.ValidGbLogo.AsYesNo());
                    builder.AddData(HeaderCat, "Header checksum", header.HeaderChecksum.ToString("X2"));
                    builder.AddData(HeaderCat, "Header checksum valid", header.HeaderChecksumValid.AsYesNo());
                    builder.AddData(HeaderCat, "ROM checksum", header.RomChecksum.ToString("X4"));
                    builder.AddData(HeaderCat, "ROM checksum valid", header.RomChecksumValid.AsYesNo());
                    builder.AddData(HeaderCat, "Title", header.Title);
                    builder.AddData(HeaderCat, "Manufacturer", header.Manufacturer);
                    builder.AddData(HeaderCat, "Gameboy Color support", header.CGBFlag.GetDescription());
                    builder.AddData(HeaderCat, "Super Gameboy support", header.SupportsSgb.AsYesNo());
                    builder.AddData(HeaderCat, "Cart type", header.CartType.GetDescription());

                    builder.AddData(HeaderCat, "ROM size", header.RomSize.GetDescription());
                    builder.AddData(HeaderCat, "RAM size", header.RamSize.GetDescription());

                    builder.AddData(HeaderCat, "Mask ROM version", header.RomVersion.ToString());


                    builder.AddData(HeaderCat, "Licensee code", "$" + header.Licensee.ToString("X2"));
                    builder.AddData(HeaderCat, "Licensee code (extended)", header.LicenseeEx);
                }
            }
コード例 #18
0
        /// <summary>
        /// Calculates ROM data and produces extended ROM info
        /// </summary>
        /// <param name="rom">ROM image</param>
        /// <param name="platform">ROM platform, or Platform.UnknownPlatform</param>
        /// <param name="miscPlatform">Null, or, optionally, the name of the unsupported platform is Platform.Unknown is specified</param>
        /// <param name="findDbMatches">Specify true to search relevant databases for matches</param>
        /// <param name="extendedData">Specify true to produce extended data</param>
        /// <param name="worker">Work manager</param>
        /// <returns>An intialized RomData object, or null if the worker aborted the operation</returns>
        public static RomData GetRomData(byte[] rom, Platform platform, string miscPlatform, bool findDbMatches, bool extendedData, IHashWorkManager worker)
        {
            bool abort = false;

            RomData result = new RomData();

            result.Platform     = platform;
            result.MiscPlatform = miscPlatform;
            result.FileSize     = rom.Length;


            //IdentifyPlatform(rom, extension, result, platformPrompt, platformPromptTitle);

            worker.CheckIn(.1f, out abort);
            if (abort)
            {
                return(null);
            }


            if (result.Platform != null)
            {
                result.Platform.InitRomData(result, rom);

                result.RomSize        = result.Platform.GetRomSize(rom);
                result.FormatName     = result.Platform.GetRomFormatName(rom);
                result.ExternalHeader = result.Platform.HasHeader(rom);

                worker.CheckIn(.2f, out abort);
                if (abort)
                {
                    return(null);
                }

                result.Platform.CalculateHashes(rom, worker, 0.2f, 0.6f);
                var hashes = worker.Hashes;

                if (hashes != null)
                {
                    result._Hashes.AddRange(hashes);                                      // May return null if operation aborted
                }
                result._Hashes.Sort((RomHash a, RomHash b) => (int)a.Type - (int)b.Type); // Sort (ordering isn't meaningful, but will be consistent)
                worker.CheckIn(0.6f, out abort); if (abort)
                {
                    return(null);
                }

                if (findDbMatches)
                {
                    FindDbMatches(result);
                }
                worker.CheckIn(0.8f, out abort); if (abort)
                {
                    return(null);
                }

                if (extendedData)
                {
                    result.ExtendedData = result.Platform.GetExtendedInfo(rom, result);
                }
                else
                {
                    result.DatabaseMatches = new List <DBMatch>().AsReadOnly();
                    result.ExtendedData    = new List <RomDataCategory>();
                }
            }
            else
            {
                result.RomSize         = result.FileSize;
                result.FormatName      = "unknown";
                result.ExternalHeader  = null;
                result.DatabaseMatches = new List <DBMatch>().AsReadOnly();
                result.ExtendedData    = new List <RomDataCategory>();
            }
            worker.CheckIn(1f, out abort);

            return(result);
        }
コード例 #19
0
ファイル: Platforms.cs プロジェクト: snarfblam/ROM-Hasher
 /// <summary>
 /// This is the first method called when initializing a RomData object.
 /// Platform-specific information can be calculated and stored in the
 /// RomData's MiscData collection.
 /// </summary>
 internal virtual void InitRomData(RomData data, byte[] rom)
 {
 }
コード例 #20
0
ファイル: Platform_N64.cs プロジェクト: snarfblam/ROM-Hasher
            internal override void InitRomData(RomData data, byte[] rom)
            {
                base.InitRomData(data, rom);

                data.MiscData.Add(ByteswapTagID, N64.IsByteswapped(rom));
            }
コード例 #21
0
ファイル: Platforms.cs プロジェクト: snarfblam/ROM-Hasher
 /// <summary>
 /// Override this method to populate the extended ROM data.
 /// </summary>
 /// <param name="builder">An object to assist in populating extended ROM data.</param>
 /// <param name="rom">ROM file</param>
 /// <param name="data">RomData object that has Platform and Hashes properties initialized.</param>
 protected abstract void AddPlatformExtendedData(RomExDataBuilder builder, byte[] rom, RomData data);
コード例 #22
0
            protected override void AddPlatformExtendedData(RomExDataBuilder builder, byte[] rom, RomData data)
            {
                if (rom.Length >= GbaHeader.GbaHeaderSize)
                {
                    var HeaderCat = RomExDataBuilder.HeaderCat;
                    var header    = new GbaHeader(rom, 0);

                    builder.AddData(HeaderCat, "Logo present", header.ValidGbaLogo.AsYesNo());
                    builder.AddData(HeaderCat, "Header checksum", header.HeaderChecksum.ToString("X2"));
                    builder.AddData(HeaderCat, "Header checksum valid", header.HeaderChecksumValid.AsYesNo());
                    builder.AddData(HeaderCat, "Title", header.Title);
                    builder.AddData(HeaderCat, "Game Maker", header.MakerCode);
                    builder.AddData(HeaderCat, "Game Code", header.GameCode);

                    builder.AddData(HeaderCat, "Mask ROM version", header.RomVersion.ToString());
                }
            }
コード例 #23
0
            protected override void AddPlatformExtendedData(RomExDataBuilder builder, byte[] rom, RomData data)
            {
                var checksum  = SNES.CalculateChecksum(rom);
                int romOffset = SNES.HasExternalHeader(rom) ? SNES.ExternalHeaderSize : 0;

                string header = RomExDataBuilder.HeaderCat;

                object     o_snesheader;
                SnesHeader snesheader;

                if (data.MiscData.TryGetValue(DataTags.DecodedHeader, out o_snesheader))
                {
                    //if (snesheader != null) {
                    snesheader = o_snesheader as SnesHeader;

                    builder.AddData(RomExDataBuilder.GeneralCat, "Checksum valid", (checksum == snesheader.Checksum) ? "Yes" : "No");

                    builder.AddData(header, "Mapping", snesheader.Mapping.ToString());

                    //builder.AddData(header,"Name", GetAscii
                }
            }
コード例 #24
0
ファイル: Platform_NES.cs プロジェクト: snarfblam/ROM-Hasher
            protected override void AddPlatformExtendedData(RomExDataBuilder builder, byte[] rom, RomData data)
            {
                var HeaderCat = RomExDataBuilder.HeaderCat;


                if (rom.Length < 0x10)
                {
                    return;
                }

                var header = new iNesHeader(rom, 0);

                if (header.MagicNumberIsCorrect)
                {
                    builder.AddData(HeaderCat, "CHR Banks", header.ChrRomCount.ToString());
                    builder.AddData(HeaderCat, "PRG Banks", header.PrgRomCount.ToString());
                    builder.AddData(HeaderCat, "Battery backed", header.BatteryPacked ? "Yes" : "No");

                    if ((int)header.Mapper > 9)
                    {
                        builder.AddData(HeaderCat, "Mapper", ((int)header.Mapper).ToString() + " ($" + (((int)header.Mapper).ToString("x")) + ") - " + header.Mapper.ToString());
                    }
                    else
                    {
                        builder.AddData(HeaderCat, "Mapper", ((int)header.Mapper).ToString() + " - " + header.Mapper.ToString());
                    }
                    builder.AddData(HeaderCat, "Mirroring", header.Mirroring.ToString());
                    builder.AddData(HeaderCat, "Region", header.PalFlagSet ? "PAL" : "NTSC");;
                    //builder.AddData(HeaderCat, "SRAM Present", header.SRamFlag ? "Yes" : "No"); ;
                    //builder.AddData(HeaderCat, "SRAM Size", (header.PrgRamCount * 8).ToString() + " kb");

                    builder.AddData(HeaderCat, "Trainer present", header.HasTrainer ? "Yes" : "No");
                    builder.AddData(HeaderCat, "Bus conflicts", header.HasBusConflicts ? "Yes" : "No");
                    builder.AddData(HeaderCat, "VS Unisystem", header.VsUnisystem ? "Yes" : "No");
                    builder.AddData(HeaderCat, "Playchoice 10", header.PlayChoice10 ? "Yes" : "No");

                    builder.AddData(HeaderCat, "iNES 2.0", header.iNES2_0 ? "Yes" : "No");
                }
            }
コード例 #25
0
            protected override void AddPlatformExtendedData(Platform.RomExDataBuilder builder, byte[] rom, RomData data)
            {
                string headerCat = RomExDataBuilder.HeaderCat;

                SmsHeader header = new SmsHeader(rom, SmsHeader.HeaderOffset);

                builder.AddData(RomExDataBuilder.GeneralCat, "Checksum valid", header.ChecksumValid.AsYesNo());

                builder.AddData(headerCat, "Header present", header.HeaderPresent.AsYesNo());
                builder.AddData(headerCat, "Checksum", header.Checksum.ToString("X4"));
                builder.AddData(headerCat, "Checksum valid", header.ChecksumValid.AsYesNo());

                if (header.HeaderPresent)
                {
                    builder.AddData(headerCat, "Product Code", header.ProductCode);
                    builder.AddData(headerCat, "Region", header.Region.GetDescription());
                    builder.AddData(headerCat, "Version", header.Version.ToString());
                    builder.AddData(headerCat, "Size", header.Size.GetDescription());
                }
            }
コード例 #26
0
 protected override void AddPlatformExtendedData(RomExDataBuilder builder, byte[] rom, RomData data)
 {
     //var HeaderCat = RomExDataBuilder.HeaderCat;
 }