private void extractSelectedToolStripMenuItem_Click(object sender, EventArgs e) { int vol_index = Img.Volume_Index; // u need to pass this int total_selected = 0; List <int> selected_offsets = new List <int>(); List <int> selected_Sizes = new List <int>(); List <string> Selected_Files = new List <string>(); for (int i = 0; i < AFS_LV.SelectedItems.Count; i++) { selected_offsets.Add(int.Parse(AFS_LV.Items[AFS_LV.SelectedIndices[i]].SubItems[1].Text)); selected_Sizes.Add(int.Parse(AFS_LV.Items[AFS_LV.SelectedIndices[i]].SubItems[2].Text)); Selected_Files.Add(AFS_LV.Items[AFS_LV.SelectedIndices[i]].SubItems[3].Text); Debug_Log.AppendText("\n\nIndex[" + i.ToString() + "]" + " Sel Off: " + selected_offsets[i].ToString() + " Sel File: " + Selected_Files[i].ToString()); } total_selected = Selected_Files.Count; if (File.Exists(Img.Image_Path)) { using (FileStream fs = new FileStream(Img.Image_Path, FileMode.Open)) { if (Valid_Iso(fs)) { Img.Read_Image = new CDReader(fs, true, true); Img.Root_FSys_Info = Img.Read_Image.Root.GetFileSystemInfos(); Stream memStream = Img.Read_Image.OpenFile(Img.Selected_Volume, FileMode.Open); BinaryReader br = new BinaryReader(memStream); int sel_off = int.Parse(AFS_LV.Items[AFS_LV.SelectedIndices[0]].SubItems[1].Text); int sel_sz = int.Parse(AFS_LV.Items[AFS_LV.SelectedIndices[0]].SubItems[2].Text); relative_off = int.Parse(lbl_relativeOffset.Text); // if total selected files is 1, export single file, else run multi export routine.. if (total_selected != 0 && total_selected == 1) { if (Img.Selected_Volume.ToUpper() == "DATA.BIN") { AFSIO.Export_File(memStream, AFS_LV, sel_off, relative_off, sel_sz, true, lbl_stats); } else { AFSIO.Export_File(memStream, AFS_LV, sel_off, relative_off, sel_sz, false, lbl_stats); } } else { if (Img.Selected_Volume.ToUpper() == "DATA.BIN") { AFSIO.Export_SelectedFIles(memStream, AFS_LV, total_selected, sel_off, relative_off, selected_offsets, selected_Sizes, Selected_Files, true, ProgressBar00, lbl_stats); } else { AFSIO.Export_SelectedFIles(memStream, AFS_LV, total_selected, sel_off, relative_off, selected_offsets, selected_Sizes, Selected_Files, false, ProgressBar00, lbl_stats); } } br.Close(); fs.Close(); } } } } // selected extract
public void Read_Image() { OpenFileDialog OFD = new OpenFileDialog(); Stream sstream; List <string> Vol_List = new List <string>(); OFD.Filter = ".AFS()|*.afs|.iso(MHDOS)|*.iso|All Files (*.*)|*.*";; OFD.FilterIndex = 3; OFD.ShowDialog(); try { if (File.Exists(OFD.FileName)) { using (FileStream fs = new FileStream(OFD.FileName, FileMode.Open)) { if (Valid_Iso(fs)) { Img.Read_Image = new CDReader(fs, true, true); BinaryReader br = new BinaryReader(fs); Img.VolumeManager = new DiscUtils.VolumeManager(); Img.Image_Path = OFD.FileName; int Dir_Count = 0; int File_Count = 0; Img.VolumeManager.AddDisk(fs); Array.Resize(ref Img.Logical_VolumeInfo, Img.VolumeManager.GetLogicalVolumes().Length); Array.Resize(ref Img.Physical_VolumeInfo, Img.VolumeManager.GetPhysicalVolumes().Length); Img.Logical_VolumeInfo = Img.VolumeManager.GetLogicalVolumes(); Img.Physical_VolumeInfo = Img.VolumeManager.GetPhysicalVolumes(); Img.RootDirectory_Info = Img.Read_Image.Root.GetDirectories(); Img.Root_FInfo = Img.Read_Image.Root.GetFiles(); Img.Root_FSystem_Opts = Img.Read_Image.Root.FileSystem.Options; Img.Root_FSys_Info = Img.Read_Image.Root.GetFileSystemInfos(); Img.Volume_Label = Img.Read_Image.VolumeLabel; // Img.Volume_Box = Volume_List; Img.Active_Variant = Img.Read_Image.ActiveVariant.ToString(); Img.HasBootIMage = Img.Read_Image.HasBootImage; Img.IsThreadSafe = Img.Read_Image.IsThreadSafe; Img.Root_Dir = Img.Read_Image.Root.Name; Img.Cluster_Count = Img.Read_Image.TotalClusters; // Img.AFS_LIST = LV_AFS; // Img.Folder_View = TV_FOLDERS; // LBL_Strip.Text = Img.Image_Path; Array.Resize(ref Img.Root_Nodes, Img.Root_FSys_Info.Length); Array.Resize(ref Root_Files, Img.Root_FSys_Info.Length); byte[] sig_buffer = new byte[5]; fs.Seek(0x8000, SeekOrigin.Begin); // seek to PVD PrimaryVolObj.type_flag = br.ReadByte(); PrimaryVolObj.STD_ID = System.Text.Encoding.ASCII.GetString(br.ReadBytes(sig_buffer.Length), 0, sig_buffer.Length); fs.Seek(0x8050, SeekOrigin.Begin); PrimaryVolObj.Volume_Space = br.ReadInt32(); fs.Seek(0x8080, SeekOrigin.Begin); PrimaryVolObj.LogicalBlockSz = br.ReadInt16(); for (int t = 0; t < Img.Physical_VolumeInfo.Length; t++) { Img.Physical_Size = Img.Physical_VolumeInfo[t].Length; } for (int i = 0; i < Img.Root_FSys_Info.Length; i++) { Debug_Log.AppendText("\nFSys: [ " + i.ToString() + "] " + Img.Root_FSys_Info[i].Name + " Attr " + Img.Root_FSys_Info[i].Attributes.ToString()); if (Img.Root_FSys_Info[i].Attributes.ToString().Contains("Directory")) { Dir_Count++; Vol_List.Add(Img.Root_FSys_Info[i].Name); for (int x = 0; x < Img.RootDirectory_Info.Length; x++) { Img.Root_Nodes[i] = new TreeNode(Img.Root_FSys_Info[i].Name); Img.Root_Nodes[i].Nodes.Add(CreateDirNode(Img.RootDirectory_Info[x])); Img.Root_Nodes[i].ForeColor = GdiColor.White; } } else if (!Img.Root_FSys_Info[i].Attributes.ToString().Contains("Directory")) { File_Count++; sstream = Img.Read_Image.GetFileInfo(Img.Root_FSys_Info[i].FullName).Open(FileMode.Open); br = new BinaryReader(sstream); sstream.Seek(0, SeekOrigin.Begin); // Set struct nodes to file name Img.Root_Nodes[i] = new TreeNode(Img.Root_FSys_Info[i].Name); Vol_List.Add(Img.Root_FSys_Info[i].Name); // if the files have a valid afs signature color code them.. if (AFSIO.AfsValid(sstream, br)) { Img.Root_Nodes[i].ForeColor = GdiColor.LimeGreen; } else { Img.Root_Nodes[i].ForeColor = GdiColor.IndianRed; } } } Debug_Log.AppendText("\b [DEBUG] Total Directories: " + Dir_Count.ToString() + "\n Root_File_Count: " + File_Count.ToString()); } else { MessageBox.Show("Invalid Signature.. ", "Invalid iso9660", MessageBoxButtons.OK); } } foreach (var node in Img.Root_Nodes) { tv_root.Nodes.Add(node); } } } catch (IOException ex) { MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); } }