Esempio n. 1
0
        public static string ExportDir(DirRec rec)
        {
            if (!Iso9660.ReadFile(rec))
            {
                return(null);
            }

            byte[] data = new byte[rec.LenRecord];
            if (!RamDisk.Get(rec.GetPos(), rec.LenRecord, data))
            {
                return(null);
            }

            string[] parts = rec.GetUrl().Split(new char[] { ':' });
            string   dir   = AppDomain.CurrentDomain.BaseDirectory + "tmp/";
            string   path  = (dir + parts[1]).Replace('/', '\\');

            try {
                Directory.CreateDirectory(Path.GetDirectoryName(path));
                FileStream file = File.Create(path);
                file.Write(data, 0, rec.LenRecord);
                file.Close();
                return(path);
            } catch (Exception e) {
                Logger.Fail("Cannot create file " + path + " " + e.Message);
                return(null);
            }
        }
Esempio n. 2
0
        public static bool Open(string path)
        {
            Logger.SetProgress(0);
            Close();
            if (!RamDisk.Open(path))
            {
                return(false);
            }

            if (!RamDisk.Read(0x10))
            {
                return(false);
            }

            RamDisk.map[0x11] = 0x6F;
            for (int i = 0; i < 0x10; i++)
            {
                RamDisk.map[i] = 0x6F;
            }

            Model.SetPos("CD:PVD", 0x10 * 2048);
            Model.SetLen("CD:PVD", 2048);
            pvd  = new VolDesc("CD:PVD", 0x10 * 2048);
            root = pvd.GetRootDir();
            Model.SetPos("CD:ROOT", root.LbaData * 2048);
            Model.SetLen("CD:ROOT", root.LenData);
            Model.SetRec("CD:ROOT", root);
            int lba = root.LbaData;
            int len = root.LenData;

            for (int i = 0; i < len; i++)
            {
                RamDisk.Read(lba + i);
            }
            int lenp = pvd.PathTableSize;
            int lba1 = pvd.LbaPathTable1;
            int lba2 = pvd.LbaPathTable2;

            for (int i = 0; i < lenp; i++)
            {
                RamDisk.Read(lba1 + i);
                RamDisk.Read(lba2 + i);
            }

            Records.Add("CD:ROOT", root);
            Path2Pos.Add("CD:ROOT", root.GetPos());
            Lba2Path.Add(lba, "CD:ROOT");
            Publisher.Register("CD:PVD", pvd);
            Publisher.Register("CD:ROOT", root);

            EnumDir("CD:ROOT", root, null);
            Model.Open();
            if (View.disktool != null)
            {
                View.disktool.OpenDisk();
            }

            string dir = AppDomain.CurrentDomain.BaseDirectory;

            File.WriteAllBytes(dir + "disk.map", RamDisk.map);

            Logger.SetProgress(100);
            return(Logger.Pass("File opened successfully " + path));
        }
Esempio n. 3
0
        public static bool EnumDir(string url, DirRec dir, IEnumDir iterator)
        {
            int pos = dir.LbaData * 2048;
            int end = pos + dir.LenData;

            pos += RamDisk.GetU8(pos); // skip current directory
            pos += RamDisk.GetU8(pos); // skip parent directory
            while (pos < end)
            {
                byte len = RamDisk.GetU8(pos);
                if (len == 0)
                {
                    pos = ((pos / 2048) + 1) * 2048;
                }
                else
                {
                    string key = url + "/" + GetRecordFileName(pos);
                    DirRec rec = null;
                    if (Records.ContainsKey(key))
                    {
                        rec = Records[key];
                    }
                    else
                    {
                        rec = new DirRec(key, pos);
                        Model.SetPos(key, pos);
                        Model.SetLen(key, rec.LenData);
                        Model.SetRec(key, rec);
                        string name = rec.GetFileName();
                        int    lba  = rec.LbaData;
                        int    num  = (rec.LenData + 2047) / 2048;
                        if (rec.FileFlags_Directory)
                        {
                            for (int i = 0; i < num; i++)
                            {
                                RamDisk.Read(lba + i);
                            }
                        }
                        else
                        {
                            for (int i = 0; i < num; i++)
                            {
                                if (RamDisk.map[lba + i] == 0)
                                {
                                    RamDisk.map[lba + i] = 0x6F;
                                }
                            }
                        }
                        try {
                            Records.Add(key, rec);
                            Path2Pos.Add(key, rec.GetPos());
                            Lba2Path.Add(lba, key);
                            Publisher.Register(key, rec);
                        } catch (Exception e) {
                            Logger.Warn("Cannot register " + name + " " + e.Message);
                        }
                    }
                    if (rec.FileFlags_Directory)
                    {
                        int lba = rec.LbaData;
                        int num = (rec.LenData + 2047) / 2048;
                        for (int i = 0; i < num; i++)
                        {
                            RamDisk.Read(lba + i);
                        }

                        if (iterator != null)
                        {
                            iterator.Visit(key, rec);
                        }
                    }
                    pos += len;
                }
            }

            pos  = dir.LbaData * 2048;
            pos += RamDisk.GetU8(pos); // skip current directory
            pos += RamDisk.GetU8(pos); // skip parent directory
            while (pos < end)
            {
                byte len = RamDisk.GetU8(pos);
                if (len == 0)
                {
                    pos = ((pos / 2048) + 1) * 2048;
                }
                else
                {
                    string key = url + "/" + GetRecordFileName(pos);
                    DirRec rec = Records[key];
                    if (!rec.FileFlags_Directory)
                    {
                        if (iterator != null)
                        {
                            iterator.Visit(key, rec);
                        }
                    }
                    pos += len;
                }
            }
            return(true);
        }