CorFlags.exe/32BIT +如何工作?

Nul*_*Dev 11 clr loader corflags

我想我的问题是关于CLR Loader.我想了解CorFlags.exe /32BIT+功能背后的机制.

我们知道当一个人开始使用在64位Windows上设置的Any CPU标志编译的程序集时,它将以64位进程启动.如果CorFlags /32BIT+在该程序集上运行,它将以32位进程启动.我认为这是一个引人入胜的特征.

我有很多问题:

  1. 它是如何实现的?
  2. 操作系统加载器是否涉及?
  3. 是否可以构建一个自定义应用程序(我想是一个非托管的应用程序),可以根据需要加载32位或64位CLR?

是否有文章,书籍,博客等解释了此功能的内部工作原理?

Han*_*ant 6

在我所知道的任何地方都没有详细记录,我只能向您指出相关的MSDN文章.是的,您的假设是正确的,Windows XP及更高版本中的加载程序具有托管可执行文件的意识.它自动加载.NET加载程序填充程序(c:\ windows\system32\mscoree.dll),相关入口点为_CorValidateImage().链接的MSDN文章中的"备注"部分描述了将32位.exe文件转换为64位进程的机制:

在Windows XP和更高版本中,操作系统加载程序通过检查公共对象文件格式(COFF)标头中的COM描述符目录位来检查托管模块.设置位表示受管模块.如果加载程序检测到托管模块,则会加载MsCorEE.dll并调用_CorValidateImage,后者执行以下操作:

  • 确认映像是有效的托管模块.
  • 将图像中的入口点更改为公共语言运行库(CLR)中的入口点.
  • 对于64位版本的Windows,通过将其从PE32转换为PE32 +格式来修改内存中的映像.
  • 加载托管模块映像时返回加载程序.

对于可执行映像,操作系统加载程序然后调用_CorExeMain函数,而不管可执行文件中指定的入口点.对于DLL程序集图像,加载程序调用_CorDllMain函数.

_CorExeMain或_CorDllMain执行以下操作:

  • 初始化CLR.
  • 从程序集的CLR标头中找到托管入口点.
  • 开始执行.

卸载托管模块映像时,加载程序调用_CorImageUnloading函数.但是,此功能不执行任何操作; 它只是回来了.