private void StreamListBox_SelectedIndexChanged(object sender, EventArgs e) { if (StreamListBox.SelectedIndex >= 0 && (StreamListBox.SelectedIndex != PreviousStreamSelectionIndex)) { Application.UseWaitCursor = true; Application.DoEvents(); var stream = (StreamListBox.SelectedItem as MSFStream); var bytes = stream.GetFlattenedBuffer(); if (bytes != null) { ByteEditorControl.SetBytes(bytes); } else { ByteEditorControl.SetBytes(new byte[0]); } var itemcache = new List <ListViewItem>(); stream.PopulateAnalysis(AnalysisListView, AnalysisTreeView, itemcache); Application.UseWaitCursor = false; } PreviousStreamSelectionIndex = StreamListBox.SelectedIndex; }
public Form2() { InitializeComponent(); button1.Enabled = false; button4.Enabled = true; button6.Enabled = false; button8.Enabled = false; button9.Enabled = false; toolTip1.Draw += new DrawToolTipEventHandler(toolTip1_Draw); //initializing hex viewer byt.Location = new Point(0, 414); byt.Size = new Size(1018, 157); byte[] inithex = new byte[64]; byt.SetBytes(inithex); Controls.Add(byt); //popup button name button1.MouseHover += new EventHandler(mouseHoverResponse_button); button2.MouseHover += new EventHandler(mouseHoverResponse_button); button3.MouseHover += new EventHandler(mouseHoverResponse_button); button4.MouseHover += new EventHandler(mouseHoverResponse_button); button5.MouseHover += new EventHandler(mouseHoverResponse_button); button6.MouseHover += new EventHandler(mouseHoverResponse_button); button7.MouseHover += new EventHandler(mouseHoverResponse_button); button8.MouseHover += new EventHandler(mouseHoverResponse_button); button9.MouseHover += new EventHandler(mouseHoverResponse_button); //save nodes initial text bframe = treeView1.Nodes[0].Text; bframeNum = treeView1.Nodes[0].Nodes[4].Text;; bframelentgh = treeView1.Nodes[0].Nodes[5].Text; bcapturelength = treeView1.Nodes[0].Nodes[6].Text; bethernet = treeView1.Nodes[1].Text; bip = treeView1.Nodes[2].Text; bTransmission = treeView1.Nodes[3].Text; binterface = treeView1.Nodes[0].Nodes[0].Text; bTim = treeView1.Nodes[0].Nodes[2].Text; bsourceMac = treeView1.Nodes[1].Nodes[1].Text; bdestMac = treeView1.Nodes[1].Nodes[0].Text; btype = treeView1.Nodes[1].Nodes[2].Text; bversion = treeView1.Nodes[2].Nodes[0].Text; bHeaderLength = treeView1.Nodes[2].Nodes[1].Text; bTimeToLive = treeView1.Nodes[2].Nodes[2].Text; bprotocol = treeView1.Nodes[2].Nodes[3].Text; bsource = treeView1.Nodes[2].Nodes[4].Text; bdest = treeView1.Nodes[2].Nodes[5].Text; bsourcePort = treeView1.Nodes[3].Nodes[0].Text; bdestPort = treeView1.Nodes[3].Nodes[1].Text; bFlags = treeView1.Nodes[3].Nodes[2].Text; getPackets(); }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void soundList_SelectedIndexChanged(object sender, EventArgs e) { if (soundList.SelectedItem is SEMSound s) { byteView.SetBytes(s.CommandData); } else { byteView.SetBytes(null); } }
private void dgvDMA_SelectionChanged(object sender, EventArgs e) { if (dgvDMA.SelectedCells.Count == 1) { _byteViewer.SetBytes(SF64ROM.Instance.DMATable[dgvDMA.SelectedCells[0].RowIndex].GetAsBytes()); } else { _byteViewer.SetBytes(new byte[0]); } }
public void ByteViewer_SetBytes_Invoke_GetReturnExpected(byte[] bytes) { using var control = new ByteViewer(); control.SetBytes(bytes); Assert.Same(bytes, control.GetBytes()); Assert.False(control.IsHandleCreated); // Set same. control.SetBytes(bytes); Assert.Same(bytes, control.GetBytes()); Assert.False(control.IsHandleCreated); }
public BlockInfo(wCpuBlock block) { InitializeComponent(); Text = "Block Information - " + block.ToString(); txtBlock.Text = block.ToString(); txtName.Text = block.name; txtAuthor.Text = block.author; txtFamily.Text = block.family; txtLanguage.Text = block.language.ToString(); txtLocalData.Text = block.localData.ToString(); txtLoadSize.Text = block.loadSize.ToString() + " bytes"; txtMC7Size.Text = block.MC7Size.ToString() + " bytes"; txtSBBLength.Text = block.SBBLength.ToString() + " bytes"; txtCodeDate.Text = block.codeDate; txtInterfaceDate.Text = block.interfaceDate; //Format checksum as hex (ab cd) txtChecksum.Text = block.checksum.ToString("x4").Insert(2, " "); txtFlags.Text = block.blockFlags.ToString("x4").Insert(2, " "); txtVersion.Text = block.version.ToString("x4").Insert(2, " "); //TODO Fix this shit if (block.data != null && false) { ByteViewer bv = new ByteViewer(); bv.SetBytes(block.data); bv.Location = new Point(12, 148); bv.Size = new Size(419, 222); Controls.Add(bv); byte[] data = new byte[block.loadSize - 10]; Array.Copy(block.data, data, data.Length); txtTestChecksum.Text = Crc16.ComputeChecksum(data).ToString("x4").Insert(2, " "); } else { } }
/// <summary> /// /// </summary> public HexForm() { ThisMenu = new MainMenu(); DataMenuCollection = new MenuItem() { Text = "数据" }; ThisMenu.MenuItems.Add(DataMenuCollection); ThisForm = new Form() { Width = 650, Height = 800, MaximizeBox = false, FormBorderStyle = FormBorderStyle.FixedSingle, Menu = ThisMenu, }; ThisForm.FormClosing += ThisForm_FormClosing; ThisForm.FormClosed += ThisForm_FormClosed; HexEditor = new ByteViewer() { Dock = DockStyle.Fill }; var data = new byte[0]; HexEditor.SetBytes(data); ThisForm.Controls.Add(HexEditor); ThisForm.Show(); }
public void ByteViewer_SetStartLine_InvokeWithBytesWithHandle_Success(byte[] bytes, int line) { using var control = new ByteViewer(); control.SetBytes(bytes); Assert.NotEqual(IntPtr.Zero, control.Handle); int invalidatedCallCount = 0; control.Invalidated += (sender, e) => invalidatedCallCount++; int styleChangedCallCount = 0; control.StyleChanged += (sender, e) => styleChangedCallCount++; int createdCallCount = 0; control.HandleCreated += (sender, e) => createdCallCount++; control.SetStartLine(line); Assert.True(control.IsHandleCreated); Assert.Equal(0, invalidatedCallCount); Assert.Equal(0, styleChangedCallCount); Assert.Equal(0, createdCallCount); // Call again. control.SetStartLine(line); Assert.True(control.IsHandleCreated); Assert.Equal(0, invalidatedCallCount); Assert.Equal(0, styleChangedCallCount); Assert.Equal(0, createdCallCount); }
public void ByteViewer_SetDisplayMode_InvokeWithBytesWithHandle_GetReturnsExpected(DisplayMode value, int expectedInvalidatedCallCount1, int expectedInvalidatedCallCount2) { using var control = new ByteViewer(); control.SetBytes(new byte[] { 1, 2, 3 }); Assert.NotEqual(IntPtr.Zero, control.Handle); int invalidatedCallCount = 0; control.Invalidated += (sender, e) => invalidatedCallCount++; int styleChangedCallCount = 0; control.StyleChanged += (sender, e) => styleChangedCallCount++; int createdCallCount = 0; control.HandleCreated += (sender, e) => createdCallCount++; control.SetDisplayMode(value); Assert.Equal(value, control.GetDisplayMode()); Assert.True(control.IsHandleCreated); Assert.Equal(expectedInvalidatedCallCount1, invalidatedCallCount); Assert.Equal(0, styleChangedCallCount); Assert.Equal(0, createdCallCount); // Set same. control.SetDisplayMode(value); Assert.Equal(value, control.GetDisplayMode()); Assert.True(control.IsHandleCreated); Assert.Equal(expectedInvalidatedCallCount2, invalidatedCallCount); Assert.Equal(0, styleChangedCallCount); Assert.Equal(0, createdCallCount); }
public void ByteViewer_SetFile_InvokeWithBytes_Success() { using var control = new ByteViewer(); control.SetBytes(new byte[] { 4, 5, 6 }); using TempFile file = TempFile.Create(new byte[] { 1, 2, 3 }); control.SetFile(file.Path); Assert.Equal(new byte[] { 1, 2, 3, 0 }, control.GetBytes()); }
private void Menuitem_Click(object sender, EventArgs e) { var dataitem = ((sender as MenuItem)?.Tag as DataItem); if (dataitem == null) { return; } HexEditor.SetBytes(dataitem.Buff); }
public frmHexViewer(byte[] data) { InitializeComponent(); var ctrl = new ByteViewer(); ctrl.SetBytes(data); ctrl.Dock = DockStyle.Fill; this.Controls.Add(ctrl); }
public void ByteViewer_SetDisplayMode_UnicodeWithBytes_EditReturnsExpected(byte[] bytes, string expected) { using var control = new ByteViewer(); control.SetBytes(bytes); control.SetDisplayMode(DisplayMode.Unicode); TextBox textBox = control.Controls.OfType <TextBox>().Single(); ScrollBar scrollBar = control.Controls.OfType <ScrollBar>().Single(); Assert.Equal(expected, textBox.Text); Assert.True(textBox.Visible); Assert.False(scrollBar.Visible); Assert.False(control.IsHandleCreated); // Set different. control.SetBytes(new byte[] { (byte)'1', 0, (byte)'2', 0, (byte)'3', 0 }); Assert.Equal("123", textBox.Text); Assert.True(textBox.Visible); Assert.False(scrollBar.Visible); Assert.False(control.IsHandleCreated); }
public static void LoadMemoryView() { GoogleAnalyticsApi.TrackEvent("PatchEditor.cs", "LoadMemoryView", ""); byte[] someBytes = new byte[512]; IntPtr pw = Memory.OpenProcess(0x001F0FFF, true, MainForm.HaloOnline.Id); int readAt = (int)PatchEditor.CurrentPatchAddress; someBytes = Memory.ReadMemory((int)pw, readAt, 512); bv.SetBytes(someBytes); }
public void ByteViewer_SetStartLine_InvokeWithBytes_Success(byte[] bytes, int line) { using var control = new ByteViewer(); control.SetBytes(bytes); control.SetStartLine(line); Assert.False(control.IsHandleCreated); // Call again. control.SetStartLine(line); Assert.False(control.IsHandleCreated); }
public HexEditorControl(DefaultRepresentation data) { _data = data; InitializeComponent(); var byteviewer = new ByteViewer(); byteviewer.Dock = DockStyle.Fill; if (data.Blob == null) { byteviewer.SetBytes(new byte[] {}); } else { byteviewer.SetBytes(data.Blob); } byteviewer.SetDisplayMode(DisplayMode.Hexdump); Controls.Add(byteviewer); }
public static void Show(byte[] data) { Form f = new Form(); f.Text = "Hex editor"; ByteViewer bv = new ByteViewer(); bv.Dock = DockStyle.Fill; f.Controls.Add(bv); bv.SetBytes(data); f.TopMost = true; f.Show(); }
public ByteViewerForm() { // Initialize the controls other than the ByteViewer. InitializeForm(); // Initialize the ByteViewer. byteviewer = new ByteViewer(); byteviewer.Location = new Point(8, 46); byteviewer.Size = new Size(600, 338); byteviewer.Anchor = AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Top; byteviewer.SetBytes(new byte[] { }); this.Controls.Add(byteviewer); this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); }
public void ByteViewer_SetDisplayMode_InvokeWithBytes_GetReturnsExpected(DisplayMode value) { using var control = new ByteViewer(); control.SetBytes(new byte[] { 1, 2, 3 }); control.SetDisplayMode(value); Assert.Equal(value, control.GetDisplayMode()); Assert.False(control.IsHandleCreated); // Set same. control.SetDisplayMode(value); Assert.Equal(value, control.GetDisplayMode()); Assert.False(control.IsHandleCreated); }
public HexEditorControl(byte[] data) { InitializeComponent(); var byteviewer = new ByteViewer(); byteviewer.Dock = DockStyle.Fill; byteviewer.SetBytes(data); byteviewer.SetDisplayMode(DisplayMode.Hexdump); Controls.Add(byteviewer); }
private void CreateByteViewer(OpenFileDialog ofd, Form form) { panel = new Panel(); byteViewer = new ByteViewer(); byteViewer.Dock = DockStyle.Fill; byteViewer.SetBytes(new byte[] { }); byteViewer.SetFile(ofd.FileName); panel.Location = new System.Drawing.Point(12, 54); panel.Name = "panel"; panel.Size = new System.Drawing.Size(617, 330); panel.TabIndex = 2; form.Controls.Add(panel); panel.Controls.Add(byteViewer); }
public Form1() { InitializeComponent(); InitializeForm(); byteviewer = new ByteViewer(); byteviewer.Location = new Point(8, 66); byteviewer.Size = new Size(700, 338); byteviewer.Anchor = AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Top; byteviewer.SetBytes(new byte[] { }); this.Controls.Add(byteviewer); MaximizeBox = false; MinimizeBox = false; FormBorderStyle = FormBorderStyle.FixedSingle; }
/// <summary> /// Load data in Text tab. /// </summary> /// <param name="nodo"></param> /// <param name="ext"></param> private void LoadText(CFNode nodo, string ext) { CompoundFile compoundFile = _listCF[nodo.CFidx]; CFStream stream = CFUtil.GetStream(ref compoundFile, nodo.Path, nodo.Name); MemoryStream memoryStream = MSUtil.CFtoMStream(stream); MemoryStream stream2; if (ext == "") { stream2 = MSUtil.RemoveTrailingSegment(memoryStream, 12); } else if (MSUtil.IsCompressedWithLW77(stream)) { stream2 = MSUtil.UncompressLW77(memoryStream); } else { stream2 = MSUtil.RemoveTrailingSegment(memoryStream, 8); } StreamReader streamReader = new StreamReader(stream2, (ext == ".csv") ? Encoding.ASCII : Encoding.Unicode); RtfViewer.Text = streamReader.ReadToEnd(); byteViewer.SetBytes(memoryStream.ToArray()); }
public static Boolean ReadMemory(IntPtr hProcess, IntPtr BaseAddress, int bufferSize, ByteViewer bv) { int read; byte[] rbuffer = new byte[bufferSize]; bool result = Win32API.ReadProcessMemory(hProcess, BaseAddress, rbuffer, bufferSize, out read); if (result == false) { MessageBox.Show("메모리 읽기 실패", "MyFunc.ReadMemory() Error"); return(false); } bv.SetBytes(rbuffer); return(true); }
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (listBox1.SelectedItem == null) { return; } Message message = (Message)listBox1.SelectedItem; byte[] viewer = new byte[message.DataLen]; for (int i = 0; i < message.DataLen; ++i) { viewer[i] = (byte)message.Data[i]; } _byteViewer.SetBytes(viewer); }
public void ByteViewer_SaveToFile_InvokeWithBytes_Success() { using var control = new ByteViewer(); control.SetBytes(new byte[] { 1, 2, 3 }); string path = "ByteViewerContent"; try { control.SaveToFile(path); Assert.Equal(new byte[] { 1, 2, 3 }, File.ReadAllBytes(path)); } finally { File.Delete(path); } }
private void timerPackets_Tick(object sender, EventArgs e) { try { List <L2RPacketArrivalEventArgs> tmpPackets = _Packets; foreach (var packet in tmpPackets) { if (packet.Packet is PacketClanInfoReadResult) { ByteViewer bv = new ByteViewer(); bv.SetBytes(packet.PacketBytes); // or SetBytes } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
public CFviewer(CompoundFile cf) { InitializeComponent(); _tabHexViewer = tabHexViewer; _tabTextViewer = tabTextViewer; _tabImageViewer = tabImageViewer; tabControl1.Controls.Remove(tabHexViewer); tabControl1.Controls.Remove(tabTextViewer); tabControl1.Controls.Remove(tabImageViewer); byteViewer = new ByteViewer(); byteViewer.SetBytes(new byte[0]); byteViewer.Dock = DockStyle.Fill; tabHexViewer.Controls.Add(byteViewer); _icons.Images.Add(Properties.Resources.brown_cab); _icons.Images.Add(Properties.Resources.blue_cab); _icons.Images.Add(Properties.Resources.closed_folder); _icons.Images.Add(Properties.Resources.open_folder); _icons.Images.Add(Properties.Resources.any_file); treeView1.ImageList = _icons; SetRoot("Root", 0); _listCF.Add(cf); FormClosing += new FormClosingEventHandler(CFviewerIsClosing); }
private TabPage ProcessFile(string fileName, byte[] input, TreeViewWithSearchResults.TreeViewPackageTag currentPackage) { var tab = new TabPage(); var vrfGuiContext = new VrfGuiContext(fileName, currentPackage); uint magic = 0; ushort magicResourceVersion = 0; if (input != null) { if (input.Length >= 6) { magic = BitConverter.ToUInt32(input, 0); magicResourceVersion = BitConverter.ToUInt16(input, 4); } } else { var magicData = new byte[6]; using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { fs.Read(magicData, 0, 6); } magic = BitConverter.ToUInt32(magicData, 0); magicResourceVersion = BitConverter.ToUInt16(magicData, 4); } if (magic != Package.MAGIC && input == null && Regex.IsMatch(fileName, @"_[0-9]{3}\.vpk$")) { // TODO: Update tab name fileName = $"{fileName.Substring(0, fileName.Length - 8)}_dir.vpk"; magic = Package.MAGIC; } if (magic == Package.MAGIC) { var package = new Package(); if (input != null) { package.SetFileName(fileName); package.Read(new MemoryStream(input)); } else { package.Read(fileName); } // create a TreeView with search capabilities, register its events, and add it to the tab var treeViewWithSearch = new TreeViewWithSearchResults(ImageList); treeViewWithSearch.InitializeTreeViewFromPackage(fileName, new TreeViewWithSearchResults.TreeViewPackageTag { Package = package, ParentPackage = currentPackage?.Package, }); treeViewWithSearch.TreeNodeMouseDoubleClick += VPK_OpenFile; treeViewWithSearch.TreeNodeMouseClick += VPK_OnClick; treeViewWithSearch.ListViewItemDoubleClick += VPK_OpenFile; treeViewWithSearch.ListViewItemRightClick += VPK_OnClick; treeViewWithSearch.Disposed += VPK_Disposed; tab.Controls.Add(treeViewWithSearch); // since we're in a separate thread, invoke to update the UI Invoke((MethodInvoker)(() => findToolStripButton.Enabled = true)); } else if (magic == CompiledShader.MAGIC) { var shader = new CompiledShader(); var buffer = new StringWriter(); var oldOut = Console.Out; Console.SetOut(buffer); if (input != null) { shader.Read(fileName, new MemoryStream(input)); } else { shader.Read(fileName); } Console.SetOut(oldOut); var control = new TextBox(); control.Font = new Font(FontFamily.GenericMonospace, control.Font.Size); control.Text = NormalizeLineEndings(buffer.ToString()); control.Dock = DockStyle.Fill; control.Multiline = true; control.ReadOnly = true; control.ScrollBars = ScrollBars.Both; tab.Controls.Add(control); } else if (magic == ClosedCaptions.MAGIC) { var captions = new ClosedCaptions(); if (input != null) { captions.Read(fileName, new MemoryStream(input)); } else { captions.Read(fileName); } var control = new DataGridView { Dock = DockStyle.Fill, AutoSize = true, ReadOnly = true, AllowUserToAddRows = false, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, DataSource = new BindingSource(new BindingList <ClosedCaption>(captions.Captions), null), ScrollBars = ScrollBars.Both, }; tab.Controls.Add(control); } else if (magic == ToolsAssetInfo.MAGIC) { var toolsAssetInfo = new ToolsAssetInfo(); if (input != null) { toolsAssetInfo.Read(new MemoryStream(input)); } else { toolsAssetInfo.Read(fileName); } var text = new TextBox { Dock = DockStyle.Fill, ScrollBars = ScrollBars.Vertical, Multiline = true, ReadOnly = true, Text = NormalizeLineEndings(toolsAssetInfo.ToString()), }; tab.Controls.Add(text); } else if (magic == BinaryKV3.MAGIC || magic == BinaryKV3.MAGIC2) { var kv3 = new BinaryKV3(); Stream kv3stream; if (input != null) { kv3stream = new MemoryStream(input); } else { kv3stream = File.OpenRead(fileName); } using (var binaryReader = new BinaryReader(kv3stream)) { kv3.Size = (uint)kv3stream.Length; kv3.Read(binaryReader, null); } kv3stream.Close(); var control = new TextBox(); control.Font = new Font(FontFamily.GenericMonospace, control.Font.Size); control.Text = kv3.ToString(); control.Dock = DockStyle.Fill; control.Multiline = true; control.ReadOnly = true; control.ScrollBars = ScrollBars.Both; tab.Controls.Add(control); } else if (magicResourceVersion == Resource.KnownHeaderVersion) { var resource = new Resource(); if (input != null) { resource.Read(new MemoryStream(input)); } else { resource.Read(fileName); } var resTabs = new TabControl { Dock = DockStyle.Fill, }; switch (resource.ResourceType) { case ResourceType.Texture: var tab2 = new TabPage("TEXTURE") { AutoScroll = true, }; try { var tex = (Texture)resource.DataBlock; var control = new Forms.Texture { BackColor = Color.Black, }; control.SetImage(tex.GenerateBitmap().ToBitmap(), Path.GetFileNameWithoutExtension(fileName), tex.Width, tex.Height); tab2.Controls.Add(control); Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as an image", fileName, new ExportData { Resource = resource }); } catch (Exception e) { var control = new TextBox { Dock = DockStyle.Fill, Font = new Font(FontFamily.GenericMonospace, 8), Multiline = true, ReadOnly = true, Text = e.ToString(), }; tab2.Controls.Add(control); } resTabs.TabPages.Add(tab2); break; case ResourceType.Panorama: if (((Panorama)resource.DataBlock).Names.Count > 0) { var nameTab = new TabPage("PANORAMA NAMES"); var nameControl = new DataGridView { Dock = DockStyle.Fill, AutoSize = true, ReadOnly = true, AllowUserToAddRows = false, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, DataSource = new BindingSource(new BindingList <Panorama.NameEntry>(((Panorama)resource.DataBlock).Names), null), }; nameTab.Controls.Add(nameControl); resTabs.TabPages.Add(nameTab); } break; case ResourceType.PanoramaLayout: Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as XML", fileName, new ExportData { Resource = resource }); break; case ResourceType.PanoramaScript: Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as JS", fileName, new ExportData { Resource = resource }); break; case ResourceType.PanoramaStyle: Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as CSS", fileName, new ExportData { Resource = resource }); break; case ResourceType.Particle: var viewerControl = new GLParticleViewer(vrfGuiContext); viewerControl.Load += (_, __) => { var particleSystem = (ParticleSystem)resource.DataBlock; var particleRenderer = new ParticleRenderer(particleSystem, vrfGuiContext); viewerControl.AddRenderer(particleRenderer); }; var particleRendererTab = new TabPage("PARTICLE"); particleRendererTab.Controls.Add(viewerControl.Control); resTabs.TabPages.Add(particleRendererTab); break; case ResourceType.Sound: var soundTab = new TabPage("SOUND"); var ap = new AudioPlayer(resource, soundTab); resTabs.TabPages.Add(soundTab); Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as {((Sound)resource.DataBlock).SoundType}", fileName, new ExportData { Resource = resource }); break; case ResourceType.World: var worldmeshTab = new TabPage("MAP"); worldmeshTab.Controls.Add(new GLWorldViewer(vrfGuiContext, (World)resource.DataBlock).ViewerControl); resTabs.TabPages.Add(worldmeshTab); break; case ResourceType.WorldNode: var nodemeshTab = new TabPage("WORLD NODE"); nodemeshTab.Controls.Add(new GLWorldViewer(vrfGuiContext, (WorldNode)resource.DataBlock).ViewerControl); resTabs.TabPages.Add(nodemeshTab); break; case ResourceType.Model: var modelRendererTab = new TabPage("MODEL"); modelRendererTab.Controls.Add(new GLModelViewer(vrfGuiContext, (Model)resource.DataBlock).ViewerControl); resTabs.TabPages.Add(modelRendererTab); break; case ResourceType.Mesh: if (!resource.ContainsBlockType(BlockType.VBIB)) { Console.WriteLine("Old style model, no VBIB!"); break; } Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as OBJ", fileName, new ExportData { Resource = resource, VrfGuiContext = vrfGuiContext }); var meshRendererTab = new TabPage("MESH"); meshRendererTab.Controls.Add(new GLModelViewer(vrfGuiContext, new Mesh(resource)).ViewerControl); resTabs.TabPages.Add(meshRendererTab); break; case ResourceType.Material: var materialViewerControl = new GLMaterialViewer(); materialViewerControl.Load += (_, __) => { var material = vrfGuiContext.MaterialLoader.LoadMaterial(resource); var materialRenderer = new MaterialRenderer(material, vrfGuiContext); materialViewerControl.AddRenderer(materialRenderer); }; var materialRendererTab = new TabPage("MATERIAL"); materialRendererTab.Controls.Add(materialViewerControl.Control); resTabs.TabPages.Add(materialRendererTab); break; } foreach (var block in resource.Blocks) { if (block.Type == BlockType.RERL) { var externalRefsTab = new TabPage("External Refs"); var externalRefs = new DataGridView { Dock = DockStyle.Fill, AutoGenerateColumns = true, AutoSize = true, ReadOnly = true, AllowUserToAddRows = false, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, DataSource = new BindingSource(new BindingList <ResourceExtRefList.ResourceReferenceInfo>(resource.ExternalReferences.ResourceRefInfoList), null), }; externalRefsTab.Controls.Add(externalRefs); resTabs.TabPages.Add(externalRefsTab); continue; } if (block.Type == BlockType.NTRO) { if (((ResourceIntrospectionManifest)block).ReferencedStructs.Count > 0) { var externalRefsTab = new TabPage("Introspection Manifest: Structs"); var externalRefs = new DataGridView { Dock = DockStyle.Fill, AutoGenerateColumns = true, AutoSize = true, ReadOnly = true, AllowUserToAddRows = false, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, DataSource = new BindingSource(new BindingList <ResourceIntrospectionManifest.ResourceDiskStruct>(((ResourceIntrospectionManifest)block).ReferencedStructs), null), }; externalRefsTab.Controls.Add(externalRefs); resTabs.TabPages.Add(externalRefsTab); } if (((ResourceIntrospectionManifest)block).ReferencedEnums.Count > 0) { var externalRefsTab = new TabPage("Introspection Manifest: Enums"); var externalRefs2 = new DataGridView { Dock = DockStyle.Fill, AutoGenerateColumns = true, AutoSize = true, ReadOnly = true, AllowUserToAddRows = false, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, DataSource = new BindingSource(new BindingList <ResourceIntrospectionManifest.ResourceDiskEnum>(((ResourceIntrospectionManifest)block).ReferencedEnums), null), }; externalRefsTab.Controls.Add(externalRefs2); resTabs.TabPages.Add(externalRefsTab); } //continue; } var tab2 = new TabPage(block.Type.ToString()); try { var control = new TextBox(); control.Font = new Font(FontFamily.GenericMonospace, control.Font.Size); if (block.Type == BlockType.DATA) { switch (resource.ResourceType) { case ResourceType.Sound: control.Text = NormalizeLineEndings(((Sound)block).ToString()); break; case ResourceType.Particle: case ResourceType.Mesh: if (block is BinaryKV3 blockKeyvalues) { //Wrap it around a KV3File object to get the header. control.Text = NormalizeLineEndings(blockKeyvalues.GetKV3File().ToString()); } else if (block is NTRO blockNTRO) { control.Text = NormalizeLineEndings(blockNTRO.ToString()); } break; default: control.Text = NormalizeLineEndings(block.ToString()); break; } } else { control.Text = NormalizeLineEndings(block.ToString()); } control.Dock = DockStyle.Fill; control.Multiline = true; control.ReadOnly = true; control.ScrollBars = ScrollBars.Both; tab2.Controls.Add(control); } catch (Exception e) { Console.WriteLine(e); var bv = new ByteViewer(); bv.Dock = DockStyle.Fill; tab2.Controls.Add(bv); Invoke((MethodInvoker)(() => { resource.Reader.BaseStream.Position = block.Offset; bv.SetBytes(resource.Reader.ReadBytes((int)block.Size)); })); } resTabs.TabPages.Add(tab2); } if (resource.ResourceType == ResourceType.PanoramaLayout || resource.ResourceType == ResourceType.PanoramaScript || resource.ResourceType == ResourceType.PanoramaStyle || resource.ResourceType == ResourceType.SoundEventScript || resource.ResourceType == ResourceType.SoundStackScript || resource.ResourceType == ResourceType.EntityLump) { resTabs.SelectTab(resTabs.TabCount - 1); } tab.Controls.Add(resTabs); } else { var resTabs = new TabControl { Dock = DockStyle.Fill, }; tab.Controls.Add(resTabs); var bvTab = new TabPage("Hex"); var bv = new ByteViewer { Dock = DockStyle.Fill, }; bvTab.Controls.Add(bv); resTabs.TabPages.Add(bvTab); if (input == null) { input = File.ReadAllBytes(fileName); } if (!input.Contains <byte>(0x00)) { var textTab = new TabPage("Text"); var text = new TextBox { Dock = DockStyle.Fill, ScrollBars = ScrollBars.Vertical, Multiline = true, ReadOnly = true, Text = System.Text.Encoding.UTF8.GetString(input), }; textTab.Controls.Add(text); resTabs.TabPages.Add(textTab); resTabs.SelectedTab = textTab; } Invoke((MethodInvoker)(() => { bv.SetBytes(input); })); } return(tab); }
private TabPage ProcessFile(string fileName, byte[] input, Package currentPackage) { var tab = new TabPage(); var vrfGuiContext = new VrfGuiContext { FileName = fileName, CurrentPackage = currentPackage, }; uint magic = 0; ushort magicResourceVersion = 0; if (input != null) { magic = BitConverter.ToUInt32(input, 0); magicResourceVersion = BitConverter.ToUInt16(input, 4); } else { var magicData = new byte[6]; using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { fs.Read(magicData, 0, 6); } magic = BitConverter.ToUInt32(magicData, 0); magicResourceVersion = BitConverter.ToUInt16(magicData, 4); } if (magic != Package.MAGIC && input == null && Regex.IsMatch(fileName, @"_[0-9]{3}\.vpk$")) { // TODO: Update tab name fileName = $"{fileName.Substring(0, fileName.Length - 8)}_dir.vpk"; magic = Package.MAGIC; } if (magic == Package.MAGIC || fileName.EndsWith(".vpk", StringComparison.Ordinal)) { var package = new Package(); if (input != null) { package.SetFileName(fileName); package.Read(new MemoryStream(input)); } else { package.Read(fileName); } // create a TreeView with search capabilities, register its events, and add it to the tab var treeViewWithSearch = new TreeViewWithSearchResults(ImageList) { Dock = DockStyle.Fill, }; treeViewWithSearch.InitializeTreeViewFromPackage("treeViewVpk", package); treeViewWithSearch.TreeNodeMouseDoubleClick += VPK_OpenFile; treeViewWithSearch.TreeNodeMouseClick += VPK_OnClick; treeViewWithSearch.ListViewItemDoubleClick += VPK_OpenFile; treeViewWithSearch.ListViewItemRightClick += VPK_OnClick; tab.Controls.Add(treeViewWithSearch); // since we're in a separate thread, invoke to update the UI Invoke((MethodInvoker)(() => findToolStripButton.Enabled = true)); } else if (magic == CompiledShader.MAGIC || fileName.EndsWith(".vcs", StringComparison.Ordinal)) { var shader = new CompiledShader(); var buffer = new StringWriter(); var oldOut = Console.Out; Console.SetOut(buffer); if (input != null) { shader.Read(fileName, new MemoryStream(input)); } else { shader.Read(fileName); } Console.SetOut(oldOut); var control = new TextBox(); control.Font = new Font(FontFamily.GenericMonospace, control.Font.Size); control.Text = NormalizeLineEndings(buffer.ToString()); control.Dock = DockStyle.Fill; control.Multiline = true; control.ReadOnly = true; control.ScrollBars = ScrollBars.Both; tab.Controls.Add(control); } else if (magic == ClosedCaptions.MAGIC || fileName.EndsWith(".dat", StringComparison.Ordinal)) { var captions = new ClosedCaptions(); if (input != null) { captions.Read(fileName, new MemoryStream(input)); } else { captions.Read(fileName); } var control = new DataGridView { Dock = DockStyle.Fill, AutoSize = true, ReadOnly = true, AllowUserToAddRows = false, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, DataSource = new BindingSource(new BindingList <ClosedCaption>(captions.Captions), null), ScrollBars = ScrollBars.Both, }; tab.Controls.Add(control); } else if (magic == BinaryKV3.MAGIC || magic == BinaryKV3.MAGIC2) { var kv3 = new BinaryKV3(); using (var file = File.OpenRead(fileName)) using (var binaryReader = new BinaryReader(file)) { kv3.Size = (uint)file.Length; kv3.Read(binaryReader, null); } var control = new TextBox(); control.Font = new Font(FontFamily.GenericMonospace, control.Font.Size); control.Text = kv3.ToString(); control.Dock = DockStyle.Fill; control.Multiline = true; control.ReadOnly = true; control.ScrollBars = ScrollBars.Both; tab.Controls.Add(control); } else if (magicResourceVersion == Resource.KnownHeaderVersion || fileName.EndsWith("_c", StringComparison.Ordinal)) { var resource = new Resource(); if (input != null) { resource.Read(new MemoryStream(input)); } else { resource.Read(fileName); } var resTabs = new TabControl { Dock = DockStyle.Fill, }; switch (resource.ResourceType) { case ResourceType.Texture: var tab2 = new TabPage("TEXTURE") { AutoScroll = true, }; try { var tex = (Texture)resource.Blocks[BlockType.DATA]; var control = new Forms.Texture { BackColor = Color.Black, }; control.SetImage(tex.GenerateBitmap().ToBitmap(), Path.GetFileNameWithoutExtension(fileName), tex.Width, tex.Height); tab2.Controls.Add(control); Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as an image", fileName, new ExportData { Resource = resource }); } catch (Exception e) { var control = new TextBox { Dock = DockStyle.Fill, Font = new Font(FontFamily.GenericMonospace, 8), Multiline = true, ReadOnly = true, Text = e.ToString(), }; tab2.Controls.Add(control); } resTabs.TabPages.Add(tab2); break; case ResourceType.Panorama: if (((Panorama)resource.Blocks[BlockType.DATA]).Names.Count > 0) { var nameTab = new TabPage("PANORAMA NAMES"); var nameControl = new DataGridView { Dock = DockStyle.Fill, AutoSize = true, ReadOnly = true, AllowUserToAddRows = false, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, DataSource = new BindingSource(new BindingList <Panorama.NameEntry>(((Panorama)resource.Blocks[BlockType.DATA]).Names), null), }; nameTab.Controls.Add(nameControl); resTabs.TabPages.Add(nameTab); } break; case ResourceType.PanoramaLayout: Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as XML", fileName, new ExportData { Resource = resource }); break; case ResourceType.PanoramaScript: Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as JS", fileName, new ExportData { Resource = resource }); break; case ResourceType.PanoramaStyle: Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as CSS", fileName, new ExportData { Resource = resource }); break; case ResourceType.Particle: var particleGLControl = new GLRenderControl(); particleGLControl.Load += (_, __) => { particleGLControl.Camera.SetViewportSize(particleGLControl.Control.Width, particleGLControl.Control.Height); particleGLControl.Camera.SetLocation(new Vector3(200)); particleGLControl.Camera.LookAt(new Vector3(0)); var particleSystem = new ParticleSystem(resource); var particleGrid = new ParticleGrid(20, 5); var particleRenderer = new ParticleRenderer(particleSystem, vrfGuiContext); particleGLControl.Paint += (sender, args) => { particleGrid.Render(args.Camera.ProjectionMatrix, args.Camera.CameraViewMatrix); // Updating FPS-coupled dynamic step particleRenderer.Update(args.FrameTime); particleRenderer.Render(args.Camera); }; }; var particleRendererTab = new TabPage("PARTICLE"); particleRendererTab.Controls.Add(particleGLControl.Control); resTabs.TabPages.Add(particleRendererTab); break; case ResourceType.Sound: var soundTab = new TabPage("SOUND"); var ap = new AudioPlayer(resource, soundTab); resTabs.TabPages.Add(soundTab); Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as {((Sound)resource.Blocks[BlockType.DATA]).Type}", fileName, new ExportData { Resource = resource }); break; case ResourceType.World: var world = new World(resource); var renderWorld = new RenderWorld(world); var worldmv = new Renderer(mainTabs, fileName, currentPackage, RenderSubject.World); renderWorld.AddObjects(worldmv, fileName, currentPackage); var worldmeshTab = new TabPage("MAP"); var worldglControl = worldmv.CreateGL(); worldmeshTab.Controls.Add(worldglControl); resTabs.TabPages.Add(worldmeshTab); break; case ResourceType.WorldNode: var node = new RenderWorldNode(resource); var nodemv = new Renderer(mainTabs, fileName, currentPackage); node.AddMeshes(nodemv, fileName, currentPackage); var nodemeshTab = new TabPage("MAP"); var nodeglControl = nodemv.CreateGL(); nodemeshTab.Controls.Add(nodeglControl); resTabs.TabPages.Add(nodemeshTab); break; case ResourceType.Model: // Create model var model = new Model(resource); var renderModel = new RenderModel(model); // Create skeleton var skeleton = model.GetSkeleton(); // Create tab var modelmeshTab = new TabPage("MESH"); var modelmv = new Renderer(mainTabs, fileName, currentPackage, RenderSubject.Model); renderModel.LoadMeshes(modelmv, fileName, Matrix4.Identity, Vector4.One, currentPackage); // Add skeleton to renderer modelmv.SetSkeleton(skeleton); // Add animations if available var animGroupPaths = renderModel.GetAnimationGroups(); foreach (var animGroupPath in animGroupPaths) { var animGroup = FileExtensions.LoadFileByAnyMeansNecessary(animGroupPath + "_c", fileName, currentPackage); modelmv.AddAnimations(AnimationGroupLoader.LoadAnimationGroup(animGroup, fileName)); } //Initialise OpenGL var modelglControl = modelmv.CreateGL(); modelmeshTab.Controls.Add(modelglControl); resTabs.TabPages.Add(modelmeshTab); break; case ResourceType.Mesh: if (!resource.Blocks.ContainsKey(BlockType.VBIB)) { Console.WriteLine("Old style model, no VBIB!"); break; } var meshTab = new TabPage("MESH"); var mv = new Renderer(mainTabs, fileName, currentPackage, RenderSubject.Model); Invoke(new ExportDel(AddToExport), $"Export {Path.GetFileName(fileName)} as OBJ", fileName, new ExportData { Resource = resource, Renderer = mv }); mv.AddMeshObject(new MeshObject { Resource = resource }); var glControl = mv.CreateGL(); meshTab.Controls.Add(glControl); resTabs.TabPages.Add(meshTab); break; } foreach (var block in resource.Blocks) { if (block.Key == BlockType.RERL) { var externalRefsTab = new TabPage("External Refs"); var externalRefs = new DataGridView { Dock = DockStyle.Fill, AutoGenerateColumns = true, AutoSize = true, ReadOnly = true, AllowUserToAddRows = false, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, DataSource = new BindingSource(new BindingList <ResourceExtRefList.ResourceReferenceInfo>(resource.ExternalReferences.ResourceRefInfoList), null), }; externalRefsTab.Controls.Add(externalRefs); resTabs.TabPages.Add(externalRefsTab); continue; } if (block.Key == BlockType.NTRO) { if (((ResourceIntrospectionManifest)block.Value).ReferencedStructs.Count > 0) { var externalRefsTab = new TabPage("Introspection Manifest: Structs"); var externalRefs = new DataGridView { Dock = DockStyle.Fill, AutoGenerateColumns = true, AutoSize = true, ReadOnly = true, AllowUserToAddRows = false, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, DataSource = new BindingSource(new BindingList <ResourceIntrospectionManifest.ResourceDiskStruct>(((ResourceIntrospectionManifest)block.Value).ReferencedStructs), null), }; externalRefsTab.Controls.Add(externalRefs); resTabs.TabPages.Add(externalRefsTab); } if (((ResourceIntrospectionManifest)block.Value).ReferencedEnums.Count > 0) { var externalRefsTab = new TabPage("Introspection Manifest: Enums"); var externalRefs2 = new DataGridView { Dock = DockStyle.Fill, AutoGenerateColumns = true, AutoSize = true, ReadOnly = true, AllowUserToAddRows = false, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, DataSource = new BindingSource(new BindingList <ResourceIntrospectionManifest.ResourceDiskEnum>(((ResourceIntrospectionManifest)block.Value).ReferencedEnums), null), }; externalRefsTab.Controls.Add(externalRefs2); resTabs.TabPages.Add(externalRefsTab); } //continue; } var tab2 = new TabPage(block.Key.ToString()); try { var control = new TextBox(); control.Font = new Font(FontFamily.GenericMonospace, control.Font.Size); if (block.Key == BlockType.DATA) { switch (resource.ResourceType) { case ResourceType.Particle: case ResourceType.Mesh: //Wrap it around a KV3File object to get the header. control.Text = NormalizeLineEndings(((BinaryKV3)block.Value).GetKV3File().ToString()); break; default: control.Text = NormalizeLineEndings(block.Value.ToString()); break; } } else { control.Text = NormalizeLineEndings(block.Value.ToString()); } control.Dock = DockStyle.Fill; control.Multiline = true; control.ReadOnly = true; control.ScrollBars = ScrollBars.Both; tab2.Controls.Add(control); } catch (Exception e) { Console.WriteLine(e); var bv = new ByteViewer(); bv.Dock = DockStyle.Fill; tab2.Controls.Add(bv); Invoke((MethodInvoker)(() => { resource.Reader.BaseStream.Position = block.Value.Offset; bv.SetBytes(resource.Reader.ReadBytes((int)block.Value.Size)); })); } resTabs.TabPages.Add(tab2); } tab.Controls.Add(resTabs); } else { var resTabs = new TabControl { Dock = DockStyle.Fill, }; tab.Controls.Add(resTabs); var bvTab = new TabPage("Hex"); var bv = new ByteViewer { Dock = DockStyle.Fill, }; bvTab.Controls.Add(bv); resTabs.TabPages.Add(bvTab); if (input != null && !input.Contains <byte>(0x00)) { var textTab = new TabPage("Text"); var text = new TextBox { Dock = DockStyle.Fill, ScrollBars = ScrollBars.Vertical, Multiline = true, ReadOnly = true, Text = System.Text.Encoding.UTF8.GetString(input), }; textTab.Controls.Add(text); resTabs.TabPages.Add(textTab); resTabs.SelectedTab = textTab; } Invoke((MethodInvoker)(() => { if (input != null) { bv.SetBytes(input); } else { bv.SetFile(fileName); } })); } return(tab); }