Beispiel #1
0
        public static bool ExtractISO(string filename)
        {
            bool result = true;

            if (!Directory.Exists(@".\tmp\nkit"))
            {
                Directory.CreateDirectory(@".\tmp\nkit");
            }
            try
            {
                using (var ndisc = new NDisc(null, File.OpenRead(filename)))
                {
                    if (ndisc == null)
                    {
                        throw new System.Exception();
                    }
                    if (ndisc.ExtractBasicInfo().Id.Substring(0, 6) != "RM3E01")
                    {
                        throw new System.Exception();
                    }
                    LogManager.Log("nkit.log", "Found Metroid Prime 3 - Corruption NTSC iso");
                    LogManager.Log("nkit.log", "Extracting files...");
                    ndisc.ExtractFiles(ext_f => true,
                                       (f, ext_f) =>
                    {
                        var path = @".\tmp\nkit\DATA\" + (ext_f.PartitionId == null ? @"sys" : @"files");
                        if (ext_f.Path != "")
                        {
                            path += @"\" + ext_f.Path;
                        }
                        if (!Directory.Exists(path))
                        {
                            Directory.CreateDirectory(path);
                        }
                        LogManager.Log("nkit.log", "[" + (ext_f.PartitionId == null ? @"sys" : @"files") + "] Extracting " + ext_f.Path + "...");
                        using (var stream = File.OpenWrite(path + @"\" + ext_f.Name))
                            f.Copy(stream, ext_f.Length);
                    });
                    LogManager.Log("nkit.log", "Extracted " + Directory.EnumerateFiles(@".\tmp\nkit", "*.*", SearchOption.AllDirectories).ToArray().Length + " files!");
                }
            }
            catch (Exception ex)
            {
                LogManager.Log("nkit_err.log", ex.Message + "\r\n" + ex.StackTrace);
                result = false;
            }
            if (Directory.Exists(@".\Dats"))
            {
                Directory.Delete(@".\Dats", true);
            }
            if (Directory.Exists(@".\Processed"))
            {
                Directory.Delete(@".\Processed", true);
            }
            if (Directory.Exists(@".\Recovery"))
            {
                Directory.Delete(@".\Recovery", true);
            }
            if (!result)
            {
                Directory.Delete(@".\tmp\nkit", true);
            }
            else
            {
                try
                {
                    LogManager.Log("nkit.log", "Extracting disc infos...");
                    File.WriteAllBytes(@".\tmp\nkit\nkit_files.zip", Properties.Resources.RM3E01_nkit);
                    ZipFile.ExtractToDirectory(@".\tmp\nkit\nkit_files.zip", @".\tmp\nkit\DATA");
                    File.Move(@".\tmp\nkit\DATA\files\main.dol", @".\tmp\nkit\DATA\sys\main.dol");
                    File.Delete(@".\tmp\nkit\nkit_files.zip");
                    File.Delete(@".\tmp\nkit\DATA\files\boot.bin");
                    File.Delete(@".\tmp\nkit\DATA\files\appldr.bin");
                    File.Delete(@".\tmp\nkit\DATA\files\bi2.bin");
                    File.Delete(@".\tmp\nkit\DATA\files\fst.bin");
                    File.Delete(@".\tmp\nkit\DATA\sys\R3MEhdr.bin");
                    File.Delete(@".\tmp\nkit\DATA\sys\hdr.bin");
                    LogManager.Log("nkit.log", "Disc infos extracted!");
                    LogManager.Log("nkit.log", @"Moving .\tmp\nkit to .\tmp\wii");
                    Directory.Move(@".\tmp\nkit", @".\tmp\wii");
                    LogManager.Log("nkit.log", @"Done!");
                }
                catch (Exception ex)
                {
                    Directory.Delete(@".\tmp\nkit", true);
                    LogManager.Log("nkit_err.log", ex.Message + "\r\n" + ex.StackTrace);
                    result = false;
                }
            }
            return(result);
        }
Beispiel #2
0
        static int Main(string[] args)
        {
            List <ExtractRecoveryResult> results = new List <ExtractRecoveryResult>();

            logEnabled = true;
            try
            {
                logEnabled = args.Length == 0 || Settings.Read("OutputLevel", "1") != "0";
            }
            catch { }

            Version v  = Assembly.GetEntryAssembly().GetName().Version;
            Version vl = Assembly.GetEntryAssembly().GetName().Version;

            logLine(string.Format("{0} v{1}.{2}, NKit.dll v{3}.{4} :: Nanook", Settings.ExeName, v.Major.ToString(), v.Minor.ToString(), vl.Major.ToString(), vl.Minor.ToString()));
            logLine("");

            try
            {
                if (args.Length == 0)
                {
                    logLine(string.Format(@"Extracts recovery items that can be used by NKit to help restore modified images

Usage: {0} <files|paths|masks> ...

Parameters can be 1 or more filename and paths with or without masks.
Masks can search subfolders. Edit NKit.dll.config

Supported files:  iso, wbfs, gcm, iso.dec, zip, rar, 7z

If paths or filenames have spaces ensure they are enclosed in ""s

Examples
  {0} c:\temp\image.wbfs
  {0} c:\temp\scrubbed.iso
  {0} c:\temp
  {0} *.*
  {0} c:\temp\image.wbfs \temp\*.zip x*.iso.dec
  {0} ""c:\path 1\*.zip"" ""c:\path 2\*.gcm"" ""..\path 3\*.iso""

Edit 'NKit.dll.config' to specify all the required values
", Settings.ExeName));
                    return(2);
                }

                bool recurse = Settings.Read("SearchSubfolders", "true") == "true";

                logLine("Processing command line and scanning files...");
                SourceFile[] files = SourceFiles.Scan(args, recurse);
                logLine(string.Format("Found {0} file{1}", files.Length.ToString(), files.Length == 1 ? "" : "s"));
                logLine("");


                foreach (SourceFile src in files)
                {
                    Converter nkitConvert = new Converter(src, true);
                    try
                    {
                        nkitConvert.LogMessage  += dx_LogMessage;
                        nkitConvert.LogProgress += dx_LogProgress;

                        int fileTotalLen = src.TotalFiles.ToString().Length;
                        logLine(string.Format("#####[ {0} / {1} ]{2}", (src.Index + 1).ToString().PadLeft(fileTotalLen), src.TotalFiles.ToString(), new string('#', 79 - ((fileTotalLen * 2) + 12))));
                        using (NDisc dx = new NDisc(nkitConvert, src.Name))
                        {
                            try
                            {
                                if (dx != null)
                                {
                                    if (Settings.Read("OutputLevel", "1") == "3")
                                    {
                                        if (!dx.IsGameCube)
                                        {
                                            File.AppendAllText(@"WiiHeader.txt", string.Format("{0}\t{1}_{2}\t{3}\r\n", src.Name, BitConverter.ToString(dx.Header.Read(0x4e010, 0x10)).Replace("-", ""), dx.Header.ReadUInt32B(0x4e000).ToString(), BitConverter.ToString(dx.Header.Read(0, 256)).Replace("-", " ")));
                                        }
                                        else
                                        {
                                            File.AppendAllText(@"GcHeader.txt", string.Format("{0}\t{1}\r\n", src.Name, BitConverter.ToString(dx.Header.Read(0, 256)).Replace("-", " ")));
                                        }
                                    }
                                    results.AddRange(dx.ExtractRecoveryFiles().Recovery);
                                }
                            }
                            catch (Exception ex)
                            {
                                outputExceptionDetails(ex);
                            }
                            finally
                            {
                            }
                        }
                        logLine("");
                    }
                    finally
                    {
                        nkitConvert.LogMessage  -= dx_LogMessage;
                        nkitConvert.LogProgress -= dx_LogProgress;
                    }
                }
                if (files.Length == 0)
                {
                    logLine("No files found");
                }
                else
                {
                    int isRedump = results.Count(a => !a.IsNew);
                    int isOther  = results.Count(a => a.IsNew);
                    logLine(string.Format("Saved {0} Redump recovery file{1}, {2} Other recovery file{3}", isRedump.ToString(), isRedump == 1 ? "" : "s", isOther.ToString(), isOther == 1 ? "" : "s"));
                }
            }
            catch (Exception ex)
            {
                outputExceptionDetails(ex);
            }

            if (logEnabled && Settings.Read("WaitForKeyAfterProcessing", "true") == "true")
            {
                logLine("");
                logLine("Press enter / return to exit . . .");
                Console.ReadLine();
            }

            Environment.ExitCode = 2;
            return(2);
        }