public Task DumpDiscardPsAsync(IProgress <int> progress) { return(Task.Run(() => { if (!Directory.Exists("shaderDump")) { Directory.CreateDirectory("shaderDump"); } for (var i = 0; i < _candidateIds.Count; i++) { var id = _candidateIds[i]; var filename = _archive.VfsFilename(id); var outputPath = "shaderDump/" + filename; var binary = _archive.Get(id); var disassembly = D3DCompiler.Disassemble(binary); if (disassembly.Contains("discard_z")) { File.WriteAllBytes(outputPath, binary); File.WriteAllText(outputPath + ".lst", disassembly); } progress.Report(i + 1); } })); }
static void Extract(string archivePath, string destinationFolder) { CrafArchive archive = null; try { archive = CrafArchive.Open(archivePath); var task = archive.LoadAsync(new Progress <int>()); task.Wait(); archive.CloseReader(); } catch (IOException) { Console.WriteLine("Could not open archive"); Environment.Exit(-1); } var ct = archive.Count(); try { Directory.CreateDirectory(destinationFolder); for (var i = 0; i < ct; i++) { var outputPath = Path.Combine(destinationFolder, archive.DiskPath(i)); Console.WriteLine(string.Format("{0} ({1}/{2})", outputPath, i + 1, ct)); Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); File.WriteAllBytes(outputPath, archive.Get(i)); } } catch (IOException ex) { Console.WriteLine("Error while extracting archive"); Console.WriteLine("Details: " + ex.Message); Environment.Exit(-1); } }