С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
GuPixD
33 / 2 / 2
Регистрация: 18.04.2015
Сообщений: 50
1

Получение информации о бинарности (x64 - x32) dll или exe файлах

06.09.2016, 13:40. Просмотров 1318. Ответов 2
Метки нет (Все метки)

Добрых день.
Появилась необходимость получения информации о разрядности dll или exe файлах (или других иных бинарных файлах) . Вопрос какими средствами .NET можно это реализовать. Пишу программу на С#.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2016, 13:40
Ответы с готовыми решениями:

Bass.dll - Получение информации о файле
Товарищи программисты, хочу вас чуток помучать вопросиками ) Начнем: Каким...

Как в проекте C# Any CPU (или x64) импортировать функции из нативной DLL Win32?
Написал простейшую DLL в VC++ Express 2008 на основе "Проект Win32". DLL...

Упаковать exe и dll в один exe файл
Добрый день! Для защиты использую IlProtector. На выходе получается exe и 2...

C# DLL(C++) Injector x64
Видел много примеров кода в сети по внедрению DLL написанной на C++ в другие...

Inject dll из приложения x64 в игру x32
Как правильно производить инжет библиотеки из приложения x64 в прилоожение x32?...

2
OwenGlendower
Супер-модератор
Эксперт .NET
9698 / 8440 / 3614
Регистрация: 17.03.2014
Сообщений: 16,901
Записей в блоге: 1
06.09.2016, 14:42 2
GuPixD, через функцию Windows API GetBinaryType (pinvoke.net). Проверяем на SCS_64BIT_BINARY или SCS_32BIT_BINARY.
1
GuPixD
33 / 2 / 2
Регистрация: 18.04.2015
Сообщений: 50
06.09.2016, 14:49  [ТС] 3
Лучший ответ Сообщение было отмечено GuPixD как решение

Решение

OwenGlendower, Нашел вариант решения, все работает. Кидайте еще варианты реализации.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    public enum MachineType : ushort
    {
      IMAGE_FILE_MACHINE_UNKNOWN   = 0x0,
      IMAGE_FILE_MACHINE_AM33          = 0x1d3,
      IMAGE_FILE_MACHINE_AMD64        = 0x8664,
      IMAGE_FILE_MACHINE_ARM            = 0x1c0,
      IMAGE_FILE_MACHINE_EBC            = 0xebc,
      IMAGE_FILE_MACHINE_I386           = 0x14c,
      IMAGE_FILE_MACHINE_IA64           = 0x200,
      IMAGE_FILE_MACHINE_M32R          = 0x9041,
      IMAGE_FILE_MACHINE_MIPS16       = 0x266,
      IMAGE_FILE_MACHINE_MIPSFPU     = 0x366,
      IMAGE_FILE_MACHINE_MIPSFPU16  = 0x466,
      IMAGE_FILE_MACHINE_POWERPC    = 0x1f0,
      IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1,
      IMAGE_FILE_MACHINE_R4000         = 0x166,
      IMAGE_FILE_MACHINE_SH3            = 0x1a2,
      IMAGE_FILE_MACHINE_SH3DSP       = 0x1a3,
      IMAGE_FILE_MACHINE_SH4            = 0x1a6,
      IMAGE_FILE_MACHINE_SH5            = 0x1a8,
      IMAGE_FILE_MACHINE_THUMB        = 0x1c2,
      IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169,
    }
 
 
    public static MachineType GetDllMachineType(string dllPath)
    {
      // See [url]http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx[/url]
      // Offset to PE header is always at 0x3C.
      // The PE header starts with "PE\0\0" =  0x50 0x45 0x00 0x00,
      // followed by a 2-byte machine type field (see the document above for the enum).
      //
      FileStream fs     = new FileStream(dllPath, FileMode.Open, FileAccess.Read);
      BinaryReader br = new BinaryReader(fs);
 
      fs.Seek(0x3c, SeekOrigin.Begin);
 
      Int32 peOffset   = br.ReadInt32();
 
      fs.Seek(peOffset, SeekOrigin.Begin);
 
      UInt32 peHead   = br.ReadUInt32();
 
      if (peHead != 0x00004550) // "PE\0\0", little-endian
        {
          throw new Exception("Can't find PE header");
        }
 
      MachineType machineType = (MachineType)br.ReadUInt16();
 
      br.Close();
      fs.Close();
 
      return machineType;
    }
 
    // Returns true if the dll is 64-bit, false if 32-bit, and null if unknown
    private static bool UnmanagedDllIs64Bit(string dllPath)
    {
      switch (GetDllMachineType(dllPath))
      {
        case MachineType.IMAGE_FILE_MACHINE_AMD64:
        case MachineType.IMAGE_FILE_MACHINE_IA64:
                                                                           return true;
        case MachineType.IMAGE_FILE_MACHINE_I386:
                                                                           return false;
        default:
                                                                           return false;
      }
    }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2016, 14:49

x64 или x32
Доброго времени суток :) Сталкнулся я вот с чем. Купил новый компьютер, 4 ядра...

X32 или x64?
Здравствуйте! Добрался до своего старого ПК. Лазал по свойствам, и увидел, что...

Выбор x32 или x64
Вот решил и на ноутбуке Samsung R530 перейти на убунту. На нем 4Gb оперативной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru