Ejemplo n.º 1
0
        protected override void DoTaskForFile(string pPath, IVgmtWorkerStruct pTaskStruct,
                                              DoWorkEventArgs e)
        {
            WadUnpackerStruct ws = (WadUnpackerStruct)pTaskStruct;

            NintendoWad       wad;
            NintendoU8Archive u8;

            string[] extractedFiles;

            if (NintendoWad.IsWadFile(pPath))
            {
                //-------------
                // Extract WAD
                //-------------
                wad = new NintendoWad(pPath);

                if (ws.ExtractAllFiles)
                {
                    extractedFiles = wad.ExtractAll();
                }
                else
                {
                    extractedFiles = wad.ExtractContent();
                }

                this.progressStruct.Clear();
                this.progressStruct.GenericMessage = String.Format("[{0}]{1}    WAD Unpacked.{1}", Path.GetFileName(pPath), Environment.NewLine);
                ReportProgress(this.progress, this.progressStruct);

                //---------------------
                // Extract U8 Archives
                //---------------------
                if (ws.UnpackExtractedU8Files)
                {
                    foreach (string f in extractedFiles)
                    {
                        if (NintendoU8Archive.IsU8File(f))
                        {
                            this.progressStruct.Clear();
                            this.progressStruct.GenericMessage = String.Format("    Extracting U8: {0}{1}", Path.GetFileName(f), Environment.NewLine);
                            ReportProgress(this.progress, this.progressStruct);

                            u8 = new NintendoU8Archive(f);
                            u8.ExtractAll();
                        }
                    }
                }
            }
        }
        protected override void DoTaskForFile(string pPath, IVgmtWorkerStruct pTaskStruct,
                                              DoWorkEventArgs e)
        {
            U8ArchiveUnpackerStruct ws = (U8ArchiveUnpackerStruct)pTaskStruct;
            NintendoU8Archive       u8;

            if (NintendoU8Archive.IsU8File(pPath))
            {
                u8 = new NintendoU8Archive(pPath);
                u8.ExtractAll();

                this.progressStruct.Clear();
                this.progressStruct.GenericMessage = String.Format("[{0}]{1}", Path.GetFileName(pPath), Environment.NewLine);
                ReportProgress(this.progress, this.progressStruct);
            }
            else
            {
                this.progressStruct.Clear();
                this.progressStruct.GenericMessage = String.Format("[{0}] is not a U8 File.{1}", Path.GetFileName(pPath), Environment.NewLine);
                ReportProgress(this.progress, this.progressStruct);
            }
        }
