Files
libexeinfo/exeinfo/Program.cs

115 lines
4.7 KiB
C#
Raw Normal View History

//
// Program.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;
2017-10-03 13:26:49 +01:00
using System.IO;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
2017-10-16 14:58:13 +01:00
using libexeinfo;
2017-10-03 13:26:49 +01:00
namespace exeinfo
{
class MainClass
{
public static void Main(string[] args)
{
2017-10-16 15:28:21 +01:00
if (args.Length != 1)
2017-10-03 13:26:49 +01:00
{
Console.WriteLine("exeinfo version 0.1 © 2017 Natalia Portillo");
Console.WriteLine("Usage: exeinfo file.exe");
return;
}
FileStream exeFs = File.Open(args[0], FileMode.Open, FileAccess.Read);
bool recognized = false;
2017-10-16 14:58:13 +01:00
MZ mzExe = new MZ(exeFs);
2017-10-16 15:28:21 +01:00
NE neExe = new NE(exeFs);
2017-10-03 13:26:49 +01:00
2017-10-16 15:28:21 +01:00
if (mzExe.IsMZ)
2017-10-03 13:26:49 +01:00
{
recognized = true;
2017-10-16 14:58:13 +01:00
Console.Write(mzExe.GetInfo());
2017-10-16 15:28:21 +01:00
}
2017-10-03 14:54:11 +01:00
2017-10-16 15:28:21 +01:00
if (neExe.IsNE)
{
recognized = true;
Console.Write(neExe.GetInfo());
foreach (NE.Version vers in neExe.Versions)
2017-10-03 14:54:11 +01:00
{
2017-10-16 15:28:21 +01:00
Console.WriteLine("\tVersion resource {0}:", vers.Name);
Console.WriteLine("\t\tFile version: {0}", vers.FileVersion);
Console.WriteLine("\t\tProduct version: {0}", vers.ProductVersion);
Console.WriteLine("\t\tFile type: {0}", NE.Version.TypeToString(vers.FileType));
if (vers.FileType == NE.VersionFileType.VFT_DRV)
Console.WriteLine("\t\tFile subtype: {0} driver", NE.Version.DriverToString(vers.FileSubtype));
else if (vers.FileType == NE.VersionFileType.VFT_DRV)
Console.WriteLine("\t\tFile subtype: {0} font", NE.Version.FontToString(vers.FileSubtype));
else if (vers.FileSubtype > 0)
Console.WriteLine("\t\tFile subtype: {0}", (uint)vers.FileSubtype);
Console.WriteLine("\t\tFile flags: {0}", vers.FileFlags);
Console.WriteLine("\t\tFile OS: {0}", NE.Version.OsToString(vers.FileOS));
2017-10-03 14:54:11 +01:00
2017-10-16 15:28:21 +01:00
foreach (KeyValuePair<string, Dictionary<string, string>> strByLang in vers.StringsByLanguage)
2017-10-03 17:03:21 +01:00
{
2017-10-16 15:28:21 +01:00
string cultureName;
string encodingName;
2017-10-16 15:28:21 +01:00
try
{
cultureName = new CultureInfo(Convert.ToInt32(strByLang.Key.Substring(0, 4), 16)).DisplayName;
}
catch
{
cultureName = string.Format("unsupported culture 0x{0:X4}", Convert.ToInt32(strByLang.Key.Substring(0, 4), 16));
}
2017-10-16 15:28:21 +01:00
try
{
encodingName = Encoding.GetEncoding(Convert.ToInt32(strByLang.Key.Substring(4), 16)).EncodingName;
}
catch
{
encodingName = string.Format("unsupported encoding 0x{0:X4}", Convert.ToInt32(strByLang.Key.Substring(4), 16));
}
2017-10-16 15:28:21 +01:00
Console.WriteLine("\t\tStrings for {0} in codepage {1}:", cultureName, encodingName);
foreach (KeyValuePair<string, string> strings in strByLang.Value)
Console.WriteLine("\t\t\t{0}: {1}", strings.Key, strings.Value);
2017-10-03 17:03:21 +01:00
}
2017-10-16 15:28:21 +01:00
}
2017-10-03 13:26:49 +01:00
}
if (!recognized)
2017-10-16 15:28:21 +01:00
Console.WriteLine("Executable format not recognized");
}
2017-10-03 13:26:49 +01:00
}
}