mirror of
https://github.com/claunia/libexeinfo.git
synced 2025-12-16 19:14:24 +00:00
Separated common operating system structures from executable format to their own namespace.
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
using Eto.Drawing;
|
using Eto.Drawing;
|
||||||
using Eto.Forms;
|
using Eto.Forms;
|
||||||
using Eto.Serialization.Xaml;
|
using Eto.Serialization.Xaml;
|
||||||
|
using libexeinfo.Os2;
|
||||||
using Bitmap = libexeinfo.Os2.Bitmap;
|
using Bitmap = libexeinfo.Os2.Bitmap;
|
||||||
|
|
||||||
namespace exeinfogui.Os2
|
namespace exeinfogui.Os2
|
||||||
@@ -25,7 +26,7 @@ namespace exeinfogui.Os2
|
|||||||
grdIcons.Columns.Add(new GridColumn
|
grdIcons.Columns.Add(new GridColumn
|
||||||
{
|
{
|
||||||
DataCell =
|
DataCell =
|
||||||
new TextBoxCell {Binding = Binding.Property<Bitmap.DecodedBitmap, string>(b => $"{b.Type}")},
|
new TextBoxCell {Binding = Binding.Property<DecodedBitmap, string>(b => $"{b.Type}")},
|
||||||
HeaderText = "Command"
|
HeaderText = "Command"
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -33,7 +34,7 @@ namespace exeinfogui.Os2
|
|||||||
{
|
{
|
||||||
DataCell = new TextBoxCell
|
DataCell = new TextBoxCell
|
||||||
{
|
{
|
||||||
Binding = Binding.Property<Bitmap.DecodedBitmap, string>(b => $"{b.Width}x{b.Height}")
|
Binding = Binding.Property<DecodedBitmap, string>(b => $"{b.Width}x{b.Height}")
|
||||||
},
|
},
|
||||||
HeaderText = "Size"
|
HeaderText = "Size"
|
||||||
});
|
});
|
||||||
@@ -42,7 +43,7 @@ namespace exeinfogui.Os2
|
|||||||
{
|
{
|
||||||
DataCell = new TextBoxCell
|
DataCell = new TextBoxCell
|
||||||
{
|
{
|
||||||
Binding = Binding.Property<Bitmap.DecodedBitmap, string>(b => $"{1 << (int)b.BitsPerPixel}")
|
Binding = Binding.Property<DecodedBitmap, string>(b => $"{1 << (int)b.BitsPerPixel}")
|
||||||
},
|
},
|
||||||
HeaderText = "Colors"
|
HeaderText = "Colors"
|
||||||
});
|
});
|
||||||
@@ -55,7 +56,7 @@ namespace exeinfogui.Os2
|
|||||||
|
|
||||||
void GrdIconsOnSelectionChanged(object sender, EventArgs eventArgs)
|
void GrdIconsOnSelectionChanged(object sender, EventArgs eventArgs)
|
||||||
{
|
{
|
||||||
if(!(grdIcons.SelectedItem is Bitmap.DecodedBitmap icon))
|
if(!(grdIcons.SelectedItem is DecodedBitmap icon))
|
||||||
{
|
{
|
||||||
imgIcon.Image = null;
|
imgIcon.Image = null;
|
||||||
return;
|
return;
|
||||||
@@ -84,12 +85,12 @@ namespace exeinfogui.Os2
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bitmap.DecodedBitmap[] icons = Bitmap.DecodeBitmap(data);
|
DecodedBitmap[] icons = Bitmap.DecodeBitmap(data);
|
||||||
|
|
||||||
if(icons == null || icons.Length == 0)
|
if(icons == null || icons.Length == 0)
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
libexeinfo.Windows.Bitmap.DecodedBitmap winIcon = null;
|
libexeinfo.Windows.DecodedBitmap winIcon = null;
|
||||||
|
|
||||||
if(BitConverter.ToUInt32(data, 4) == 40)
|
if(BitConverter.ToUInt32(data, 4) == 40)
|
||||||
{
|
{
|
||||||
@@ -103,7 +104,7 @@ namespace exeinfogui.Os2
|
|||||||
if(winIcon != null)
|
if(winIcon != null)
|
||||||
icons = new[]
|
icons = new[]
|
||||||
{
|
{
|
||||||
new Bitmap.DecodedBitmap
|
new DecodedBitmap
|
||||||
{
|
{
|
||||||
BitsPerPixel = winIcon.BitsPerPixel,
|
BitsPerPixel = winIcon.BitsPerPixel,
|
||||||
Height = winIcon.Height,
|
Height = winIcon.Height,
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ namespace exeinfogui.Windows
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bitmap.DecodedBitmap icon;
|
libexeinfo.Windows.DecodedBitmap icon;
|
||||||
|
|
||||||
try { icon = Bitmap.DecodeIcon(data); }
|
try { icon = Bitmap.DecodeIcon(data); }
|
||||||
catch { icon = null; }
|
catch { icon = null; }
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.IO;
|
|||||||
using Eto.Drawing;
|
using Eto.Drawing;
|
||||||
using Eto.Forms;
|
using Eto.Forms;
|
||||||
using Eto.Serialization.Xaml;
|
using Eto.Serialization.Xaml;
|
||||||
|
using libexeinfo.Os2;
|
||||||
using Bitmap = libexeinfo.Os2.Bitmap;
|
using Bitmap = libexeinfo.Os2.Bitmap;
|
||||||
|
|
||||||
namespace iconviewer
|
namespace iconviewer
|
||||||
@@ -20,7 +21,7 @@ namespace iconviewer
|
|||||||
grdIcons.Columns.Add(new GridColumn
|
grdIcons.Columns.Add(new GridColumn
|
||||||
{
|
{
|
||||||
DataCell =
|
DataCell =
|
||||||
new TextBoxCell {Binding = Binding.Property<Bitmap.DecodedBitmap, string>(b => $"{b.Type}")},
|
new TextBoxCell {Binding = Binding.Property<DecodedBitmap, string>(b => $"{b.Type}")},
|
||||||
HeaderText = "Command"
|
HeaderText = "Command"
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -28,7 +29,7 @@ namespace iconviewer
|
|||||||
{
|
{
|
||||||
DataCell = new TextBoxCell
|
DataCell = new TextBoxCell
|
||||||
{
|
{
|
||||||
Binding = Binding.Property<Bitmap.DecodedBitmap, string>(b => $"{b.Width}x{b.Height}")
|
Binding = Binding.Property<DecodedBitmap, string>(b => $"{b.Width}x{b.Height}")
|
||||||
},
|
},
|
||||||
HeaderText = "Size"
|
HeaderText = "Size"
|
||||||
});
|
});
|
||||||
@@ -37,7 +38,7 @@ namespace iconviewer
|
|||||||
{
|
{
|
||||||
DataCell = new TextBoxCell
|
DataCell = new TextBoxCell
|
||||||
{
|
{
|
||||||
Binding = Binding.Property<Bitmap.DecodedBitmap, string>(b => $"{1 << (int)b.BitsPerPixel}")
|
Binding = Binding.Property<DecodedBitmap, string>(b => $"{1 << (int)b.BitsPerPixel}")
|
||||||
},
|
},
|
||||||
HeaderText = "Colors"
|
HeaderText = "Colors"
|
||||||
});
|
});
|
||||||
@@ -48,7 +49,7 @@ namespace iconviewer
|
|||||||
|
|
||||||
void GrdIconsOnSelectionChanged(object sender, EventArgs eventArgs)
|
void GrdIconsOnSelectionChanged(object sender, EventArgs eventArgs)
|
||||||
{
|
{
|
||||||
if(!(grdIcons.SelectedItem is Bitmap.DecodedBitmap icon))
|
if(!(grdIcons.SelectedItem is DecodedBitmap icon))
|
||||||
{
|
{
|
||||||
imgIcon.Image = null;
|
imgIcon.Image = null;
|
||||||
return;
|
return;
|
||||||
@@ -78,7 +79,7 @@ namespace iconviewer
|
|||||||
fstream.Read(data, 0, data.Length);
|
fstream.Read(data, 0, data.Length);
|
||||||
fstream.Dispose();
|
fstream.Dispose();
|
||||||
|
|
||||||
Bitmap.DecodedBitmap[] icons = Bitmap.DecodeBitmap(data);
|
DecodedBitmap[] icons = Bitmap.DecodeBitmap(data);
|
||||||
imgIcon.Image = new Eto.Drawing.Bitmap((int)icons[0].Width, (int)icons[0].Height,
|
imgIcon.Image = new Eto.Drawing.Bitmap((int)icons[0].Width, (int)icons[0].Height,
|
||||||
PixelFormat.Format32bppRgba, icons[0].Pixels);
|
PixelFormat.Format32bppRgba, icons[0].Pixels);
|
||||||
grdIcons.DataStore = icons;
|
grdIcons.DataStore = icons;
|
||||||
|
|||||||
@@ -24,6 +24,8 @@
|
|||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
using libexeinfo.Os2;
|
||||||
|
|
||||||
namespace libexeinfo
|
namespace libexeinfo
|
||||||
{
|
{
|
||||||
public partial class NE
|
public partial class NE
|
||||||
@@ -95,27 +97,27 @@ namespace libexeinfo
|
|||||||
{
|
{
|
||||||
switch(id)
|
switch(id)
|
||||||
{
|
{
|
||||||
case (int)Os2ResourceTypes.RT_POINTER: return "RT_POINTER";
|
case (int)Os2.ResourceTypes.RT_POINTER: return "RT_POINTER";
|
||||||
case (int)Os2ResourceTypes.RT_BITMAP: return "RT_BITMAP";
|
case (int)Os2.ResourceTypes.RT_BITMAP: return "RT_BITMAP";
|
||||||
case (int)Os2ResourceTypes.RT_MENU: return "RT_MENU";
|
case (int)Os2.ResourceTypes.RT_MENU: return "RT_MENU";
|
||||||
case (int)Os2ResourceTypes.RT_DIALOG: return "RT_DIALOG";
|
case (int)Os2.ResourceTypes.RT_DIALOG: return "RT_DIALOG";
|
||||||
case (int)Os2ResourceTypes.RT_STRING: return "RT_STRING";
|
case (int)Os2.ResourceTypes.RT_STRING: return "RT_STRING";
|
||||||
case (int)Os2ResourceTypes.RT_FONTDIR: return "RT_FONTDIR";
|
case (int)Os2.ResourceTypes.RT_FONTDIR: return "RT_FONTDIR";
|
||||||
case (int)Os2ResourceTypes.RT_FONT: return "RT_FONT";
|
case (int)Os2.ResourceTypes.RT_FONT: return "RT_FONT";
|
||||||
case (int)Os2ResourceTypes.RT_ACCELTABLE: return "RT_ACCELTABLE";
|
case (int)Os2.ResourceTypes.RT_ACCELTABLE: return "RT_ACCELTABLE";
|
||||||
case (int)Os2ResourceTypes.RT_RCDATA: return "RT_RCDATA";
|
case (int)Os2.ResourceTypes.RT_RCDATA: return "RT_RCDATA";
|
||||||
case (int)Os2ResourceTypes.RT_MESSAGE: return "RT_MESSAGE";
|
case (int)Os2.ResourceTypes.RT_MESSAGE: return "RT_MESSAGE";
|
||||||
case (int)Os2ResourceTypes.RT_DLGINCLUDE: return "RT_DLGINCLUDE";
|
case (int)Os2.ResourceTypes.RT_DLGINCLUDE: return "RT_DLGINCLUDE";
|
||||||
case (int)Os2ResourceTypes.RT_VKEYTBL: return "RT_VKEYTBL";
|
case (int)Os2.ResourceTypes.RT_VKEYTBL: return "RT_VKEYTBL";
|
||||||
case (int)Os2ResourceTypes.RT_KEYTBL: return "RT_KEYTBL";
|
case (int)Os2.ResourceTypes.RT_KEYTBL: return "RT_KEYTBL";
|
||||||
case (int)Os2ResourceTypes.RT_CHARTBL: return "RT_CHARTBL";
|
case (int)Os2.ResourceTypes.RT_CHARTBL: return "RT_CHARTBL";
|
||||||
case (int)Os2ResourceTypes.RT_DISPLAYINFO: return "RT_DISPLAYINFO";
|
case (int)Os2.ResourceTypes.RT_DISPLAYINFO: return "RT_DISPLAYINFO";
|
||||||
case (int)Os2ResourceTypes.RT_FKASHORT: return "RT_FKASHORT";
|
case (int)Os2.ResourceTypes.RT_FKASHORT: return "RT_FKASHORT";
|
||||||
case (int)Os2ResourceTypes.RT_FKALONG: return "RT_FKALONG";
|
case (int)Os2.ResourceTypes.RT_FKALONG: return "RT_FKALONG";
|
||||||
case (int)Os2ResourceTypes.RT_HELPTABLE: return "RT_HELPTABLE";
|
case (int)Os2.ResourceTypes.RT_HELPTABLE: return "RT_HELPTABLE";
|
||||||
case (int)Os2ResourceTypes.RT_HELPSUBTABLE: return "RT_HELPSUBTABLE";
|
case (int)Os2.ResourceTypes.RT_HELPSUBTABLE: return "RT_HELPSUBTABLE";
|
||||||
case (int)Os2ResourceTypes.RT_FDDIR: return "RT_FDDIR";
|
case (int)Os2.ResourceTypes.RT_FDDIR: return "RT_FDDIR";
|
||||||
case (int)Os2ResourceTypes.RT_FD: return "RT_FD";
|
case (int)Os2.ResourceTypes.RT_FD: return "RT_FD";
|
||||||
default: return $"{id}";
|
default: return $"{id}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,104 +43,6 @@ namespace libexeinfo
|
|||||||
DLL = 1 << 7
|
DLL = 1 << 7
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// OS/2 flags.
|
|
||||||
/// </summary>
|
|
||||||
[Flags]
|
|
||||||
public enum OS2Flags : byte
|
|
||||||
{
|
|
||||||
LongFilename = 1 << 0,
|
|
||||||
ProtectedMode2 = 1 << 1,
|
|
||||||
ProportionalFonts = 1 << 2,
|
|
||||||
GangloadArea = 1 << 3
|
|
||||||
}
|
|
||||||
|
|
||||||
[Flags]
|
|
||||||
public enum Os2MenuAttribute : ushort
|
|
||||||
{
|
|
||||||
MIA_FRAMED = 0x1000,
|
|
||||||
MIA_CHECKED = 0x2000,
|
|
||||||
MIA_DISABLED = 0x4000,
|
|
||||||
MIA_HILITED = 0x8000
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum Os2MenuType : ushort
|
|
||||||
{
|
|
||||||
MIS_TEXT = 0x0001,
|
|
||||||
MIS_BITMAP = 0x0002,
|
|
||||||
MIS_SEPARATOR = 0x0004,
|
|
||||||
MIS_OWNERDRAW = 0x0008,
|
|
||||||
MIS_SUBMENU = 0x0010,
|
|
||||||
/// <summary>
|
|
||||||
/// multiple choice submenu
|
|
||||||
/// </summary>
|
|
||||||
MIS_MULTMENU = 0x0020,
|
|
||||||
MIS_SYSCOMMAND = 0x0040,
|
|
||||||
MIS_HELP = 0x0080,
|
|
||||||
MIS_STATIC = 0x0100,
|
|
||||||
MIS_BUTTONSEPARATOR = 0x0200,
|
|
||||||
MIS_BREAK = 0x0400,
|
|
||||||
MIS_BREAKSEPARATOR = 0x0800,
|
|
||||||
/// <summary>
|
|
||||||
/// multiple choice group start
|
|
||||||
/// </summary>
|
|
||||||
MIS_GROUP = 0x1000,
|
|
||||||
/// <summary>
|
|
||||||
/// In multiple choice submenus a style of 'single' denotes the item is a radiobutton. Absence of this style defaults
|
|
||||||
/// the item to a checkbox.
|
|
||||||
/// </summary>
|
|
||||||
MIS_SINGLE = 0x2000
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Resource types.
|
|
||||||
/// </summary>
|
|
||||||
public enum Os2ResourceTypes : ushort
|
|
||||||
{
|
|
||||||
/// <summary>mouse pointer shape</summary>
|
|
||||||
RT_POINTER = 1,
|
|
||||||
/// <summary>bitmap</summary>
|
|
||||||
RT_BITMAP = 2,
|
|
||||||
/// <summary>menu template</summary>
|
|
||||||
RT_MENU = 3,
|
|
||||||
/// <summary>dialog template</summary>
|
|
||||||
RT_DIALOG = 4,
|
|
||||||
/// <summary>string tables</summary>
|
|
||||||
RT_STRING = 5,
|
|
||||||
/// <summary>font directory</summary>
|
|
||||||
RT_FONTDIR = 6,
|
|
||||||
/// <summary>font</summary>
|
|
||||||
RT_FONT = 7,
|
|
||||||
/// <summary>accelerator tables</summary>
|
|
||||||
RT_ACCELTABLE = 8,
|
|
||||||
/// <summary>binary data</summary>
|
|
||||||
RT_RCDATA = 9,
|
|
||||||
/// <summary>error msg tables</summary>
|
|
||||||
RT_MESSAGE = 10,
|
|
||||||
/// <summary>dialog include file name</summary>
|
|
||||||
RT_DLGINCLUDE = 11,
|
|
||||||
/// <summary>key to vkey tables</summary>
|
|
||||||
RT_VKEYTBL = 12,
|
|
||||||
/// <summary>key to UGL tables</summary>
|
|
||||||
RT_KEYTBL = 13,
|
|
||||||
/// <summary>glyph to character tables</summary>
|
|
||||||
RT_CHARTBL = 14,
|
|
||||||
/// <summary>screen display information</summary>
|
|
||||||
RT_DISPLAYINFO = 15,
|
|
||||||
/// <summary>function key area short form</summary>
|
|
||||||
RT_FKASHORT = 16,
|
|
||||||
/// <summary>function key area long form</summary>
|
|
||||||
RT_FKALONG = 17,
|
|
||||||
/// <summary>Help table for IPFC</summary>
|
|
||||||
RT_HELPTABLE = 18,
|
|
||||||
/// <summary>Help subtable for IPFC</summary>
|
|
||||||
RT_HELPSUBTABLE = 19,
|
|
||||||
/// <summary>DBCS uniq/font driver directory</summary>
|
|
||||||
RT_FDDIR = 20,
|
|
||||||
/// <summary>DBCS uniq/font driver</summary>
|
|
||||||
RT_FD = 21
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Program flags.
|
/// Program flags.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using libexeinfo.Os2;
|
||||||
|
|
||||||
namespace libexeinfo
|
namespace libexeinfo
|
||||||
{
|
{
|
||||||
@@ -87,13 +88,13 @@ namespace libexeinfo
|
|||||||
else if(Header.application_flags.HasFlag(ApplicationFlags.FullScreen) &&
|
else if(Header.application_flags.HasFlag(ApplicationFlags.FullScreen) &&
|
||||||
Header.application_flags.HasFlag(ApplicationFlags.GUICompatible))
|
Header.application_flags.HasFlag(ApplicationFlags.GUICompatible))
|
||||||
sb.AppendLine("\tApplication uses Presentation Manager");
|
sb.AppendLine("\tApplication uses Presentation Manager");
|
||||||
if(Header.os2_flags.HasFlag(OS2Flags.LongFilename))
|
if(Header.ExecutableFlags.HasFlag(ExecutableFlags.LongFilename))
|
||||||
sb.AppendLine("\tApplication supports long filenames");
|
sb.AppendLine("\tApplication supports long filenames");
|
||||||
if(Header.os2_flags.HasFlag(OS2Flags.ProtectedMode2))
|
if(Header.ExecutableFlags.HasFlag(ExecutableFlags.ProtectedMode2))
|
||||||
sb.AppendLine("\tApplication uses OS/2 2.x protected mode");
|
sb.AppendLine("\tApplication uses OS/2 2.x protected mode");
|
||||||
if(Header.os2_flags.HasFlag(OS2Flags.ProportionalFonts))
|
if(Header.ExecutableFlags.HasFlag(ExecutableFlags.ProportionalFonts))
|
||||||
sb.AppendLine("\tApplication uses OS/2 2.x proportional fonts");
|
sb.AppendLine("\tApplication uses OS/2 2.x proportional fonts");
|
||||||
if(Header.os2_flags.HasFlag(OS2Flags.GangloadArea))
|
if(Header.ExecutableFlags.HasFlag(ExecutableFlags.GangloadArea))
|
||||||
sb.AppendFormat("\tGangload area starts at {0} an runs for {1} bytes",
|
sb.AppendFormat("\tGangload area starts at {0} an runs for {1} bytes",
|
||||||
Header.return_thunks_offset, Header.segment_reference_thunks).AppendLine();
|
Header.return_thunks_offset, Header.segment_reference_thunks).AppendLine();
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using libexeinfo.Os2;
|
||||||
|
|
||||||
namespace libexeinfo
|
namespace libexeinfo
|
||||||
{
|
{
|
||||||
@@ -246,7 +247,7 @@ namespace libexeinfo
|
|||||||
BaseStream.Position = BaseExecutable.Header.new_offset + Header.resource_table_offset;
|
BaseStream.Position = BaseExecutable.Header.new_offset + Header.resource_table_offset;
|
||||||
buffer = new byte[Header.resource_entries * 4];
|
buffer = new byte[Header.resource_entries * 4];
|
||||||
BaseStream.Read(buffer, 0, buffer.Length);
|
BaseStream.Read(buffer, 0, buffer.Length);
|
||||||
Os2ResourceTableEntry[] entries = new Os2ResourceTableEntry[Header.resource_entries];
|
ResourceTableEntry[] entries = new ResourceTableEntry[Header.resource_entries];
|
||||||
for(int i = 0; i < entries.Length; i++)
|
for(int i = 0; i < entries.Length; i++)
|
||||||
{
|
{
|
||||||
entries[i].etype = BitConverter.ToUInt16(buffer, i * 4 + 0);
|
entries[i].etype = BitConverter.ToUInt16(buffer, i * 4 + 0);
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using libexeinfo.Os2;
|
||||||
|
|
||||||
namespace libexeinfo
|
namespace libexeinfo
|
||||||
{
|
{
|
||||||
@@ -62,7 +63,7 @@ namespace libexeinfo
|
|||||||
public ushort alignment_shift;
|
public ushort alignment_shift;
|
||||||
public ushort resource_entries;
|
public ushort resource_entries;
|
||||||
public TargetOS target_os;
|
public TargetOS target_os;
|
||||||
public OS2Flags os2_flags;
|
public ExecutableFlags ExecutableFlags;
|
||||||
public ushort return_thunks_offset;
|
public ushort return_thunks_offset;
|
||||||
public ushort segment_reference_thunks;
|
public ushort segment_reference_thunks;
|
||||||
public ushort minimum_swap_area;
|
public ushort minimum_swap_area;
|
||||||
@@ -167,7 +168,7 @@ namespace libexeinfo
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public ushort dwSegmentLength;
|
public ushort dwSegmentLength;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Flag word, <see cref="SegmentResourceFlags" />, <see cref="SEGMENT_TYPE_MASK" />, <see cref="SEGMENT_FLAGS_MASK" />
|
/// Flag word, <see cref="SegmentFlags" />, <see cref="SEGMENT_TYPE_MASK" />, <see cref="SEGMENT_FLAGS_MASK" />
|
||||||
/// , <see cref="SEGMENT_DISCARD_MASK" />
|
/// , <see cref="SEGMENT_DISCARD_MASK" />
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ushort dwFlags;
|
public ushort dwFlags;
|
||||||
@@ -176,69 +177,5 @@ namespace libexeinfo
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public ushort dwMinimumAllocation;
|
public ushort dwMinimumAllocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
public struct Os2ResourceTableEntry
|
|
||||||
{
|
|
||||||
public ushort etype;
|
|
||||||
public ushort ename;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
public struct Os2MenuHeader
|
|
||||||
{
|
|
||||||
public ushort cb;
|
|
||||||
public ushort type;
|
|
||||||
public ushort cp;
|
|
||||||
public ushort offset;
|
|
||||||
public ushort count;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Followed by data, if <see cref="Os2MenuItem.style" /> is <see cref="Os2MenuType.MIS_TEXT" /> a null-terminated
|
|
||||||
/// string follows, if <see cref="Os2MenuType.MIS_BITMAP" /> a resource ID follows and if
|
|
||||||
/// <see cref="Os2MenuType.MIS_SUBMENU" /> another header follows.
|
|
||||||
/// </summary>
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
public struct Os2MenuItem
|
|
||||||
{
|
|
||||||
public Os2MenuType style;
|
|
||||||
public Os2MenuAttribute attrib;
|
|
||||||
public ushort id;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
public struct Os2DialogTemplateItem
|
|
||||||
{
|
|
||||||
public ushort fsItemStatus;
|
|
||||||
public ushort cChildren;
|
|
||||||
public ushort cchClassName;
|
|
||||||
public ushort offClassName;
|
|
||||||
public ushort cchText;
|
|
||||||
public ushort offText;
|
|
||||||
public uint flStyle;
|
|
||||||
public short x;
|
|
||||||
public short y;
|
|
||||||
public short cx;
|
|
||||||
public short cy;
|
|
||||||
public ushort id;
|
|
||||||
public ushort offPresParams;
|
|
||||||
public ushort offCtlData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Dialog template, followed by several <see cref="Os2DialogTemplateItem" />
|
|
||||||
/// </summary>
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
public struct Os2DialogTemplate
|
|
||||||
{
|
|
||||||
public ushort cbTemplate;
|
|
||||||
public ushort type;
|
|
||||||
public ushort codepage;
|
|
||||||
public ushort offadlgti;
|
|
||||||
public ushort fsTemplateStatus;
|
|
||||||
public ushort iItemFocus;
|
|
||||||
public ushort coffPresParams;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,7 @@ using System.Runtime.InteropServices;
|
|||||||
|
|
||||||
namespace libexeinfo.Os2
|
namespace libexeinfo.Os2
|
||||||
{
|
{
|
||||||
public class Bitmap
|
public static class Bitmap
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 'IC', OS/2 only, icon
|
/// 'IC', OS/2 only, icon
|
||||||
@@ -69,13 +69,8 @@ namespace libexeinfo.Os2
|
|||||||
{
|
{
|
||||||
long pos = 0;
|
long pos = 0;
|
||||||
BitmapArrayHeader bitmapArrayHeader;
|
BitmapArrayHeader bitmapArrayHeader;
|
||||||
BitmapInfoHeader bitmapFileHeader;
|
|
||||||
byte[] buffer = new byte[Marshal.SizeOf(typeof(BitmapInfoHeader))];
|
byte[] buffer = new byte[Marshal.SizeOf(typeof(BitmapInfoHeader))];
|
||||||
|
|
||||||
Array.Copy(data, pos, buffer, 0, buffer.Length);
|
|
||||||
bitmapArrayHeader = BigEndianMarshal.ByteArrayToStructureLittleEndian<BitmapArrayHeader>(buffer);
|
|
||||||
bitmapFileHeader = BigEndianMarshal.ByteArrayToStructureLittleEndian<BitmapInfoHeader>(buffer);
|
|
||||||
|
|
||||||
List<DecodedBitmap> bitmaps = new List<DecodedBitmap>();
|
List<DecodedBitmap> bitmaps = new List<DecodedBitmap>();
|
||||||
|
|
||||||
do
|
do
|
||||||
@@ -100,7 +95,8 @@ namespace libexeinfo.Os2
|
|||||||
{
|
{
|
||||||
buffer = new byte[Marshal.SizeOf(typeof(BitmapInfoHeader))];
|
buffer = new byte[Marshal.SizeOf(typeof(BitmapInfoHeader))];
|
||||||
Array.Copy(data, pos, buffer, 0, buffer.Length);
|
Array.Copy(data, pos, buffer, 0, buffer.Length);
|
||||||
bitmapFileHeader = BigEndianMarshal.ByteArrayToStructureLittleEndian<BitmapInfoHeader>(buffer);
|
BitmapInfoHeader bitmapFileHeader =
|
||||||
|
BigEndianMarshal.ByteArrayToStructureLittleEndian<BitmapInfoHeader>(buffer);
|
||||||
|
|
||||||
// Stop at unknown header
|
// Stop at unknown header
|
||||||
if(bitmapFileHeader.Fix != 12) break;
|
if(bitmapFileHeader.Fix != 12) break;
|
||||||
@@ -110,13 +106,13 @@ namespace libexeinfo.Os2
|
|||||||
|
|
||||||
// TODO: Non paletted?
|
// TODO: Non paletted?
|
||||||
pos += Marshal.SizeOf(typeof(BitmapInfoHeader));
|
pos += Marshal.SizeOf(typeof(BitmapInfoHeader));
|
||||||
RGB[] palette = new RGB[1 << bitmapFileHeader.BitsPerPlane];
|
Rgb[] palette = new Rgb[1 << bitmapFileHeader.BitsPerPlane];
|
||||||
buffer = new byte[Marshal.SizeOf(typeof(RGB))];
|
buffer = new byte[Marshal.SizeOf(typeof(Rgb))];
|
||||||
for(int i = 0; i < palette.Length; i++)
|
for(int i = 0; i < palette.Length; i++)
|
||||||
{
|
{
|
||||||
Array.Copy(data, pos, buffer, 0, buffer.Length);
|
Array.Copy(data, pos, buffer, 0, buffer.Length);
|
||||||
pos += buffer.Length;
|
pos += buffer.Length;
|
||||||
palette[i] = BigEndianMarshal.ByteArrayToStructureLittleEndian<RGB>(buffer);
|
palette[i] = BigEndianMarshal.ByteArrayToStructureLittleEndian<Rgb>(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
remaining -= bitmapFileHeader.Fix;
|
remaining -= bitmapFileHeader.Fix;
|
||||||
@@ -179,13 +175,13 @@ namespace libexeinfo.Os2
|
|||||||
|
|
||||||
// TODO: Non paletted?
|
// TODO: Non paletted?
|
||||||
pos += bitmapFileHeader.Size;
|
pos += bitmapFileHeader.Size;
|
||||||
palette = new RGB[1 << bitmapFileHeader.BitsPerPlane];
|
palette = new Rgb[1 << bitmapFileHeader.BitsPerPlane];
|
||||||
buffer = new byte[Marshal.SizeOf(typeof(RGB))];
|
buffer = new byte[Marshal.SizeOf(typeof(Rgb))];
|
||||||
for(int i = 0; i < palette.Length; i++)
|
for(int i = 0; i < palette.Length; i++)
|
||||||
{
|
{
|
||||||
Array.Copy(data, pos, buffer, 0, buffer.Length);
|
Array.Copy(data, pos, buffer, 0, buffer.Length);
|
||||||
pos += buffer.Length;
|
pos += buffer.Length;
|
||||||
palette[i] = BigEndianMarshal.ByteArrayToStructureLittleEndian<RGB>(buffer);
|
palette[i] = BigEndianMarshal.ByteArrayToStructureLittleEndian<Rgb>(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
remaining -= bitmapFileHeader.Fix;
|
remaining -= bitmapFileHeader.Fix;
|
||||||
@@ -242,7 +238,7 @@ namespace libexeinfo.Os2
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Mask is not correctly decoded on XGA icons (20x20 and 40x40)...
|
// TODO: Mask is not correctly decoded on XGA icons (20x20 and 40x40)...
|
||||||
static DecodedBitmap DecodeBitmap(BitmapInfoHeader header, IList<RGB> palette, byte[] data)
|
static DecodedBitmap DecodeBitmap(BitmapInfoHeader header, IList<Rgb> palette, byte[] data)
|
||||||
{
|
{
|
||||||
DecodedBitmap bitmap = new DecodedBitmap
|
DecodedBitmap bitmap = new DecodedBitmap
|
||||||
{
|
{
|
||||||
@@ -303,49 +299,5 @@ namespace libexeinfo.Os2
|
|||||||
|
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
|
||||||
public struct BitmapArrayHeader
|
|
||||||
{
|
|
||||||
public ushort Type;
|
|
||||||
public uint Size;
|
|
||||||
public uint Next;
|
|
||||||
public ushort XDisplay;
|
|
||||||
public ushort YDisplay;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
|
||||||
public struct BitmapInfoHeader
|
|
||||||
{
|
|
||||||
public ushort Type;
|
|
||||||
public uint Size;
|
|
||||||
public short XHotspot;
|
|
||||||
public short YHostpot;
|
|
||||||
public uint Offset;
|
|
||||||
public uint Fix;
|
|
||||||
public ushort X;
|
|
||||||
public ushort Y;
|
|
||||||
public ushort Planes;
|
|
||||||
public ushort BitsPerPlane;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
|
||||||
public struct RGB
|
|
||||||
{
|
|
||||||
public byte Blue;
|
|
||||||
public byte Green;
|
|
||||||
public byte Red;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DecodedBitmap
|
|
||||||
{
|
|
||||||
public uint BitsPerPixel;
|
|
||||||
public uint Height;
|
|
||||||
public int[] Pixels;
|
|
||||||
public string Type;
|
|
||||||
public uint Width;
|
|
||||||
public short XHotspot;
|
|
||||||
public short YHostpot;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
128
libexeinfo/Os2/Enums.cs
Normal file
128
libexeinfo/Os2/Enums.cs
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
//
|
||||||
|
// Enums.cs
|
||||||
|
//
|
||||||
|
// Author:
|
||||||
|
// Natalia Portillo <claunia@claunia.com>
|
||||||
|
//
|
||||||
|
// Copyright (c) 2017 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.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace libexeinfo.Os2
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// OS/2 flags.
|
||||||
|
/// </summary>
|
||||||
|
[Flags]
|
||||||
|
public enum ExecutableFlags : byte
|
||||||
|
{
|
||||||
|
LongFilename = 1 << 0,
|
||||||
|
ProtectedMode2 = 1 << 1,
|
||||||
|
ProportionalFonts = 1 << 2,
|
||||||
|
GangloadArea = 1 << 3
|
||||||
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum MenuAttribute : ushort
|
||||||
|
{
|
||||||
|
MIA_FRAMED = 0x1000,
|
||||||
|
MIA_CHECKED = 0x2000,
|
||||||
|
MIA_DISABLED = 0x4000,
|
||||||
|
MIA_HILITED = 0x8000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MenuType : ushort
|
||||||
|
{
|
||||||
|
MIS_TEXT = 0x0001,
|
||||||
|
MIS_BITMAP = 0x0002,
|
||||||
|
MIS_SEPARATOR = 0x0004,
|
||||||
|
MIS_OWNERDRAW = 0x0008,
|
||||||
|
MIS_SUBMENU = 0x0010,
|
||||||
|
/// <summary>
|
||||||
|
/// multiple choice submenu
|
||||||
|
/// </summary>
|
||||||
|
MIS_MULTMENU = 0x0020,
|
||||||
|
MIS_SYSCOMMAND = 0x0040,
|
||||||
|
MIS_HELP = 0x0080,
|
||||||
|
MIS_STATIC = 0x0100,
|
||||||
|
MIS_BUTTONSEPARATOR = 0x0200,
|
||||||
|
MIS_BREAK = 0x0400,
|
||||||
|
MIS_BREAKSEPARATOR = 0x0800,
|
||||||
|
/// <summary>
|
||||||
|
/// multiple choice group start
|
||||||
|
/// </summary>
|
||||||
|
MIS_GROUP = 0x1000,
|
||||||
|
/// <summary>
|
||||||
|
/// In multiple choice submenus a style of 'single' denotes the item is a radiobutton. Absence of this style defaults
|
||||||
|
/// the item to a checkbox.
|
||||||
|
/// </summary>
|
||||||
|
MIS_SINGLE = 0x2000
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resource types.
|
||||||
|
/// </summary>
|
||||||
|
public enum ResourceTypes : ushort
|
||||||
|
{
|
||||||
|
/// <summary>mouse pointer shape</summary>
|
||||||
|
RT_POINTER = 1,
|
||||||
|
/// <summary>bitmap</summary>
|
||||||
|
RT_BITMAP = 2,
|
||||||
|
/// <summary>menu template</summary>
|
||||||
|
RT_MENU = 3,
|
||||||
|
/// <summary>dialog template</summary>
|
||||||
|
RT_DIALOG = 4,
|
||||||
|
/// <summary>string tables</summary>
|
||||||
|
RT_STRING = 5,
|
||||||
|
/// <summary>font directory</summary>
|
||||||
|
RT_FONTDIR = 6,
|
||||||
|
/// <summary>font</summary>
|
||||||
|
RT_FONT = 7,
|
||||||
|
/// <summary>accelerator tables</summary>
|
||||||
|
RT_ACCELTABLE = 8,
|
||||||
|
/// <summary>binary data</summary>
|
||||||
|
RT_RCDATA = 9,
|
||||||
|
/// <summary>error msg tables</summary>
|
||||||
|
RT_MESSAGE = 10,
|
||||||
|
/// <summary>dialog include file name</summary>
|
||||||
|
RT_DLGINCLUDE = 11,
|
||||||
|
/// <summary>key to vkey tables</summary>
|
||||||
|
RT_VKEYTBL = 12,
|
||||||
|
/// <summary>key to UGL tables</summary>
|
||||||
|
RT_KEYTBL = 13,
|
||||||
|
/// <summary>glyph to character tables</summary>
|
||||||
|
RT_CHARTBL = 14,
|
||||||
|
/// <summary>screen display information</summary>
|
||||||
|
RT_DISPLAYINFO = 15,
|
||||||
|
/// <summary>function key area short form</summary>
|
||||||
|
RT_FKASHORT = 16,
|
||||||
|
/// <summary>function key area long form</summary>
|
||||||
|
RT_FKALONG = 17,
|
||||||
|
/// <summary>Help table for IPFC</summary>
|
||||||
|
RT_HELPTABLE = 18,
|
||||||
|
/// <summary>Help subtable for IPFC</summary>
|
||||||
|
RT_HELPSUBTABLE = 19,
|
||||||
|
/// <summary>DBCS uniq/font driver directory</summary>
|
||||||
|
RT_FDDIR = 20,
|
||||||
|
/// <summary>DBCS uniq/font driver</summary>
|
||||||
|
RT_FD = 21
|
||||||
|
}
|
||||||
|
}
|
||||||
138
libexeinfo/Os2/Structs.cs
Normal file
138
libexeinfo/Os2/Structs.cs
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
//
|
||||||
|
// Structs.cs
|
||||||
|
//
|
||||||
|
// Author:
|
||||||
|
// Natalia Portillo <claunia@claunia.com>
|
||||||
|
//
|
||||||
|
// Copyright (c) 2017 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.
|
||||||
|
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace libexeinfo.Os2
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct ResourceTableEntry
|
||||||
|
{
|
||||||
|
public ushort etype;
|
||||||
|
public ushort ename;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct MenuHeader
|
||||||
|
{
|
||||||
|
public ushort cb;
|
||||||
|
public ushort type;
|
||||||
|
public ushort cp;
|
||||||
|
public ushort offset;
|
||||||
|
public ushort count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Followed by data, if <see cref="MenuItem.style" /> is <see cref="MenuType.MIS_TEXT" /> a null-terminated
|
||||||
|
/// string follows, if <see cref="MenuType.MIS_BITMAP" /> a resource ID follows and if
|
||||||
|
/// <see cref="MenuType.MIS_SUBMENU" /> another header follows.
|
||||||
|
/// </summary>
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct MenuItem
|
||||||
|
{
|
||||||
|
public MenuType style;
|
||||||
|
public MenuAttribute attrib;
|
||||||
|
public ushort id;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct DialogTemplateItem
|
||||||
|
{
|
||||||
|
public ushort fsItemStatus;
|
||||||
|
public ushort cChildren;
|
||||||
|
public ushort cchClassName;
|
||||||
|
public ushort offClassName;
|
||||||
|
public ushort cchText;
|
||||||
|
public ushort offText;
|
||||||
|
public uint flStyle;
|
||||||
|
public short x;
|
||||||
|
public short y;
|
||||||
|
public short cx;
|
||||||
|
public short cy;
|
||||||
|
public ushort id;
|
||||||
|
public ushort offPresParams;
|
||||||
|
public ushort offCtlData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Dialog template, followed by several <see cref="DialogTemplateItem" />
|
||||||
|
/// </summary>
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct DialogTemplate
|
||||||
|
{
|
||||||
|
public ushort cbTemplate;
|
||||||
|
public ushort type;
|
||||||
|
public ushort codepage;
|
||||||
|
public ushort offadlgti;
|
||||||
|
public ushort fsTemplateStatus;
|
||||||
|
public ushort iItemFocus;
|
||||||
|
public ushort coffPresParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
public struct BitmapArrayHeader
|
||||||
|
{
|
||||||
|
public ushort Type;
|
||||||
|
public uint Size;
|
||||||
|
public uint Next;
|
||||||
|
public ushort XDisplay;
|
||||||
|
public ushort YDisplay;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
public struct BitmapInfoHeader
|
||||||
|
{
|
||||||
|
public ushort Type;
|
||||||
|
public uint Size;
|
||||||
|
public short XHotspot;
|
||||||
|
public short YHostpot;
|
||||||
|
public uint Offset;
|
||||||
|
public uint Fix;
|
||||||
|
public ushort X;
|
||||||
|
public ushort Y;
|
||||||
|
public ushort Planes;
|
||||||
|
public ushort BitsPerPlane;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
public struct Rgb
|
||||||
|
{
|
||||||
|
public byte Blue;
|
||||||
|
public byte Green;
|
||||||
|
public byte Red;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DecodedBitmap
|
||||||
|
{
|
||||||
|
public uint BitsPerPixel;
|
||||||
|
public uint Height;
|
||||||
|
public int[] Pixels;
|
||||||
|
public string Type;
|
||||||
|
public uint Width;
|
||||||
|
public short XHotspot;
|
||||||
|
public short YHostpot;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,22 +31,8 @@ using System.Runtime.InteropServices;
|
|||||||
|
|
||||||
namespace libexeinfo.Windows
|
namespace libexeinfo.Windows
|
||||||
{
|
{
|
||||||
public class Bitmap
|
public static class Bitmap
|
||||||
{
|
{
|
||||||
public enum Compression : uint
|
|
||||||
{
|
|
||||||
None = 0,
|
|
||||||
Rle8 = 1,
|
|
||||||
Rle4 = 2,
|
|
||||||
Bitfields = 3,
|
|
||||||
Jpeg = 4,
|
|
||||||
Png = 5,
|
|
||||||
AlphaBitfields = 6,
|
|
||||||
Cmyk = 11,
|
|
||||||
CmykRle8 = 12,
|
|
||||||
CmykRle4 = 13
|
|
||||||
}
|
|
||||||
|
|
||||||
const int VISIBLE = -16777216;
|
const int VISIBLE = -16777216;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -70,13 +56,13 @@ namespace libexeinfo.Windows
|
|||||||
|
|
||||||
// TODO: Non paletted?
|
// TODO: Non paletted?
|
||||||
pos += bitmapFileHeader.HeaderSize;
|
pos += bitmapFileHeader.HeaderSize;
|
||||||
RGB[] palette = new RGB[1 << bitmapFileHeader.BitsPerPlane];
|
Rgb[] palette = new Rgb[1 << bitmapFileHeader.BitsPerPlane];
|
||||||
buffer = new byte[Marshal.SizeOf(typeof(RGB))];
|
buffer = new byte[Marshal.SizeOf(typeof(Rgb))];
|
||||||
for(int i = 0; i < palette.Length; i++)
|
for(int i = 0; i < palette.Length; i++)
|
||||||
{
|
{
|
||||||
Array.Copy(data, pos, buffer, 0, buffer.Length);
|
Array.Copy(data, pos, buffer, 0, buffer.Length);
|
||||||
pos += buffer.Length;
|
pos += buffer.Length;
|
||||||
palette[i] = BigEndianMarshal.ByteArrayToStructureLittleEndian<RGB>(buffer);
|
palette[i] = BigEndianMarshal.ByteArrayToStructureLittleEndian<Rgb>(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// First let's do the icon itself
|
// First let's do the icon itself
|
||||||
@@ -147,9 +133,9 @@ namespace libexeinfo.Windows
|
|||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DecodedBitmap DecodeBitmap(BitmapInfoHeader header, IList<RGB> palette, byte[] data)
|
static DecodedBitmap DecodeBitmap(BitmapInfoHeader header, IList<Rgb> palette, byte[] data)
|
||||||
{
|
{
|
||||||
if(header.Compression != Compression.None) return null;
|
if(header.BitmapCompression != BitmapCompression.None) return null;
|
||||||
|
|
||||||
DecodedBitmap bitmap = new DecodedBitmap
|
DecodedBitmap bitmap = new DecodedBitmap
|
||||||
{
|
{
|
||||||
@@ -188,38 +174,5 @@ namespace libexeinfo.Windows
|
|||||||
|
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
|
||||||
public struct BitmapInfoHeader
|
|
||||||
{
|
|
||||||
public uint HeaderSize;
|
|
||||||
public uint Width;
|
|
||||||
public uint Height;
|
|
||||||
public ushort Planes;
|
|
||||||
public ushort BitsPerPlane;
|
|
||||||
public Compression Compression;
|
|
||||||
public uint ImageSize;
|
|
||||||
public uint HorizontalResolution;
|
|
||||||
public uint VerticalResolution;
|
|
||||||
public uint ColorsInPalette;
|
|
||||||
public uint ImportantColors;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
|
||||||
public struct RGB
|
|
||||||
{
|
|
||||||
public byte Blue;
|
|
||||||
public byte Green;
|
|
||||||
public byte Red;
|
|
||||||
public byte Reserved;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DecodedBitmap
|
|
||||||
{
|
|
||||||
public uint BitsPerPixel;
|
|
||||||
public uint Height;
|
|
||||||
public int[] Pixels;
|
|
||||||
public uint Width;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
42
libexeinfo/Windows/Enums.cs
Normal file
42
libexeinfo/Windows/Enums.cs
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
//
|
||||||
|
// Enums.cs
|
||||||
|
//
|
||||||
|
// Author:
|
||||||
|
// Natalia Portillo <claunia@claunia.com>
|
||||||
|
//
|
||||||
|
// Copyright (c) 2017 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.Windows
|
||||||
|
{
|
||||||
|
public enum BitmapCompression : uint
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Rle8 = 1,
|
||||||
|
Rle4 = 2,
|
||||||
|
Bitfields = 3,
|
||||||
|
Jpeg = 4,
|
||||||
|
Png = 5,
|
||||||
|
AlphaBitfields = 6,
|
||||||
|
Cmyk = 11,
|
||||||
|
CmykRle8 = 12,
|
||||||
|
CmykRle4 = 13
|
||||||
|
}
|
||||||
|
}
|
||||||
63
libexeinfo/Windows/Structs.cs
Normal file
63
libexeinfo/Windows/Structs.cs
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
//
|
||||||
|
// Structs.cs
|
||||||
|
//
|
||||||
|
// Author:
|
||||||
|
// Natalia Portillo <claunia@claunia.com>
|
||||||
|
//
|
||||||
|
// Copyright (c) 2017 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.
|
||||||
|
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace libexeinfo.Windows
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
public struct BitmapInfoHeader
|
||||||
|
{
|
||||||
|
public uint HeaderSize;
|
||||||
|
public uint Width;
|
||||||
|
public uint Height;
|
||||||
|
public ushort Planes;
|
||||||
|
public ushort BitsPerPlane;
|
||||||
|
public BitmapCompression BitmapCompression;
|
||||||
|
public uint ImageSize;
|
||||||
|
public uint HorizontalResolution;
|
||||||
|
public uint VerticalResolution;
|
||||||
|
public uint ColorsInPalette;
|
||||||
|
public uint ImportantColors;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
public struct Rgb
|
||||||
|
{
|
||||||
|
public byte Blue;
|
||||||
|
public byte Green;
|
||||||
|
public byte Red;
|
||||||
|
public byte Reserved;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DecodedBitmap
|
||||||
|
{
|
||||||
|
public uint BitsPerPixel;
|
||||||
|
public uint Height;
|
||||||
|
public int[] Pixels;
|
||||||
|
public uint Width;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -59,6 +59,8 @@
|
|||||||
<Compile Include="NE\Accelerators.cs" />
|
<Compile Include="NE\Accelerators.cs" />
|
||||||
<Compile Include="NE\GetStrings.cs" />
|
<Compile Include="NE\GetStrings.cs" />
|
||||||
<Compile Include="Os2\Bitmap.cs" />
|
<Compile Include="Os2\Bitmap.cs" />
|
||||||
|
<Compile Include="Os2\Enums.cs" />
|
||||||
|
<Compile Include="Os2\Structs.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="MZ\Consts.cs" />
|
<Compile Include="MZ\Consts.cs" />
|
||||||
<Compile Include="MZ\Info.cs" />
|
<Compile Include="MZ\Info.cs" />
|
||||||
@@ -96,6 +98,8 @@
|
|||||||
<Compile Include="Swapping.cs" />
|
<Compile Include="Swapping.cs" />
|
||||||
<Compile Include="PE\Subsystems.cs" />
|
<Compile Include="PE\Subsystems.cs" />
|
||||||
<Compile Include="Windows\Bitmap.cs" />
|
<Compile Include="Windows\Bitmap.cs" />
|
||||||
|
<Compile Include="Windows\Enums.cs" />
|
||||||
|
<Compile Include="Windows\Structs.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
|
|||||||
Reference in New Issue
Block a user