Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355

Исполняемый файл или нет?

20.11.2013, 17:38. Показов 1765. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите WinAPI для определения, является ли файл исполняемым в среде Windows, или какой-нибудь другой вариант решения задачи. Определение по расширению файла не подходит.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.11.2013, 17:38
Ответы с готовыми решениями:

Импорт .ico в исполняемый файл
День добрый, с утра сегодня пытаюсь засунуть ресурсы в exe-шник с помощью WinAPI, и, как показывает наличие этой темы на форуме, весьма...

Записать исполняемый файл в байтовый массив
Здравствуйте, товарищи. У меня имеется небольшой фрагмент кода, который получает имя собственного исполняемого файла. Задача состоит в...

Как узнать является файл каталогом или нет?
Подскажите как узнать является ли файл каталогом или нет. через FindFirstFile() и FindNextFile(). #include <iostream> ...

15
143 / 52 / 17
Регистрация: 12.11.2013
Сообщений: 162
20.11.2013, 17:39
Цитата Сообщение от mytilus Посмотреть сообщение
Подскажите WinAPI для определения, является ли файл исполняемым в среде Windows, или какой-нибудь другой вариант решения задачи. Определение по расширению файла не подходит.
Можно читать заголовок Win32 PE и на его основании делать вывод.
1
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
20.11.2013, 17:42  [ТС]
Alexxandr, значит ли ваш ответ, что такой конкретной API-функции не существует?
0
143 / 52 / 17
Регистрация: 12.11.2013
Сообщений: 162
20.11.2013, 17:58
Цитата Сообщение от mytilus Посмотреть сообщение
Alexxandr, значит ли ваш ответ, что такой конкретной API-функции не существует?
Если честно, я не думаю, что такая API-функция существует, но, если Вы её найдёте - это будет прекрасно.

Сами описания заголовков есть вроде в winnt.h