Ejemplo n.º 3
0
        public static IVolume[] GetDataVolumes(string pPath, long startingOffset)
        {
            ArrayList volumeList = new ArrayList();

            // read the file, scanning for identifying bytes
            using (FileStream fs = File.OpenRead(pPath))
            {
                long currentOffset = startingOffset;
                long fileSize      = fs.Length;

                byte[] sectorBytes;
                byte[] sectorDataBytes;
                byte[] volumeIdBytes;
                byte[] secondaryHeaderBytes;

                bool isRawFormat = false;
                int  sectorSize  = 0x800;
                // CdSectorType mode;

                //----------------------
                // check for sync bytes
                //----------------------
                byte[] syncCheckBytes = ParseFile.ParseSimpleOffset(fs, 0, CdRom.SYNC_BYTES.Length);

                if (ParseFile.CompareSegment(syncCheckBytes, 0, CdRom.SYNC_BYTES))
                {
                    isRawFormat = true;
                    sectorSize  = 0x930;
                }

                while (currentOffset < fileSize)
                {
                    // get sector
                    sectorBytes = ParseFile.ParseSimpleOffset(fs, currentOffset, sectorSize);

                    // get data bytes from sector
                    sectorDataBytes = CdRom.GetDataChunkFromSector(sectorBytes, isRawFormat);

                    // get header bytes
                    volumeIdBytes = ParseFile.ParseSimpleOffset(sectorDataBytes, 0, MAX_ID_BYTES_LENGTH);

                    //----------
                    // ISO 9660
                    //----------
                    if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, 0, Iso9660.VOLUME_DESCRIPTOR_IDENTIFIER.Length, Iso9660.VOLUME_DESCRIPTOR_IDENTIFIER))
                    {
                        Iso9660Volume isoVolume;
                        isoVolume = new Iso9660Volume();
                        isoVolume.Initialize(fs, currentOffset, isRawFormat);
                        volumeList.Add((IVolume)isoVolume);

                        if ((isoVolume.Directories.Length == 1) &&
                            (isoVolume.Directories[0].SubDirectories.Length == 0) &&
                            ((isoVolume.Directories[0].Files.Length == 0) ||
                             ((isoVolume.Directories[0].Files.Length == 1) && (isoVolume.Directories[0].Files[0].FileName.Equals(XDvdFs.XGD3_WARNING_FILE_NAME)))
                            )
                            )
                        {
                            // possible empty/dummy volume (XBOX)
                            currentOffset += sectorSize;
                        }
                        else
                        {
                            currentOffset = isoVolume.VolumeBaseOffset + ((long)isoVolume.VolumeSpaceSize * (long)sectorSize);
                        }
                    }
                    //-----------------
                    // Green Book CD-I
                    //-----------------
                    else if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, 0, GreenBookCdi.VOLUME_DESCRIPTOR_IDENTIFIER.Length, GreenBookCdi.VOLUME_DESCRIPTOR_IDENTIFIER))
                    {
                        GreenBookCdiVolume isoVolume;
                        isoVolume = new GreenBookCdiVolume();
                        isoVolume.Initialize(fs, currentOffset, isRawFormat);
                        volumeList.Add((IVolume)isoVolume);

                        break;
                    }

                    //-----------------------
                    // XDVDFS (XBOX/XBOX360)
                    //-----------------------
                    else if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, 0, XDvdFs.STANDARD_IDENTIFIER.Length, XDvdFs.STANDARD_IDENTIFIER))
                    {
                        if (isRawFormat)
                        {
                            throw new FormatException("Raw dumps not supported for XDVDFS (XBOX/XBOX360) format.");
                        }
                        else
                        {
                            XDvdFsVolume isoVolume;
                            isoVolume = new XDvdFsVolume();
                            isoVolume.Initialize(fs, currentOffset, isRawFormat);
                            volumeList.Add((IVolume)isoVolume);

                            // XDVDFS should be the last volume
                            break;
                        }
                    }

                    //---------------
                    // PANASONIC 3DO
                    //---------------
                    else if ((ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, 0, Panasonic3do.STANDARD_IDENTIFIER.Length, Panasonic3do.STANDARD_IDENTIFIER)) ||
                             (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, 0, Panasonic3do.STANDARD_IDENTIFIER2.Length, Panasonic3do.STANDARD_IDENTIFIER2)) ||
                             (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, 0, Panasonic3do.STANDARD_IDENTIFIER2.Length, Panasonic3do.STANDARD_IDENTIFIER3)))
                    {
                        Panasonic3doVolume isoVolume;
                        isoVolume = new Panasonic3doVolume();
                        isoVolume.Initialize(fs, currentOffset, isRawFormat);
                        volumeList.Add((IVolume)isoVolume);

                        // should be the last volume
                        break;
                    }

                    //-------------------
                    // NINTENDO GAMECUBE
                    //-------------------
                    else if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, (int)NintendoGameCube.IDENTIFIER_OFFSET, NintendoGameCube.STANDARD_IDENTIFIER.Length, NintendoGameCube.STANDARD_IDENTIFIER))
                    {
                        NintendoGameCubeVolume isoVolume;
                        isoVolume = new NintendoGameCubeVolume();
                        isoVolume.Initialize(fs, currentOffset, isRawFormat);
                        volumeList.Add((IVolume)isoVolume);

                        // should be the last volume
                        break;
                    }

                    //--------------
                    // NINTENDO WII
                    //--------------
                    else if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, (int)NintendoWiiOpticalDisc.IDENTIFIER_OFFSET, NintendoWiiOpticalDisc.STANDARD_IDENTIFIER.Length, NintendoWiiOpticalDisc.STANDARD_IDENTIFIER))
                    {
                        if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, 0x60, 1, Constants.NullByteArray))
                        {
                            NintendoWiiOpticalDisc wiiDisc = new NintendoWiiOpticalDisc();
                            wiiDisc.Initialize(fs, currentOffset, isRawFormat);

                            foreach (NintendoWiiOpticalDiscVolume isoVolume in wiiDisc.Volumes)
                            {
                                volumeList.Add((IVolume)isoVolume);
                            }

                            break;
                        }
                        else // Decrypted WII ISO
                        {
                            NintendoGameCubeVolume isoVolume;
                            isoVolume = new NintendoGameCubeVolume();
                            isoVolume.Initialize(fs, currentOffset, isRawFormat);
                            volumeList.Add((IVolume)isoVolume);
                        }
                        // should be the last volume
                        break;
                    }

                    //------------------------
                    // MS STFS Package (XBLA)
                    //------------------------
                    //
                    // @TODO: Currently Broken
                    //
                    //else if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, (int)MicrosoftSTFS.IDENTIFIER_OFFSET, MicrosoftSTFS.STANDARD_IDENTIFIER.Length, MicrosoftSTFS.STANDARD_IDENTIFIER))
                    //{
                    //    MicrosoftSTFSVolume isoVolume;
                    //    isoVolume = new MicrosoftSTFSVolume();
                    //    isoVolume.Initialize(fs, currentOffset, isRawFormat);
                    //    volumeList.Add((IVolume)isoVolume);

                    //    // should be the last volume
                    //    break;
                    //}

                    //------------------------
                    // NINTENDO U8 ARCHIVE
                    //------------------------
                    else if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, (int)NintendoU8Archive.IDENTIFIER_OFFSET, NintendoU8Archive.STANDARD_IDENTIFIER.Length, NintendoU8Archive.STANDARD_IDENTIFIER))
                    {
                        NintendoU8Archive isoVolume;
                        isoVolume = new NintendoU8Archive(fs.Name);
                        isoVolume.Initialize(fs, currentOffset, isRawFormat);
                        volumeList.Add((IVolume)isoVolume);

                        // should be the last volume
                        break;
                    }

                    //-----------------
                    // NINTENDO WIIU
                    //-----------------
                    else if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, (int)NintendoWiiUOpticalDisc.IDENTIFIER_OFFSET, NintendoWiiUOpticalDisc.STANDARD_IDENTIFIER.Length, NintendoWiiUOpticalDisc.STANDARD_IDENTIFIER))
                    {
                        NintendoWiiUOpticalDisc wiiUDisc = new NintendoWiiUOpticalDisc();
                        wiiUDisc.Initialize(fs, currentOffset, isRawFormat);

                        foreach (NintendoWiiUOpticalDiscVolume isoVolume in wiiUDisc.Volumes)
                        {
                            volumeList.Add((IVolume)isoVolume);
                        }

                        break;
                    }


                    //-----------------
                    // NINTENDO 3DS
                    //-----------------
                    else if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, (int)Nintendo3dsCtr.IDENTIFIER_OFFSET, Nintendo3dsCtr.STANDARD_IDENTIFIER.Length, Nintendo3dsCtr.STANDARD_IDENTIFIER))
                    {
                        Nintendo3dsCtr ctr = new Nintendo3dsCtr(fs.Name);

                        foreach (Nintendo3dsNcchContainer isoVolume in ctr.Volumes)
                        {
                            volumeList.Add((IVolume)isoVolume);
                        }

                        break;
                    }

                    //------------------------
                    // CRI CPK ARCHIVE
                    //------------------------
                    else if (ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, (int)CriCpkArchive.IDENTIFIER_OFFSET, CriCpkArchive.STANDARD_IDENTIFIER.Length, CriCpkArchive.STANDARD_IDENTIFIER))
                    {
                        CriCpkArchive isoVolume;
                        isoVolume = new CriCpkArchive();
                        isoVolume.Initialize(fs, currentOffset, isRawFormat);
                        volumeList.Add((IVolume)isoVolume);

                        // should be the last volume
                        break;
                    }

                    //-----------------------------
                    // PS VITA (MICROSOFT EXFAT FILE SYSTEM)
                    //-----------------------------
                    else if ((ParseFile.CompareSegmentUsingSourceOffset(volumeIdBytes, (int)SonyPsVitaCartridge.IDENTIFIER_OFFSET, SonyPsVitaCartridge.STANDARD_IDENTIFIER.Length, SonyPsVitaCartridge.STANDARD_IDENTIFIER)))
                    {
                        secondaryHeaderBytes = ParseFile.ParseSimpleOffset(fs, currentOffset + SonyPsVitaCartridge.EXFAT_HEADER_OFFSET, (int)(MicrosoftExFatFileSystem.STANDARD_IDENTIFIER.Length + MicrosoftExFatFileSystem.IDENTIFIER_OFFSET));

                        if (ParseFile.CompareSegmentUsingSourceOffset(secondaryHeaderBytes,
                                                                      (int)MicrosoftExFatFileSystem.IDENTIFIER_OFFSET,
                                                                      MicrosoftExFatFileSystem.STANDARD_IDENTIFIER.Length,
                                                                      MicrosoftExFatFileSystem.STANDARD_IDENTIFIER))
                        {
                            MicrosoftExFatVolume isoVolume;
                            isoVolume = new MicrosoftExFatVolume();
                            isoVolume.Initialize(fs, currentOffset + SonyPsVitaCartridge.EXFAT_HEADER_OFFSET, isRawFormat);
                            volumeList.Add((IVolume)isoVolume);

                            break;
                        }
                    }

                    else
                    {
                        currentOffset += sectorSize;
                    }
                }
            }

            return((IVolume[])volumeList.ToArray(typeof(IVolume)));
        }