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); } }
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)); }
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); }