Выдержки из winnt.h
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
typedef struct _IMAGE_VXD_HEADER {
    WORD e32_magic;
    BYTE e32_border;
    BYTE e32_worder;
    DWORD e32_level;
    WORD e32_cpu;
    WORD e32_os;
    DWORD e32_ver;
    DWORD e32_mflags;
    DWORD e32_mpages;
    DWORD e32_startobj;
    DWORD e32_eip;
    DWORD e32_stackobj;
    DWORD e32_esp;
    DWORD e32_pagesize;
    DWORD e32_lastpagesize;
    DWORD e32_fixupsize;
    DWORD e32_fixupsum;
    DWORD e32_ldrsize;
    DWORD e32_ldrsum;
    DWORD e32_objtab;
    DWORD e32_objcnt;
    DWORD e32_objmap;
    DWORD e32_itermap;
    DWORD e32_rsrctab;
    DWORD e32_rsrccnt;
    DWORD e32_restab;
    DWORD e32_enttab;
    DWORD e32_dirtab;
    DWORD e32_dircnt;
    DWORD e32_fpagetab;
    DWORD e32_frectab;
    DWORD e32_impmod;
    DWORD e32_impmodcnt;
    DWORD e32_impproc;
    DWORD e32_pagesum;
    DWORD e32_datapage;
    DWORD e32_preload;
    DWORD e32_nrestab;
    DWORD e32_cbnrestab;
    DWORD e32_nressum;
    DWORD e32_autodata;
    DWORD e32_debuginfo;
    DWORD e32_debuglen;
    DWORD e32_instpreload;
    DWORD e32_instdemand;
    DWORD e32_heapsize;
    BYTE e32_res3[12];
    DWORD e32_winresoff;
    DWORD e32_winreslen;
    WORD e32_devid;
    WORD e32_ddkver;
} IMAGE_VXD_HEADER,*PIMAGE_VXD_HEADER;
#pragma pack(pop)
#pragma pack(push,4)
typedef struct _IMAGE_FILE_HEADER {
    WORD Machine;
    WORD NumberOfSections;
    DWORD TimeDateStamp;
    DWORD PointerToSymbolTable;
    DWORD NumberOfSymbols;
    WORD SizeOfOptionalHeader;
    WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD VirtualAddress;
    DWORD Size;
} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
typedef struct _IMAGE_OPTIONAL_HEADER {
    WORD Magic;
    BYTE MajorLinkerVersion;
    BYTE MinorLinkerVersion;
    DWORD SizeOfCode;
    DWORD SizeOfInitializedData;
    DWORD SizeOfUninitializedData;
    DWORD AddressOfEntryPoint;
    DWORD BaseOfCode;
    DWORD BaseOfData;
    DWORD ImageBase;
    DWORD SectionAlignment;
    DWORD FileAlignment;
    WORD MajorOperatingSystemVersion;
    WORD MinorOperatingSystemVersion;
    WORD MajorImageVersion;
    WORD MinorImageVersion;
    WORD MajorSubsystemVersion;
    WORD MinorSubsystemVersion;
    DWORD Reserved1;
    DWORD SizeOfImage;
    DWORD SizeOfHeaders;
    DWORD CheckSum;
    WORD Subsystem;
    WORD DllCharacteristics;
    DWORD SizeOfStackReserve;
    DWORD SizeOfStackCommit;
    DWORD SizeOfHeapReserve;
    DWORD SizeOfHeapCommit;
    DWORD LoaderFlags;
    DWORD NumberOfRvaAndSizes;
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER,*PIMAGE_OPTIONAL_HEADER;
typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
    WORD Magic;
    BYTE MajorLinkerVersion;
    BYTE MinorLinkerVersion;
    DWORD SizeOfCode;
    DWORD SizeOfInitializedData;
    DWORD SizeOfUninitializedData;
    DWORD AddressOfEntryPoint;
    DWORD BaseOfCode;
    DWORD BaseOfData;
    DWORD BaseOfBss;
    DWORD GprMask;
    DWORD CprMask[4];
    DWORD GpValue;
} IMAGE_ROM_OPTIONAL_HEADER,*PIMAGE_ROM_OPTIONAL_HEADER;
#pragma pack(pop)
#pragma pack(push,2)
typedef struct _IMAGE_DOS_HEADER {
    WORD e_magic;
    WORD e_cblp;
    WORD e_cp;
    WORD e_crlc;
    WORD e_cparhdr;
    WORD e_minalloc;
    WORD e_maxalloc;
    WORD e_ss;
    WORD e_sp;
    WORD e_csum;
    WORD e_ip;
    WORD e_cs;
    WORD e_lfarlc;
    WORD e_ovno;
    WORD e_res[4];
    WORD e_oemid;
    WORD e_oeminfo;
    WORD e_res2[10];
    LONG e_lfanew;
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
typedef struct _IMAGE_OS2_HEADER {
    WORD ne_magic;
    CHAR ne_ver;
    CHAR ne_rev;
    WORD ne_enttab;
    WORD ne_cbenttab;
    LONG ne_crc;
    WORD ne_flags;
    WORD ne_autodata;
    WORD ne_heap;
    WORD ne_stack;
    LONG ne_csip;
    LONG ne_sssp;
    WORD ne_cseg;
    WORD ne_cmod;
    WORD ne_cbnrestab;
    WORD ne_segtab;
    WORD ne_rsrctab;
    WORD ne_restab;
    WORD ne_modtab;
    WORD ne_imptab;
    LONG ne_nrestab;
    WORD ne_cmovent;
    WORD ne_align;
    WORD ne_cres;
    BYTE ne_exetyp;
    BYTE ne_flagsothers;
    WORD ne_pretthunks;
    WORD ne_psegrefbytes;
    WORD ne_swaparea;
    WORD ne_expver;
} IMAGE_OS2_HEADER,*PIMAGE_OS2_HEADER;
#pragma pack(pop)
#pragma pack(push,4)
typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS;
typedef struct _IMAGE_ROM_HEADERS {
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
} IMAGE_ROM_HEADERS,*PIMAGE_ROM_HEADERS;
typedef struct _IMAGE_SECTION_HEADER {
    BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
    union {
        DWORD PhysicalAddress;
        DWORD VirtualSize;
    } Misc;
    DWORD VirtualAddress;
    DWORD SizeOfRawData;
    DWORD PointerToRawData;
    DWORD PointerToRelocations;
    DWORD PointerToLinenumbers;
    WORD NumberOfRelocations;
    WORD NumberOfLinenumbers;
    DWORD Characteristics;
} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
#pragma pack(pop)
#pragma pack(push,2)
typedef struct _IMAGE_SYMBOL {
    union {
        BYTE ShortName[8];
        struct {
            DWORD Short;
            DWORD Long;
        } Name;
        PBYTE LongName[2];
    } N;
    DWORD Value;
    SHORT SectionNumber;
    WORD Type;
    BYTE StorageClass;
    BYTE NumberOfAuxSymbols;
} IMAGE_SYMBOL,*PIMAGE_SYMBOL;
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 12
20.11.2013, 18:07
SHGetFileInfo с флагом SHGFI_EXETYPE вернет тип executable файла. Подробности - по ссылке, подзаголовок Return value
1
 Аватар для FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
20.11.2013, 19:19
Цитата Сообщение от Alexxandr Посмотреть сообщение
Можно читать заголовок Win32 PE и на его основании делать вывод.
А если в файле будет записано следующее.

PEUGEOT
MAZDA

Программа вернет, что это исполняемый файл. Хотя это не так.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.11.2013, 20:02
PE-заголовок - это не две буквы 'PE'
К тому же у любого исполняемого файла Windows есть заголовок DOS.
0
 Аватар для FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
20.11.2013, 21:18
Цитата Сообщение от castaway Посмотреть сообщение
PE-заголовок - это не две буквы 'PE'
К тому же у любого исполняемого файла Windows есть заголовок DOS.
Посмотрите шестнадцатеричным редактором. Это две буквы PE, точно также как и две буквы MZ в начале файла.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 12
20.11.2013, 21:37
FreeMan108, недостаточно проверить только первые 2 символа, чтобы принимать решение о том, является ли файл исполняемым. Да и на кой оно? SHGetFileInfo пробовал? Она прекрасно определяет, ни один из твоих примеров не ввел ее в заблуждение...
0
 Аватар для FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
20.11.2013, 21:51
Цитата Сообщение от UI Посмотреть сообщение
FreeMan108, недостаточно проверить только первые 2 символа, чтобы принимать решение о том, является ли файл исполняемым. Да и на кой оно? SHGetFileInfo пробовал? Она прекрасно определяет, ни один из твоих примеров не ввел ее в заблуждение...
Ну так я же про это говорю, что нельзя определять по двум символам.

Цитата Сообщение от Alexxandr Посмотреть сообщение
Можно читать заголовок Win32 PE и на его основании делать вывод.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.11.2013, 21:10
Прежде чем что-то утверждать сначала убедись в этом.
0
 Аватар для FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
21.11.2013, 21:28
Правильнее было бы сказать, что PE заголовок начинается с двух байтов PE. Это уже точно.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.11.2013, 22:39
Найди в интернете что такое заголовок PE файла и не выставляй себя идиотом.
Две буквы PE - это просто сигнатура.
0
 Аватар для FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
22.11.2013, 17:54
Для тех, кто в недоумении

Сигнатура файланабор байтов, обеспечивающий идентификацию типа файла.
Идентификация PE заголовка это два байта (первые) PE. Пора бы тебе уже установить шестнадцатеричный редактор и посмотреть.

В общем советую тебе ознакомится с вот этим полезным ресурсом. Ну и словарик конечно же.

Добавлено через 3 минуты
По этим двум байтам собирались определять exe файл, но этого недостаточно. Вот как уже сказали есть функция SHGetFileInfo.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
22.11.2013, 19:46
Ты бы сначала сам ознакомился с этими ресурсами.
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
22.11.2013, 21:17  [ТС]
PE-заголовок - это не строка "PE". Это структурированные данные. Строка "PE" - это сигнатура PE-заголовка (если угодно, заголовок PE-заголовка). Задача "прочитать PE-заголовок" не ограничивается прочтением двух символов сигнатуры. Другое дело - что и какой-нибудь *.txt может содержать данные, совпадающие по структуре с PE-заголовком.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.11.2013, 21:17
Помогаю со студенческими работами здесь

Winapi: может ли исполняемый файл хранить в себе ресурсы, как в .net?
winapi: может ли исполняемый файл хранить в себе ресурсы, как в .net?

Не могу создать исполняемый файл
Здравствуйте. Прошу прощения за столь нубский вопрос. Но как создать исполняемый файл в компиляторе Open Watcom? В бэйсике и паскале всё...

Ошибка.Не удается найти исполняемый файл
Жму : VS studio 2019 1.Создание проекта 2.Консольное приложение C++ 3. Имя проекта "Calculator using switch",...

Mac OS, Исполняемый файл или независимый запуска на Mac
Добрый день! Такой вопрос. Есть определенная программа, которую необходимо запустить на Mac. Окей, сделал. Погуглил, поднапрягся и в...

Открыть исполняемый файл, если запущен конкретный файл
Доброго времени суток! Вот такая проблемка мучает: мне нужно решить следующую задачу: открыть исполняемый файл,если запущен конкретный...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru