Где я могу найти ссылку на то, что означает каждый бит значения CorFlags?

Я возиться с некоторыми довольно низкоуровневыми вещами и пытаюсь определить, почему я получаю разные результаты с помощью утилиты CorFlags.exe. Для справки, выводы таковы:

$ corflags test2.exe
Microsoft (R).NET Framework Инструмент преобразования CorFlags. Версия 4.0.30319.17929
Авторское право (c) Microsoft Corporation. Все права защищены.

Версия: v4.0.30319
Заголовок CLR: 2,5
PE: PE32
CorFlags: 0x1
ILONLY: 1
32BITREQ: 0
32BITPREF: 0
Подписано: 0

$ corflags test.exe
Microsoft (R) .NET Framework Инструмент преобразования CorFlags. Версия 4.0.30319.17929
Авторское право (c) Microsoft Corporation. Все права защищены.

Версия: v4.0.30319
Заголовок CLR: 2,5
PE: PE32
CorFlags: 0x20003
ILONLY: 1
32BITREQ: 0
32BITPREF: 1
Подписано: 0

Я пытаюсь выяснить, что означают другие биты в значении CorFlags, которые не отображаются в утилите CorFlags. Где ссылка для этого?

2 ответа

Решение

Фактически вы видите смесь информации из заголовка PE32 (поле PE) и заголовка манифеста, встроенного в сборку (остальное). Все это описано в Windows SDK, вам потребуется версия 8, чтобы получить новый флаг 32BITPREF. Используйте C:\Program Files (x86)\Windows Kits\8.0\Include\um\CorHdr.h, множество комментариев в этом файле, которые описывают объявления.

Я скопирую раздел, который описывает значения IMAGE_COR20_HEADER.Flags:

COMIMAGE_FLAGS_ILONLY               =0x00000001,
COMIMAGE_FLAGS_32BITREQUIRED        =0x00000002,
COMIMAGE_FLAGS_IL_LIBRARY           =0x00000004,
COMIMAGE_FLAGS_STRONGNAMESIGNED     =0x00000008,
COMIMAGE_FLAGS_NATIVE_ENTRYPOINT    =0x00000010,
COMIMAGE_FLAGS_TRACKDEBUGDATA       =0x00010000,
COMIMAGE_FLAGS_32BITPREFERRED       =0x00020000,

Таким образом, отображаемое значение 0x20003 разбивается на 32BITPREFERRED (0x20000) плюс 32BITREQUIRED (0x00002) плюс ILONLY (0x00001)

Интерпретация флагов:

Любой процессор: PE = PE32 и 32BIT = 0

x86: PE = PE32 и 32BIT = 1

64-разрядный: PE = PE32+ и 32BIT = 0

Другие вопросы по тегам