private void yaz0deDIR_Click(object sender, EventArgs e) { FolderBrowserDialog yazde = new FolderBrowserDialog(); if (yazde.ShowDialog() == DialogResult.OK) { DirectoryInfo d = new DirectoryInfo(yazde.SelectedPath); FileInfo[] decfiles = d.GetFiles("*", SearchOption.TopDirectoryOnly); foreach (FileInfo file in decfiles) { Yaz0.Decode(file.FullName, file.FullName); } } }
private void btnYaz0Decode_Click(object sender, EventArgs e) { OpenFileDialog oFile = new OpenFileDialog(); oFile.Filter = "All Files|*.*"; if (tbxFolderRoot.Text != "") { oFile.InitialDirectory = tbxFolderRoot.Text; } lblProcessStatus.Visible = true; if (oFile.ShowDialog() == DialogResult.Cancel) { goto toss; } string outFile = oFile.FileName; //Yaz0 Decode if (cbxReplaceDecodedFile.Checked) { if (!Yaz0.Decode(oFile.FileName, outFile)) { MessageBox.Show("Decode error:" + "\n\n" + Yaz0.lerror); goto toss; } } else { outFile = Path.GetDirectoryName(oFile.FileName) + "\\" + Path.GetFileNameWithoutExtension(oFile.FileName) + "Decoded" + Path.GetExtension(oFile.FileName); if (!Yaz0.Decode(oFile.FileName, outFile)) { MessageBox.Show("Decode error:" + "\n\n" + Yaz0.lerror); goto toss; } } MessageBox.Show("Decode complete!" + "\n\n" + outFile); toss: oFile.Dispose(); GC.Collect(); lblProcessStatus.Visible = false; }
private void btnCusBrowse_Click(object sender, EventArgs e) { if (rbnCustomFile.Checked) { OpenFileDialog cusFile = new OpenFileDialog(); cusFile.Filter = "PACK File (*.pack *.sarc *.ssarc *.rarc *.sgenvb *.sbfarc *.sblarc *.sbactorpack)|*.pack; *.sarc; *.ssarc; *.rarc; *.sgenvb; *.sbfarc; *.sblarc; *.sbactorpack|All Files|*.*"; if (Properties.Settings.Default.RootFolder != "") { cusFile.InitialDirectory = Properties.Settings.Default.RootFolder; } if (cusFile.ShowDialog() == DialogResult.Cancel) { goto toss; } tbxCustom.Text = cusFile.FileName; dgvCusTable.Rows.Clear(); dgvCusTable.Refresh(); verify: byte[] fileCheck = System.IO.File.ReadAllBytes(tbxCustom.Text); if (fileCheck[0] == 'Y' && fileCheck[1] == 'a' && fileCheck[2] == 'z' && fileCheck[3] == '0') // if Yaz0 encoded, ask if they want to decode it { DialogResult diagResult = MessageBox.Show("This file is encoded!" + "\n\n" + "Do you want to decode?\nIt will create a seperate file automatically", "Yaz0 Encoded file...", MessageBoxButtons.YesNo); if (diagResult == DialogResult.No) { tbxCustom.Text = ""; goto toss; } string outFile = Path.GetDirectoryName(cusFile.FileName) + "\\" + Path.GetFileNameWithoutExtension(cusFile.FileName) + "Decoded" + Path.GetExtension(cusFile.FileName); if (!Yaz0.Decode(cusFile.FileName, outFile)) { MessageBox.Show("Decode error:" + "\n\n" + Yaz0.lerror); tbxCustom.Text = ""; goto toss; } tbxCustom.Text = outFile; goto verify; } if (("" + ((char)fileCheck[0]) + ((char)fileCheck[1]) + ((char)fileCheck[2]) + ((char)fileCheck[3])) != "SARC") { MessageBox.Show("Not a SARC archive! Missing SARC header at 0x00" + "\n" + "( Your file header is: " + ((char)fileCheck[0]) + ((char)fileCheck[1]) + ((char)fileCheck[2]) + ((char)fileCheck[3]) + " )"); tbxCustom.Text = ""; goto toss; } int nodeCount = PACK.GetFileNodeCount(tbxCustom.Text); string[] nodeTypes = PACK.GetFileNodeType(tbxCustom.Text); uint[] nodeSizes = PACK.GetFileNodeSizes(tbxCustom.Text); string[] nodePaths = PACK.GetFileNodePaths(tbxCustom.Text); uint[] nodePaddings = PACK.GetFileNodePaddings(tbxCustom.Text); for (int i = 0; i < nodeCount; i++) { dgvCusTable.Rows.Add(); dgvCusTable.Rows[i].Cells[0].Value = i + 1; dgvCusTable.Rows[i].Cells[1].Value = nodeTypes[i]; dgvCusTable.Rows[i].Cells[2].Value = nodeSizes[i]; dgvCusTable.Rows[i].Cells[3].Value = nodeSizes[i].ToString("X"); dgvCusTable.Rows[i].Cells[4].Value = nodePaths[i]; dgvCusTable.Rows[i].Cells[5].Value = nodePaddings[i]; } toss: cusFile.Dispose(); GC.Collect(); } else if (rbnCustomFolder.Checked) { FolderBrowserDialog cusFolder = new FolderBrowserDialog(); if (Properties.Settings.Default.RootFolder != "") { cusFolder.SelectedPath = Properties.Settings.Default.RootFolder; } cusFolder.Description = "Select Custom Folder"; if (cusFolder.ShowDialog() == DialogResult.Cancel) { goto toss; } tbxCustom.Text = cusFolder.SelectedPath; dgvCusTable.Rows.Clear(); dgvCusTable.Refresh(); string[] cusFolderFiles = System.IO.Directory.GetFiles(cusFolder.SelectedPath == "" ? System.Environment.CurrentDirectory : cusFolder.SelectedPath, "*.*", System.IO.SearchOption.AllDirectories); int nodeCount = cusFolderFiles.Length; if (nodeCount > 1000) { MessageBox.Show("Too many files (1000+)!\n\nI doubt you ment to select this folder...\n" + tbxCustom.Text + "\n\nTry again"); tbxCustom.Text = ""; goto toss; } uint[] nodeSizes = PACK.GetFolderFileSizes(cusFolder.SelectedPath); string[] nodeTypes = PACK.GetFolderFileTypes(cusFolder.SelectedPath); string[] nodePaths = PACK.GetFolderFilePaths(cusFolder.SelectedPath); for (int i = 0; i < nodeCount; i++) { dgvCusTable.Rows.Add(); dgvCusTable.Rows[i].Cells[0].Value = i + 1; dgvCusTable.Rows[i].Cells[1].Value = nodeTypes[i]; dgvCusTable.Rows[i].Cells[2].Value = nodeSizes[i]; dgvCusTable.Rows[i].Cells[3].Value = nodeSizes[i].ToString("X"); dgvCusTable.Rows[i].Cells[4].Value = nodePaths[i]; } toss: cusFolder.Dispose(); GC.Collect(); } }
private void btnOriBrowse_Click(object sender, EventArgs e) { OpenFileDialog oriFile = new OpenFileDialog(); oriFile.Filter = "PACK File (*.pack *.sarc *.ssarc *.rarc *.sgenvb *.sbfarc *.sblarc *.sbactorpack)|*.pack; *.sarc; *.ssarc; *.rarc; *.sgenvb; *.sbfarc; *.sblarc; *.sbactorpack|All Files|*.*"; if (Properties.Settings.Default.RootFolder != "") { oriFile.InitialDirectory = Properties.Settings.Default.RootFolder; } if (oriFile.ShowDialog() == DialogResult.Cancel) { goto toss; } tbxOriFile.Text = oriFile.FileName; dgvOriTable.Rows.Clear(); dgvOriTable.Refresh(); verify: byte[] fileCheck = System.IO.File.ReadAllBytes(tbxOriFile.Text); if (fileCheck[0] == 'Y' && fileCheck[1] == 'a' && fileCheck[2] == 'z' && fileCheck[3] == '0') // if Yaz0 encoded, ask if they want to decode it { DialogResult diagResult = MessageBox.Show("This file is encoded!" + "\n\n" + "Do you want to decode?\nIt will create a seperate file automatically", "Yaz0 Encoded file...", MessageBoxButtons.YesNo); if (diagResult == DialogResult.No) { tbxOriFile.Text = ""; goto toss; } string outFile = Path.GetDirectoryName(oriFile.FileName) + "\\" + Path.GetFileNameWithoutExtension(oriFile.FileName) + "Decoded" + Path.GetExtension(oriFile.FileName); if (!Yaz0.Decode(oriFile.FileName, outFile)) { MessageBox.Show("Decode error:" + "\n\n" + Yaz0.lerror); tbxOriFile.Text = ""; goto toss; } tbxOriFile.Text = outFile; goto verify; } if (("" + ((char)fileCheck[0]) + ((char)fileCheck[1]) + ((char)fileCheck[2]) + ((char)fileCheck[3])) != "SARC") { MessageBox.Show("Not a SARC archive! Missing SARC header at 0x00" + "\n" + "( Your file header is: " + ((char)fileCheck[0]) + ((char)fileCheck[1]) + ((char)fileCheck[2]) + ((char)fileCheck[3]) + " )"); tbxOriFile.Text = ""; goto toss; } int nodeCount = PACK.GetFileNodeCount(tbxOriFile.Text); string[] nodeTypes = PACK.GetFileNodeType(tbxOriFile.Text); uint[] nodeSizes = PACK.GetFileNodeSizes(tbxOriFile.Text); string[] nodePaths = PACK.GetFileNodePaths(tbxOriFile.Text); uint[] nodePaddings = PACK.GetFileNodePaddings(tbxOriFile.Text); for (int i = 0; i < nodeCount; i++) { dgvOriTable.Rows.Add(); dgvOriTable.Rows[i].Cells[0].Value = i + 1; dgvOriTable.Rows[i].Cells[1].Value = nodeTypes[i]; dgvOriTable.Rows[i].Cells[2].Value = nodeSizes[i]; dgvOriTable.Rows[i].Cells[3].Value = nodeSizes[i].ToString("X"); dgvOriTable.Rows[i].Cells[4].Value = nodePaths[i]; dgvOriTable.Rows[i].Cells[5].Value = nodePaddings[i]; } toss: oriFile.Dispose(); GC.Collect(); }
private void btnBrowse_Click(object sender, EventArgs e) { OpenFileDialog inFile = new OpenFileDialog(); inFile.Filter = "All Files|*.*"; if (inFile.ShowDialog() == DialogResult.Cancel) { goto toss; } tbxFile.Text = inFile.FileName; btnSave.Enabled = true; dgvTable.Rows.Clear(); dgvTable.Refresh(); verify: byte[] fileCheck = System.IO.File.ReadAllBytes(tbxFile.Text); if (fileCheck[0] == 'Y' && fileCheck[1] == 'a' && fileCheck[2] == 'z' && fileCheck[3] == '0') // if Yaz0 encoded, ask if they want to decode it { DialogResult diagResult = MessageBox.Show("This file is encoded!" + "\n\n" + "Do you want to decode?\nIt will create a seperate file automatically", "Yaz0 Encoded file...", MessageBoxButtons.YesNo); if (diagResult == DialogResult.No) { tbxFile.Text = ""; btnSave.Enabled = false; goto toss; } string outFile = Path.GetDirectoryName(inFile.FileName) + "\\" + Path.GetFileNameWithoutExtension(inFile.FileName) + "Decoded" + Path.GetExtension(inFile.FileName); if (!Yaz0.Decode(inFile.FileName, outFile)) { MessageBox.Show("Decode error:" + "\n\n" + Yaz0.lerror); tbxFile.Text = ""; btnSave.Enabled = false; goto toss; } tbxFile.Text = outFile; goto verify; } if (("" + ((char)fileCheck[0]) + ((char)fileCheck[1]) + ((char)fileCheck[2]) + ((char)fileCheck[3])) != "SARC") { MessageBox.Show("Not a SARC archive! Missing SARC header at 0x00" + "\n" + "( Your file header is: " + ((char)fileCheck[0]) + ((char)fileCheck[1]) + ((char)fileCheck[2]) + ((char)fileCheck[3]) + " )"); tbxFile.Text = ""; btnSave.Enabled = false; goto toss; } int nodeCount = PACK.GetFileNodeCount(tbxFile.Text); string[] nodeTypes = PACK.GetFileNodeType(tbxFile.Text); uint[] nodeSizes = PACK.GetFileNodeSizes(tbxFile.Text); string[] nodePaths = PACK.GetFileNodePaths(tbxFile.Text); uint[] nodePaddings = PACK.GetFileNodePaddings(tbxFile.Text); for (int i = 0; i < nodeCount; i++) { dgvTable.Rows.Add(); dgvTable.Rows[i].Cells[0].Value = i + 1; dgvTable.Rows[i].Cells[1].Value = nodePaddings[i]; dgvTable.Rows[i].Cells[2].Value = nodeTypes[i]; dgvTable.Rows[i].Cells[3].Value = nodeSizes[i]; dgvTable.Rows[i].Cells[4].Value = nodeSizes[i].ToString("X"); dgvTable.Rows[i].Cells[5].Value = nodePaths[i]; } fileSize = fileCheck.Length; tbxFileSize.Text = fileSize.ToString(); dataOffset = PACK.GetFileDataOffset(tbxFile.Text); tbxDataOffset.Text = "0x" + dataOffset.ToString("X"); toss: inFile.Dispose(); GC.Collect(); }
public static bool Extract(byte[] inFile, string outDir, bool autoDecode, bool replaceFile, string inFileName) { //SARC header 0x00 - 0x13 if (inFile[0] != 'S' || inFile[1] != 'A' || inFile[2] != 'R' || inFile[3] != 'C') { if (inFile[0] == 'Y' && inFile[1] == 'a' && inFile[2] == 'z' && inFile[3] == '0') { if (autoDecode) { string outFile; if (replaceFile) { //replace the file decoded and recursively run the extract outFile = inFileName; Yaz0.Decode(inFileName, outFile); } else { //create the decoded file and recursively run the extract outFile = Path.GetDirectoryName(inFileName) + "\\" + Path.GetFileNameWithoutExtension(inFileName) + "Decoded" + Path.GetExtension(inFileName); Yaz0.Decode(inFileName, outFile); } return(Extract(outFile, outDir, autoDecode, replaceFile)); //recursively run the code again } else { lerror = "Yaz0 file encoded (you don't have Auto Yaz0 Decode on!)"; return(false); } } else { lerror = "Not a SARC archive! Missing SARC header at 0x00" + "\n" + "( Your file header is: " + ((char)inFile[0]) + ((char)inFile[1]) + ((char)inFile[2]) + ((char)inFile[3]) + " )"; return(false); } } int pos = 4; //0x04 ushort hdr = Makeu16(inFile[pos], inFile[pos + 1]); //SARC Header length pos += 2; //0x06 ushort bom = Makeu16(inFile[pos], inFile[pos + 1]); //Byte Order Mark if (bom != 65279) //Check 0x06 for Byte Order Mark (if not 0xFEFF) { if (bom == 65518) { lerror = "Unable to support Little Endian! (Byte Order Mark 0x06)"; } else { lerror = "Unknown SARC header (Byte Order Mark 0x06)"; } return(false); } pos += 2; //0x08 uint fileSize = Makeu32(inFile[pos], inFile[pos + 1], inFile[pos + 2], inFile[pos + 3]); pos += 4; //0x0C uint dataOffset = Makeu32(inFile[pos], inFile[pos + 1], inFile[pos + 2], inFile[pos + 3]); //Data offset start position pos += 4; //0x10 uint unknown = Makeu32(inFile[pos], inFile[pos + 1], inFile[pos + 2], inFile[pos + 3]); //unknown, always 0x01? pos += 4; //0x14 //SFAT header 0x14 - 0x1F if (inFile[pos] != 'S' || inFile[pos + 1] != 'F' || inFile[pos + 2] != 'A' || inFile[pos + 3] != 'T') { lerror = "Unknown file table! (Missing SFAT header at 0x14)"; return(false); } pos += 4; //0x18 ushort hdr2 = Makeu16(inFile[pos], inFile[pos + 1]); //SFAT Header length pos += 2; //0x1A ushort nodeCount = Makeu16(inFile[pos], inFile[pos + 1]); //Node Cluster count pos += 2; //0x1C uint hashr = Makeu32(inFile[pos], inFile[pos + 1], inFile[pos + 2], inFile[pos + 3]); //Hash multiplier, always 0x65 pos += 4; //0x20 SarcNode[] nodes = new SarcNode[nodeCount]; SarcNode tmpnode = new SarcNode(); for (int i = 0; i < nodeCount; i++) //Node cluster { tmpnode.hash = Makeu32(inFile[pos], inFile[pos + 1], inFile[pos + 2], inFile[pos + 3]); pos += 4; //0x?4 tmpnode.unknown = inFile[pos]; //unknown, always 0x01? (not used in this case) pos += 1; //0x?5 tmpnode.offset = Makeu32(0, inFile[pos], inFile[pos + 1], inFile[pos + 2]); //Node SFNT filename offset divided by 4 (not used) pos += 3; //0x?8 tmpnode.start = Makeu32(inFile[pos], inFile[pos + 1], inFile[pos + 2], inFile[pos + 3]); //Start Data offset position pos += 4; //0x?C tmpnode.end = Makeu32(inFile[pos], inFile[pos + 1], inFile[pos + 2], inFile[pos + 3]); //End Data offset position pos += 4; //0x?0 nodes[i] = tmpnode; //Store node data into array } if (inFile[pos] != 'S' || inFile[pos + 1] != 'F' || inFile[pos + 2] != 'N' || inFile[pos + 3] != 'T') { string posOffset = "0x" + pos.ToString("X"); lerror = "Unknown file name table! (Missing SFNT header at " + posOffset + ")"; return(false); } pos += 4; //0x?4 ushort hdr3 = Makeu16(inFile[pos], inFile[pos + 1]); //SFNT Header length, always 0x08 pos += 2; //0x?6 ushort unk2 = Makeu16(inFile[pos], inFile[pos + 1]); //unknown, always 0x00? pos += 2; //0x?8 string[] fileNames = new string[nodeCount]; string tempName; for (int i = 0; i < nodeCount; i++) //Get file names for each node { tempName = ""; //reset for each file while (inFile[pos] != 0) { tempName = tempName + ((char)inFile[pos]).ToString(); //Build temp string for each letter pos += 1; } while (inFile[pos] == 0) //ignore every 0 byte, because why bother calculating the SFNT header offset anyway? { pos += 1; } fileNames[i] = tempName; //Take built string and store it in the array } if (!System.IO.Directory.Exists(outDir)) { System.IO.Directory.CreateDirectory(outDir); //folder creation } System.IO.StreamWriter stream; byte[] nodeData; for (int i = 0; i < nodeCount; i++) //Write files based from node information { MakeDirExist(System.IO.Path.GetDirectoryName(outDir + "/" + fileNames[i])); if (autoDecode) { nodeData = new byte[nodes[i].end - nodes[i].start]; Array.Copy(inFile, nodes[i].start + dataOffset, nodeData, 0, nodes[i].end - nodes[i].start); if (replaceFile) { if (!(Yaz0.Decode(nodeData, outDir + "/" + fileNames[i]))) //attempt decode, but if it fails, write it anyway. { stream = new System.IO.StreamWriter(outDir + "/" + fileNames[i]); stream.BaseStream.Write(inFile, (int)(nodes[i].start + dataOffset), (int)(nodes[i].end - nodes[i].start)); //Write stream.Close(); stream.Dispose(); } } else { Yaz0.Decode(nodeData, outDir + "/" + fileNames[i].Split('.')[0] + "Decoded." + fileNames[i].Split('.')[1]); stream = new System.IO.StreamWriter(outDir + "/" + fileNames[i]); stream.BaseStream.Write(inFile, (int)(nodes[i].start + dataOffset), (int)(nodes[i].end - nodes[i].start)); //Write stream.Close(); stream.Dispose(); } } else { stream = new System.IO.StreamWriter(outDir + "/" + fileNames[i]); stream.BaseStream.Write(inFile, (int)(nodes[i].start + dataOffset), (int)(nodes[i].end - nodes[i].start)); //Write stream.Close(); stream.Dispose(); } } GC.Collect(); return(true); } //--------------------------------------------------------------------------------------------------------------------------------------------