internal static void CreateNca(Option option) { AuthoringConfiguration config = option.Config; CreateNcaOption createNca = option.CreateNca; Directory.CreateDirectory(Path.GetDirectoryName(createNca.OutputFile)); string str = createNca.InputAdfFile; if (createNca.ContentType != null) { List <Pair <FilterType, Regex> > fdf = FilterDescription.ParseFdf(createNca.InputFdfPath); str = Path.GetDirectoryName(createNca.OutputFile) + "\\" + Path.GetFileName(createNca.OutputFile) + ".adf"; new NintendoContentAdfWriter(str, createNca.ContentType, createNca.MetaFilePath, createNca.DescFilePath, createNca.KeyAreaEncryptionKeyIndex).Write(createNca.InputDirs, fdf); } if (createNca.IsOnlyAdf) { return; } if (ContentArchiveLibraryInterface.GetArchiveType(str) != ArchiveFormatType.NintendoContent) { throw new FormatException("invalid formatType is indicated by .adf file."); } using (FileStream fileStream = Program.OpenNewFileStream(createNca.OutputFile, FileOptions.RandomAccess)) ContentArchiveLibraryInterface.CreateArchiveFromAdf((Stream)fileStream, str, config); if (createNca.IsSaveAdf) { return; } File.Delete(str); File.Delete(Path.GetDirectoryName(str) + "\\" + Path.GetFileNameWithoutExtension(str) + ".code.adf"); File.Delete(Path.GetDirectoryName(str) + "\\" + Path.GetFileNameWithoutExtension(str) + ".rom.adf"); }
internal static void ProdEncryption(Option option) { AuthoringConfiguration config = option.Config; if (Path.GetExtension(option.ProdEncryption.InputNspFile) != ".nsp") { throw new ArgumentException("input file must be .nsp file."); } if (option.ProdEncryption.CreateXci) { string path1 = Program.GetProdEncryptionOutputFileNameBase(option.ProdEncryption) + "_prod.xci"; string path2 = Program.GetProdEncryptionOutputFileNameBase(option.ProdEncryption) + "_prod.xci.result.xml"; string path3 = Program.GetProdEncryptionOutputFileNameBase(option.ProdEncryption) + "_prod.xcie"; string path4 = Program.GetProdEncryptionOutputFileNameBase(option.ProdEncryption) + "_prod.xcie.result.xml"; using (FileStream fileStream1 = Program.OpenReadOnlyFileStream(option.ProdEncryption.InputNspFile, FileOptions.SequentialScan)) { using (FileStream fileStream2 = option.ProdEncryption.InputUppNspFile != null ? Program.OpenReadOnlyFileStream(option.ProdEncryption.InputUppNspFile, FileOptions.SequentialScan) : (FileStream)null) { using (FileStream fileStream3 = Program.OpenNewFileStream(path1, FileOptions.RandomAccess)) { using (FileStream fileStream4 = Program.OpenNewFileStream(path2, FileOptions.RandomAccess)) ContentArchiveLibraryInterface.ProdEncryptNintendoSubmissionPackageArchiveForXci((Stream)fileStream3, (Stream)fileStream4, (Stream)fileStream1, (Stream)fileStream2, (Stream)null, option.ProdEncryption.LaunchFlags, config); } } } if (!option.ProdEncryption.CreateXcie) { return; } using (FileStream fileStream1 = Program.OpenReadOnlyFileStream(path1, FileOptions.SequentialScan)) { using (FileStream fileStream2 = Program.OpenNewFileStream(path3, FileOptions.SequentialScan)) { using (FileStream fileStream3 = Program.OpenNewFileStream(path4, FileOptions.RandomAccess)) ContentArchiveLibraryInterface.EncryptXci((Stream)fileStream2, (Stream)fileStream3, (Stream)fileStream1, config); } } } else { string path1 = Program.GetProdEncryptionOutputFileNameBase(option.ProdEncryption) + "_prod.nsp"; string path2 = Program.GetProdEncryptionOutputFileNameBase(option.ProdEncryption) + "_prod.nsp.result.xml"; using (FileStream fileStream1 = Program.OpenReadOnlyFileStream(option.ProdEncryption.InputNspFile, FileOptions.SequentialScan)) { using (FileStream fileStream2 = Program.OpenNewFileStream(path1, FileOptions.RandomAccess)) { using (FileStream fileStream3 = Program.OpenNewFileStream(path2, FileOptions.RandomAccess)) ContentArchiveLibraryInterface.ProdEncryptNintendoSubmissionPackageArchive((Stream)fileStream2, (Stream)fileStream3, (Stream)fileStream1, config); } } } }
internal static void CreateFs(Option option) { AuthoringConfiguration config = option.Config; CreateFsOption createFs = option.CreateFs; Directory.CreateDirectory(Path.GetDirectoryName(createFs.OutputFile)); string str = createFs.InputAdfFile; if (createFs.Format != ArchiveFormatType.Invalid) { List <Pair <FilterType, Regex> > fdf = FilterDescription.ParseFdf(createFs.InputFdfPath); str = Path.GetDirectoryName(createFs.OutputFile) + "\\" + Path.GetFileName(createFs.OutputFile) + ".adf"; switch (createFs.Format) { case ArchiveFormatType.PartitionFs: new PartitionFsAdfWriter(str).Write(createFs.InputDir); break; case ArchiveFormatType.RomFs: new RomFsAdfWriter(str).Write(createFs.InputDir, fdf); break; default: throw new NotImplementedException(); } } if (createFs.IsOnlyAdf) { return; } switch (ContentArchiveLibraryInterface.GetArchiveType(str)) { case ArchiveFormatType.PartitionFs: case ArchiveFormatType.RomFs: using (FileStream fileStream = Program.OpenNewFileStream(createFs.OutputFile, FileOptions.RandomAccess)) ContentArchiveLibraryInterface.CreateArchiveFromAdf((Stream)fileStream, str, config); if (createFs.IsSaveAdf) { break; } File.Delete(str); break; default: throw new FormatException("invalid formatType is indicated by .adf file."); } }
internal static void CreateNsp(Option option) { AuthoringConfiguration config = option.Config; CreateNspOption createNsp = option.CreateNsp; Directory.CreateDirectory(Path.GetDirectoryName(createNsp.OutputFile)); if (createNsp.GeneratesApplicationControl) { ApplicationControl.Generate(createNsp.NspContentInfos[0].MetaFilePath, createNsp.NspContentInfos[0].IconList, createNsp.NspContentInfos[0].NxIconList, createNsp.NspContentInfos[0].NxIconMaxSize, createNsp.GetApplicationControlGeneratePath(), true); } string str = createNsp.InputAdfFile; if (str == null) { List <Pair <FilterType, Regex> > fdf = FilterDescription.ParseFdf(createNsp.InputFdfPath); str = Path.GetDirectoryName(createNsp.OutputFile) + "\\" + Path.GetFileName(createNsp.OutputFile) + ".adf"; new NintendoSubmissionPackageAdfWriter(str).Write(createNsp.NspContentInfos, fdf); } if (createNsp.IsOnlyAdf) { return; } if (ContentArchiveLibraryInterface.GetArchiveType(str) != ArchiveFormatType.NintendoSubmissionPackage) { throw new FormatException("invalid formatType is indicated by .adf file."); } using (FileStream fileStream = Program.OpenNewFileStream(createNsp.OutputFile, FileOptions.RandomAccess)) ContentArchiveLibraryInterface.CreateArchiveFromAdf((Stream)fileStream, str, config); if (!createNsp.IsSaveAdf) { File.Delete(str); foreach (string file in Directory.GetFiles(Path.GetDirectoryName(str), Path.GetFileNameWithoutExtension(str) + ".c?.*.nca.*adf")) { File.Delete(file); } } if (!createNsp.GeneratesApplicationControl) { return; } Directory.Delete(createNsp.GetApplicationControlGeneratePath(), true); }
private static void Replace(Option option) { AuthoringConfiguration config = option.Config; string extension = Path.GetExtension(option.Replace.InputFile); if (extension != ".nsp" && extension != ".nca") { throw new ArgumentException("input file must be .nsp or .nca file."); } Directory.CreateDirectory(option.Replace.OutputDirectory); string path = option.Replace.OutputDirectory + "/" + Path.GetFileNameWithoutExtension(option.Replace.InputFile) + "_replaced" + extension; using (FileStream fileStream1 = Program.OpenReadOnlyFileStream(option.Replace.InputFile, FileOptions.SequentialScan)) { using (FileStream fileStream2 = Program.OpenReadOnlyFileStream(option.Replace.InputEntryFilePath, FileOptions.SequentialScan)) { using (FileStream fileStream3 = Program.OpenNewFileStream(path, FileOptions.RandomAccess)) { bool isNsp = extension == ".nsp"; ContentArchiveLibraryInterface.ModifyArchive((Stream)fileStream3, (Stream)fileStream1, (Stream)fileStream2, option.Replace.TargetEntryPath, option.Replace.DescFilePath, isNsp, config); } } } }