我正在处理一些相当低级的问题,并试图确定为什么用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个
32位请求: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个
32位请求:0
32BITPREF:1
签名:0

我试图弄清楚CorFlags实用程序中未公开的CorFlags值中的其他位是什么意思。引用在哪里?

最佳答案

您实际上看到的是PE32 header (PE字段)和嵌入在程序集中的 list list 的 header (其余部分)混合而成的信息。 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)

10-06 13:41