예제 #1
0
        private void btnYaz0Encode_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;
            }

            //Yaz0 Encode
            if (!Yaz0.Encode(oFile.FileName, oFile.FileName))
            {
                MessageBox.Show("Encode error:" + "\n\n" + Yaz0.lerror);
                goto toss;
            }

toss:
            oFile.Dispose();
            GC.Collect();
            lblProcessStatus.Visible = false;
        }
예제 #2
0
        private void btnYaz0Encode_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 = Path.GetDirectoryName(oFile.FileName) + "\\" + Path.GetFileNameWithoutExtension(oFile.FileName) + "Encoded" + Path.GetExtension(oFile.FileName);

            outFile = outFile.Replace("Decoded", "");

            //Yaz0 Encode
            if (!Yaz0.Encode(oFile.FileName, outFile))
            {
                MessageBox.Show("Encode error:" + "\n\n" + Yaz0.lerror);
                goto toss;
            }

            MessageBox.Show("Encode complete!" + "\n\n" + oFile.FileName);

toss:
            oFile.Dispose();
            GC.Collect();
            lblProcessStatus.Visible = false;
        }
예제 #3
0
        private void yaz0enDIR_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog yazen = new FolderBrowserDialog();

            if (yazen.ShowDialog() == DialogResult.OK)
            {
                DirectoryInfo d        = new DirectoryInfo(yazen.SelectedPath);
                FileInfo[]    decfiles = d.GetFiles("*", SearchOption.TopDirectoryOnly);
                foreach (FileInfo file in decfiles)
                {
                    Yaz0.Encode(file.FullName, file.FullName);
                }
            }
        }
예제 #4
0
        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();
            }
        }
예제 #5
0
        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();
        }
예제 #6
0
        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();
        }
예제 #7
0
        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);
        } //--------------------------------------------------------------------------------------------------------------------------------------------