From 6b988e16fbd64bcd6d4ade2cb6f0aaabc6fd037d Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 5 Mar 2018 15:01:57 +0000 Subject: [PATCH] Add panel to view OS/2 icons, bitmaps and pointers in NE executables. --- exeinfogui/NE/TabNeResources.xeto.cs | 19 +++- exeinfogui/Os2/PanelOs2Bitmap.xeto | 42 +++++++++ exeinfogui/Os2/PanelOs2Bitmap.xeto.cs | 122 ++++++++++++++++++++++++++ exeinfogui/exeinfogui.csproj | 1 + 4 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 exeinfogui/Os2/PanelOs2Bitmap.xeto create mode 100644 exeinfogui/Os2/PanelOs2Bitmap.xeto.cs diff --git a/exeinfogui/NE/TabNeResources.xeto.cs b/exeinfogui/NE/TabNeResources.xeto.cs index 05197e2..266d0e3 100644 --- a/exeinfogui/NE/TabNeResources.xeto.cs +++ b/exeinfogui/NE/TabNeResources.xeto.cs @@ -27,6 +27,7 @@ using System; using System.Collections.Generic; using System.Linq; +using exeinfogui.Os2; using exeinfogui.Win16; using Eto.Forms; using Eto.Serialization.Xaml; @@ -35,13 +36,14 @@ namespace exeinfogui.NE { public class TabNeResources : TabPage { + PanelHexDump panelHexDump; PanelNeAccelerators panelNeAccelerators; PanelNeStrings panelNeStrings; + PanelOs2Bitmap panelOs2Bitmap; PanelWin16Version panelWin16Version; Panel pnlResource; TreeGridItemCollection treeData; TreeGridView treeResources; - PanelHexDump panelHexDump; public TabNeResources() { @@ -57,7 +59,8 @@ namespace exeinfogui.NE panelWin16Version = new PanelWin16Version(); panelNeStrings = new PanelNeStrings(); panelNeAccelerators = new PanelNeAccelerators(); - panelHexDump=new PanelHexDump(); + panelHexDump = new PanelHexDump(); + panelOs2Bitmap = new PanelOs2Bitmap(); } public void Update(IEnumerable resourceTypes, libexeinfo.NE.TargetOS os) @@ -116,6 +119,18 @@ namespace exeinfogui.NE case "RT_ACCELTABLE": pnlResource.Content = panelNeAccelerators; panelNeAccelerators.Update(data, libexeinfo.NE.TargetOS.OS2); + break; + case "RT_BITMAP" when (libexeinfo.NE.TargetOS)((TreeGridItem)treeResources.SelectedItem).Values[4] == + libexeinfo.NE.TargetOS.OS2: + case "RT_POINTER": + // TODO: Some do not contain valid OS/2 bitmaps + try + { + pnlResource.Content = panelOs2Bitmap; + panelOs2Bitmap.Update(data); + } + catch { goto default; } + break; default: pnlResource.Content = panelHexDump; diff --git a/exeinfogui/Os2/PanelOs2Bitmap.xeto b/exeinfogui/Os2/PanelOs2Bitmap.xeto new file mode 100644 index 0000000..d0b9cd6 --- /dev/null +++ b/exeinfogui/Os2/PanelOs2Bitmap.xeto @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/exeinfogui/Os2/PanelOs2Bitmap.xeto.cs b/exeinfogui/Os2/PanelOs2Bitmap.xeto.cs new file mode 100644 index 0000000..9f5fd18 --- /dev/null +++ b/exeinfogui/Os2/PanelOs2Bitmap.xeto.cs @@ -0,0 +1,122 @@ +using System; +using Eto.Drawing; +using Eto.Forms; +using Eto.Serialization.Xaml; +using Bitmap = libexeinfo.Os2.Bitmap; + +namespace exeinfogui.Os2 +{ + public class PanelOs2Bitmap : Panel + { + GridView grdIcons; + ImageView imgIcon; + Label lblColors; + Label lblSize; + Label lblType; + PanelHexDump panelHexDump; + Panel pnlPanel; + TextBox txtColors; + TextBox txtSize; + TextBox txtType; + + public PanelOs2Bitmap() + { + XamlReader.Load(this); + grdIcons.Columns.Add(new GridColumn + { + DataCell = + new TextBoxCell {Binding = Binding.Property(b => $"{b.Type}")}, + HeaderText = "Command" + }); + + grdIcons.Columns.Add(new GridColumn + { + DataCell = new TextBoxCell + { + Binding = Binding.Property(b => $"{b.Width}x{b.Height}") + }, + HeaderText = "Size" + }); + + grdIcons.Columns.Add(new GridColumn + { + DataCell = new TextBoxCell + { + Binding = Binding.Property(b => $"{1 << (int)b.BitsPerPixel}") + }, + HeaderText = "Colors" + }); + + grdIcons.AllowMultipleSelection = false; + grdIcons.SelectionChanged += GrdIconsOnSelectionChanged; + panelHexDump = new PanelHexDump(); + pnlPanel.Content = panelHexDump; + } + + void GrdIconsOnSelectionChanged(object sender, EventArgs eventArgs) + { + if(!(grdIcons.SelectedItem is Bitmap.DecodedBitmap icon)) + { + imgIcon.Image = null; + return; + } + + txtType.Text = icon.Type; + txtSize.Text = $"{icon.Width}x{icon.Height} pixels"; + txtColors.Text = $"{1 << (int)icon.BitsPerPixel} ({icon.BitsPerPixel} bpp)"; + imgIcon.Image = + new Eto.Drawing.Bitmap((int)icon.Width, (int)icon.Height, PixelFormat.Format32bppRgba, icon.Pixels); + } + + public void Update(byte[] data) + { + if(data == null) + { + imgIcon.Image = null; + grdIcons.Visible = false; + lblType.Text = "No data"; + lblColors.Visible = false; + lblSize.Visible = false; + txtType.Visible = false; + txtColors.Visible = false; + txtSize.Visible = false; + pnlPanel.Visible = false; + return; + } + + Bitmap.DecodedBitmap[] icons = Bitmap.DecodeBitmap(data); + + if(icons == null || icons.Length == 0) + { + imgIcon.Image = null; + grdIcons.Visible = false; + lblType.Text = "Undecoded"; + lblColors.Visible = false; + lblSize.Visible = false; + txtType.Visible = false; + txtColors.Visible = false; + txtSize.Visible = false; + pnlPanel.Visible = true; + panelHexDump.Update(data); + return; + } + + txtType.Text = icons[0].Type; + txtSize.Text = $"{icons[0].Width}x{icons[0].Height} pixels"; + txtColors.Text = $"{1 << (int)icons[0].BitsPerPixel} ({icons[0].BitsPerPixel} bpp)"; + imgIcon.Image = new Eto.Drawing.Bitmap((int)icons[0].Width, (int)icons[0].Height, + PixelFormat.Format32bppRgba, icons[0].Pixels); + grdIcons.DataStore = icons; + grdIcons.SelectedRow = 0; + grdIcons.Visible = icons.Length != 1; + + lblType.Text = "Type"; + lblColors.Visible = true; + lblSize.Visible = true; + txtType.Visible = true; + txtColors.Visible = true; + txtSize.Visible = true; + pnlPanel.Visible = false; + } + } +} \ No newline at end of file diff --git a/exeinfogui/exeinfogui.csproj b/exeinfogui/exeinfogui.csproj index c74d95e..afe9438 100644 --- a/exeinfogui/exeinfogui.csproj +++ b/exeinfogui/exeinfogui.csproj @@ -22,5 +22,6 @@ + \ No newline at end of file