Add decoding for BeOS version resource.

This commit is contained in:
2018-03-10 18:53:16 +00:00
parent cc6ddf378e
commit 6486b78716
9 changed files with 189 additions and 19 deletions

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<Panel xmlns="http://schema.picoe.ca/eto.forms" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackLayout Orientation="Vertical" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Top">
<StackLayout Orientation="Horizontal">
<StackLayoutItem>
<Label ID="lblMajorVersion">Major version</Label>
</StackLayoutItem>
<StackLayoutItem Expand="True" HorizontalAlignment="Stretch">
<TextBox ID="txtMajorVersion" ReadOnly="True"/>
</StackLayoutItem>
</StackLayout>
<StackLayout Orientation="Horizontal">
<StackLayoutItem>
<Label ID="lblMiddleVersion">Middle version</Label>
</StackLayoutItem>
<StackLayoutItem Expand="True" HorizontalAlignment="Stretch">
<TextBox ID="txtMiddleVersion" ReadOnly="True"/>
</StackLayoutItem>
</StackLayout>
<StackLayout Orientation="Horizontal">
<StackLayoutItem>
<Label ID="lblMinorVersion">Minor version</Label>
</StackLayoutItem>
<StackLayoutItem Expand="True" HorizontalAlignment="Stretch">
<TextBox ID="txtMinorVersion" ReadOnly="True"/>
</StackLayoutItem>
</StackLayout>
<StackLayout Orientation="Horizontal">
<StackLayoutItem>
<Label ID="lblVariety">Variety</Label>
</StackLayoutItem>
<StackLayoutItem Expand="True" HorizontalAlignment="Stretch">
<TextBox ID="txtVariety" ReadOnly="True"/>
</StackLayoutItem>
</StackLayout>
<StackLayout Orientation="Horizontal">
<StackLayoutItem>
<Label ID="lblInternal">Internal</Label>
</StackLayoutItem>
<StackLayoutItem Expand="True" HorizontalAlignment="Stretch">
<TextBox ID="txtInternal" ReadOnly="True"/>
</StackLayoutItem>
</StackLayout>
<StackLayout Orientation="Horizontal">
<StackLayoutItem>
<Label ID="lblShortInfo">Short information</Label>
</StackLayoutItem>
<StackLayoutItem Expand="True" HorizontalAlignment="Stretch">
<TextBox ID="txtShortInfo" ReadOnly="True"/>
</StackLayoutItem>
</StackLayout>
<StackLayout Orientation="Horizontal">
<StackLayoutItem>
<Label ID="lblLongInfo">Long information</Label>
</StackLayoutItem>
<StackLayoutItem Expand="True" HorizontalAlignment="Stretch">
<TextArea ID="txtLongInfo" ReadOnly="True"/>
</StackLayoutItem>
</StackLayout>
</StackLayout>
</Panel>

View File

@@ -0,0 +1,39 @@
using System.Text;
using Eto.Forms;
using Eto.Serialization.Xaml;
using libexeinfo;
using libexeinfo.BeOS;
namespace exeinfogui.BeOS
{
public class PanelBeVersion : Panel
{
TextBox txtInternal;
TextArea txtLongInfo;
TextBox txtMajorVersion;
TextBox txtMiddleVersion;
TextBox txtMinorVersion;
TextBox txtShortInfo;
TextBox txtVariety;
public PanelBeVersion()
{
XamlReader.Load(this);
}
public void Update(byte[] data, bool bigEndian)
{
VersionInfo versionInfo = bigEndian
? BigEndianMarshal.ByteArrayToStructureBigEndian<VersionInfo>(data)
: BigEndianMarshal.ByteArrayToStructureLittleEndian<VersionInfo>(data);
txtMajorVersion.Text = $"{versionInfo.major}";
txtMiddleVersion.Text = $"{versionInfo.middle}";
txtMinorVersion.Text = $"{versionInfo.minor}";
txtVariety.Text = $"{versionInfo.variety}";
txtInternal.Text = $"{versionInfo.interna1}";
txtShortInfo.Text = StringHandlers.CToString(versionInfo.short_info, Encoding.UTF8);
txtLongInfo.Text = StringHandlers.CToString(versionInfo.long_info, Encoding.UTF8);
}
}
}

View File

