コード例 #1
0
ファイル: MainForm.cs プロジェクト: zeaposs/epoch-language
        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;
        }
コード例 #2
0
        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();
        }
コード例 #3
0
 /// <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);
     }
 }
コード例 #4
0
 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]);
     }
 }
コード例 #5
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);
        }
コード例 #6
0
 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
     {
     }
 }
コード例 #7
0
        /// <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();
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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());
        }
コード例 #11
0
        private void Menuitem_Click(object sender, EventArgs e)
        {
            var dataitem = ((sender as MenuItem)?.Tag as DataItem);

            if (dataitem == null)
            {
                return;
            }
            HexEditor.SetBytes(dataitem.Buff);
        }
コード例 #12
0
        public frmHexViewer(byte[] data)
        {
            InitializeComponent();

            var ctrl = new ByteViewer();

            ctrl.SetBytes(data);
            ctrl.Dock = DockStyle.Fill;

            this.Controls.Add(ctrl);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
        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);
        }
コード例 #15
0
        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);
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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();
        }
コード例 #18
0
 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);
 }
コード例 #19
0
        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);
        }
コード例 #20
0
        public HexEditorControl(byte[] data)
        {
            InitializeComponent();

            var byteviewer = new ByteViewer();

            byteviewer.Dock = DockStyle.Fill;

            byteviewer.SetBytes(data);

            byteviewer.SetDisplayMode(DisplayMode.Hexdump);

            Controls.Add(byteviewer);
        }
コード例 #21
0
 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);
 }
コード例 #22
0
 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;
 }
コード例 #23
0
        /// <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());
        }
コード例 #24
0
        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);
        }
コード例 #25
0
        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);
        }
コード例 #26
0
        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);
            }
        }
コード例 #27
0
        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());
            }
        }
コード例 #28
0
        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);
        }
コード例 #29
0
        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);
        }
コード例 #30
0
        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);
        }