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

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

$ corflags test2.exe
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.17929
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x1
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 0
Signed    : 0

$ corflags test.exe
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.17929
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x20003
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 1
Signed    : 0

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

Ответ 1

На самом деле вы видите смесь информации из заголовка PE32 (поле PE) и заголовок манифеста, встроенного в сборку (остальное). Все это описано в SDK Windows, вам понадобится версия 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)

Ответ 2

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

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

x86: PE = PE32 и 32BIT = 1

64-бит: PE = PE32 + и 32BIT = 0