@@ -36,11 +36,13 @@ namespace exeinfogui.BeOS
{
public class TabBeResources : TabPage
{
PanelHexDump panelHexDump;
PanelText panelText;
Panel pnlResource;
TreeGridView treeResources;
PanelBeIcon panelBeIcon;
bool bigEndian;
PanelBeIcon panelBeIcon;
PanelBeVersion panelBeVersion;
PanelHexDump panelHexDump;
PanelText panelText;
Panel pnlResource;
TreeGridView treeResources;
public TabBeResources()
{
@@ -53,12 +55,13 @@ namespace exeinfogui.BeOS
treeResources.AllowMultipleSelection = false;
treeResources.SelectionChanged += TreeResourcesOnSelectionChanged;
panelHexDump = new PanelHexDump();
panelText = new PanelText();
panelBeIcon = new PanelBeIcon();
panelHexDump = new PanelHexDump();
panelText = new PanelText();
panelBeIcon = new PanelBeIcon();
panelBeVersion = new PanelBeVersion();
}
public void Update(IEnumerable<ResourceTypeBlock> resources)
public void Update(IEnumerable<ResourceTypeBlock> resources, bool bigEndian)
{
TreeGridItemCollection treeData = new TreeGridItemCollection();
@@ -84,6 +87,7 @@ namespace exeinfogui.BeOS
}
treeResources.DataStore = treeData;
this.bigEndian = bigEndian;
}
void TreeResourcesOnSelectionChanged(object sender, EventArgs eventArgs)
@@ -108,6 +112,10 @@ namespace exeinfogui.BeOS
pnlResource.Content = panelBeIcon;
panelBeIcon.Update(data, type);
break;
case Consts.B_VERSION_INFO_TYPE:
pnlResource.Content = panelBeVersion;
panelBeVersion.Update(data, bigEndian);
break;
default:
pnlResource.Content = panelHexDump;
panelHexDump.Update(data);

View File

@@ -162,7 +162,7 @@ namespace exeinfogui
if(((libexeinfo.PE)peExe).BeosResources != null)
{
tabBeResources.Update(((libexeinfo.PE)peExe).BeosResources);
tabBeResources.Update(((libexeinfo.PE)peExe).BeosResources, peExe.IsBigEndian);
tabBeResources.Visible = true;
}
}

View File

@@ -26,6 +26,7 @@
namespace libexeinfo.BeOS
{
// TODO: Find examples of 'CSTR', 'TEXT', and 'MMSG' with data
public static class Consts
{
internal const int RESOURCES_HEADER_MAGIC = 0x444F1000;

38
libexeinfo/BeOS/Enums.cs Normal file
View File

@@ -0,0 +1,38 @@
//
// Enums.cs
//
// Author:
// Natalia Portillo <claunia@claunia.com>
//
// Copyright (c) 2017-2018 Copyright © Claunia.com
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
namespace libexeinfo.BeOS
{
public enum InfoVariety : uint
{
B_DEVELOPMENT_VERSION = 0,
B_ALPHA_VERSION,
B_BETA_VERSION,
B_GAMMA_VERSION,
B_GOLDEN_MASTER_VERSION,
B_FINAL_VERSION
}
}

View File

@@ -202,4 +202,18 @@ namespace libexeinfo.BeOS
public int index;
public string name;
}
[StructLayout(LayoutKind.Sequential)]
public struct VersionInfo
{
public uint major;
public uint middle;
public uint minor;
public InfoVariety variety;
public uint interna1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] short_info;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public byte[] long_info;
}
}

View File

@@ -31,7 +31,7 @@ using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using libexeinfo.Windows;
using libexeinfo.BeOS;
namespace libexeinfo
{
@@ -40,10 +40,11 @@ namespace libexeinfo
/// </summary>
public partial class PE : IExecutable
{
MZ baseExecutable;
DebugDirectory debugDirectory;
ImageDataDirectory[] directoryEntries;
string[] exportedNames;
MZ baseExecutable;
public ResourceTypeBlock[] BeosResources;
DebugDirectory debugDirectory;
ImageDataDirectory[] directoryEntries;
string[] exportedNames;
/// <summary>
/// Header for this executable
/// </summary>
@@ -54,7 +55,6 @@ namespace libexeinfo
public Version[] Versions;
public ResourceNode WindowsResourcesRoot;
WindowsHeader64 winHeader;
public BeOS.ResourceTypeBlock[] BeosResources;
/// <summary>
/// Initializes a new instance of the <see cref="T:libexeinfo.PE" /> class.
@@ -386,10 +386,18 @@ namespace libexeinfo
rsrc.virtualSize = rsrc.sizeOfRawData;
newSectionHeaders.Add(".rsrc", rsrc);
buffer = new byte[rsrc.sizeOfRawData];
buffer = new byte[rsrc.sizeOfRawData];
BaseStream.Position = rsrc.pointerToRawData;
BaseStream.Read(buffer, 0, buffer.Length);
BeosResources = BeOS.Resources.Decode(buffer);
BeosResources = Resources.Decode(buffer);
strings.AddRange(from type in BeosResources
where type.type == Consts.B_VERSION_INFO_TYPE
from resource in type.resources
select BigEndianMarshal
.ByteArrayToStructureLittleEndian<VersionInfo>(resource.data)
into versionInfo
select StringHandlers.CToString(versionInfo.long_info));
}
else
{
@@ -427,7 +435,7 @@ namespace libexeinfo
ResourceNode thisNode = new ResourceNode {name = name, id = id, level = level};
if(thisNode.name == null)
thisNode.name = level == 1 ? Resources.IdToName((ushort)thisNode.id) : $"{thisNode.id}";
thisNode.name = level == 1 ? Windows.Resources.IdToName((ushort)thisNode.id) : $"{thisNode.id}";
stream.Position = position;
byte[] buffer = new byte[Marshal.SizeOf(typeof(ResourceDirectoryTable))];

View File

@@ -51,6 +51,7 @@
<ItemGroup>
<Compile Include="AtariST\Enums.cs" />
<Compile Include="BeOS\Consts.cs" />
<Compile Include="BeOS\Enums.cs" />
<Compile Include="BeOS\Resources.cs" />
<Compile Include="BeOS\Structs.cs" />
<Compile Include="Enums.cs" />