public void ExtractParts(string imageFilename)
        {
            string extractDir = Path.GetDirectoryName(imageFilename);

            using (FileStream imageStream = File.Open(imageFilename, FileMode.Open))
            {
                using (FileStream kernelStream = File.Create(Path.Combine(extractDir, "vmlinux.gz")))
                {
                    Misc.CopyStream(imageStream, kernelStream, 0x4343C, 0);

                    kernelStream.Seek(0, SeekOrigin.Begin);
                    using (GZipStream compKernelStream = new GZipStream(kernelStream, CompressionMode.Decompress))
                    {
                        using (FileStream uncompKernelStream = File.Create(Path.Combine(extractDir, "vmlinux")))
                        {
                            compKernelStream.CopyTo(uncompKernelStream);
                        }
                    }
                }

                int squashIndex = FileStringSearcher.FindInFile(imageStream, "hsqs");

                if (squashIndex != ~imageStream.Length)
                {
                    using (FileStream rootfsStream = File.Create(Path.Combine(extractDir, "filesystem.squashfs.bin")))
                    {
                        Misc.CopyStream(imageStream, rootfsStream, squashIndex, imageStream.Length - squashIndex);
                    }

                    string appDir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

                    //if (Directory.Exists(Path.Combine(extractDir, "rootfs"))) Directory.Delete(Path.Combine(extractDir, "rootfs"));

                    Process unsquashProcess = new Process();
                    unsquashProcess.StartInfo.FileName  = Path.Combine(appDir, "unsquashfs.exe");
                    unsquashProcess.StartInfo.Arguments = string.Format("-d \"{0}\" \"{1}\"", Path.Combine(extractDir, "rootfs"),
                                                                        Path.Combine(extractDir, "filesystem.squashfs.bin"));

                    unsquashProcess.Start();
                    unsquashProcess.WaitForExit();

                    if (File.Exists(Path.Combine(extractDir, @"rootfs\NDS\config\bsysconfig.bin")))
                    {
                        BinaryConfigReader reader = new BinaryConfigReader(Path.Combine(extractDir, @"rootfs\NDS\config\bsysconfig.bin"), false);

                        Directory.CreateDirectory(Path.Combine(extractDir, "config"));
                        reader.SaveAsINI(Path.Combine(extractDir, "config"));
                    }
                }
            }
        }
