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); }
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); }