예제 #2
0
        public void ExtractParts(string imageFilename)
        {
            string extractDir = Path.GetDirectoryName(imageFilename);

            using (FileStream imageStream = File.Open(imageFilename, FileMode.Open))
            {
                using (FileStream cfeStream = File.Create(Path.Combine(extractDir, "cfe.bin")))
                {
                    Misc.CopyStream(imageStream, cfeStream, 0x7630, 0x189AC);
                }

                using (FileStream kernelStream = File.Create(Path.Combine(extractDir, "vmlinux.gz")))
                {
                    Misc.CopyStream(imageStream, kernelStream, 0x1FFDC, 0);

                    kernelStream.Seek(0, SeekOrigin.Begin);
                    using (GZipStream compKernelStream = new GZipStream(kernelStream, CompressionMode.Decompress))
                    {
                        using (FileStream uncompKernelStream = File.Create(Path.Combine(extractDir, "vmlinux")))
                        {
                            compKernelStream.CopyTo(uncompKernelStream);

                            // Now we want to try and find the lzma'd cpio filesystem

                            int cpioIndex = FileStringSearcher.FindInFile(uncompKernelStream, Encoding.ASCII.GetString(new byte[]
                            {
                                0x5D, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
                            }));

                            if (cpioIndex != ~uncompKernelStream.Length)
                            {
                                using (FileStream rootFsLzmaStream = File.Create(Path.Combine(extractDir, "filesystem.lzma")))
                                {
                                    Misc.CopyStream(uncompKernelStream, rootFsLzmaStream, cpioIndex, 0);
                                }

                                string appDir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

                                Process unlzmaProcess = new Process();
                                unlzmaProcess.StartInfo.FileName  = Path.Combine(appDir, "lzma.exe");
                                unlzmaProcess.StartInfo.Arguments = string.Format("d \"{0}\" \"{1}\"", Path.Combine(extractDir, "filesystem.lzma"),
                                                                                  Path.Combine(extractDir, "filesystem.bin"));

                                unlzmaProcess.Start();
                                unlzmaProcess.WaitForExit();

                                if (File.Exists(Path.Combine(extractDir, "filesystem.bin")))
                                {
                                    Directory.CreateDirectory(Path.Combine(extractDir, "rootfs"));

                                    Process cpioProcess = new Process();
                                    cpioProcess.StartInfo.FileName  = Path.Combine(appDir, "extract_fs.cmd");
                                    cpioProcess.StartInfo.Arguments = string.Format("\"{0}\" \"{1}\" \"{2}\"", Path.Combine(extractDir, "rootfs"),
                                                                                    Path.Combine(appDir, "cpio.exe"),
                                                                                    Path.Combine(extractDir, "filesystem.bin"));

                                    cpioProcess.Start();
                                    cpioProcess.WaitForExit();

                                    if (File.Exists(Path.Combine(extractDir, @"rootfs\NDS\config\bsysconfig.bin")))
                                    {
                                        BinaryConfigReader reader = new BinaryConfigReader(Path.Combine(extractDir, @"rootfs\NDS\config\bsysconfig.bin"), false);

                                        Directory.CreateDirectory(Path.Combine(extractDir, "config"));
                                        reader.SaveAsINI(Path.Combine(extractDir, "config"));
                                    }
                                    else if (File.Exists(Path.Combine(extractDir, @"rootfs\NDS\config\version.cfg")))
                                    {
                                        Directory.CreateDirectory(Path.Combine(extractDir, "config"));

                                        foreach (string fileName in Directory.EnumerateFiles(Path.Combine(extractDir, @"rootfs\NDS\config"), "*.cfg"))
                                        {
                                            File.Copy(fileName, Path.Combine(extractDir, "config", Path.GetFileName(fileName)), true);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        public void ExtractParts(string imageFilename)
        {
            string extractDir = Path.GetDirectoryName(imageFilename);

            using (FileStream imageStream = File.Open(imageFilename, FileMode.Open))
            {
                using (FileStream kernelStream = File.Create(Path.Combine(extractDir, "vmlinux.gz")))
                {
                    Misc.CopyStream(imageStream, kernelStream, 0x4343C, 0);

                    kernelStream.Seek(0, SeekOrigin.Begin);
                    using (GZipStream compKernelStream = new GZipStream(kernelStream, CompressionMode.Decompress))
                    {
                        using (FileStream uncompKernelStream = File.Create(Path.Combine(extractDir, "vmlinux")))
                        {
                            compKernelStream.CopyTo(uncompKernelStream);
                        }
                    }
                }

                int squashIndex = FileStringSearcher.FindInFile(imageStream, "hsqs");

                if (squashIndex != ~imageStream.Length)
                {
                    using (FileStream rootfsStream = File.Create(Path.Combine(extractDir, "filesystem.squashfs.bin")))
                    {
                        Misc.CopyStream(imageStream, rootfsStream, squashIndex, imageStream.Length - squashIndex);
                    }

                    string appDir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

                    //if (Directory.Exists(Path.Combine(extractDir, "rootfs"))) Directory.Delete(Path.Combine(extractDir, "rootfs"));

                    Process unsquashProcess = new Process();
                    unsquashProcess.StartInfo.FileName = Path.Combine(appDir, "unsquashfs.exe");
                    unsquashProcess.StartInfo.Arguments = string.Format("-d \"{0}\" \"{1}\"", Path.Combine(extractDir, "rootfs"),
                        Path.Combine(extractDir, "filesystem.squashfs.bin"));

                    unsquashProcess.Start();
                    unsquashProcess.WaitForExit();

                    if (File.Exists(Path.Combine(extractDir, @"rootfs\NDS\config\bsysconfig.bin")))
                    {
                        BinaryConfigReader reader = new BinaryConfigReader(Path.Combine(extractDir, @"rootfs\NDS\config\bsysconfig.bin"), false);

                        Directory.CreateDirectory(Path.Combine(extractDir, "config"));
                        reader.SaveAsINI(Path.Combine(extractDir, "config"));
                    }
                }
            }
        }
        public void ExtractParts(string imageFilename)
        {
            string extractDir = Path.GetDirectoryName(imageFilename);

            using (FileStream imageStream = File.Open(imageFilename, FileMode.Open))
            {
                using (FileStream kernelStream = File.Create(Path.Combine(extractDir, "vmlinux.gz")))
                {
                    Misc.CopyStream(imageStream, kernelStream, 0x2BDC, 0);

                    kernelStream.Seek(0, SeekOrigin.Begin);
                    using (GZipStream compKernelStream = new GZipStream(kernelStream, CompressionMode.Decompress))
                    {
                        using (FileStream uncompKernelStream = File.Create(Path.Combine(extractDir, "vmlinux")))
                        {
                            compKernelStream.CopyTo(uncompKernelStream);

                            // Now we want to try and find the lzma'd cpio filesystem

                            int cpioIndex = FileStringSearcher.FindInFile(uncompKernelStream, Encoding.ASCII.GetString(new byte[]
                            {
                                0x5D, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
                            }));

                            if (cpioIndex != ~uncompKernelStream.Length)
                            {
                                using(FileStream rootFsLzmaStream = File.Create(Path.Combine(extractDir, "filesystem.lzma")))
                                {
                                    Misc.CopyStream(uncompKernelStream, rootFsLzmaStream, cpioIndex, 0);
                                }

                                string appDir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

                                Process unlzmaProcess = new Process();
                                unlzmaProcess.StartInfo.FileName = Path.Combine(appDir, "lzma.exe");
                                unlzmaProcess.StartInfo.Arguments = string.Format("d \"{0}\" \"{1}\"", Path.Combine(extractDir, "filesystem.lzma"),
                                    Path.Combine(extractDir, "filesystem.bin"));

                                unlzmaProcess.Start();
                                unlzmaProcess.WaitForExit();

                                if (File.Exists(Path.Combine(extractDir, "filesystem.bin")))
                                {
                                    Directory.CreateDirectory(Path.Combine(extractDir, "rootfs"));

                                    Process cpioProcess = new Process();
                                    cpioProcess.StartInfo.FileName = Path.Combine(appDir, "extract_fs.cmd");
                                    cpioProcess.StartInfo.Arguments = string.Format("\"{0}\" \"{1}\" \"{2}\"", Path.Combine(extractDir, "rootfs"),
                                        Path.Combine(appDir, "cpio.exe"),
                                        Path.Combine(extractDir, "filesystem.bin"));

                                    cpioProcess.Start();
                                    cpioProcess.WaitForExit();

                                    if (File.Exists(Path.Combine(extractDir, @"rootfs\NDS\config\bsysconfig.bin")))
                                    {
                                        BinaryConfigReader reader = new BinaryConfigReader(Path.Combine(extractDir, @"rootfs\NDS\config\bsysconfig.bin"), false);

                                        Directory.CreateDirectory(Path.Combine(extractDir, "config"));
                                        reader.SaveAsINI(Path.Combine(extractDir, "config"));
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }