I guess my question is about the CLR Loader. I want to understand the mechanics behind CorFlags.exe /32BIT+
functionality.
We know that when one starts an assembly compiled with the Any CPU flag set on 64-bit Windows, it starts as a 64-bit process. If one run CorFlags /32BIT+
on that assembly, it will start as a 32-bit process. I think this is a fascinating feature.
I have so many questions about it:
- How is it implemented?
- Does the OS Loader get involved?
- Is possible to build a custom application (I guess an unmanaged one) that loads 32-bit or 64-bit CLR at a wish?
Is there an article, book, blog, etc that explains the inner workings of this feature?
This isn't well documented in any place I know of, I can only point you to a relevant MSDN article. Yes, your assumption is correct, the loader in Windows XP and up has awareness of managed executables. It automatically loads the .NET loader shim (c:\windows\system32\mscoree.dll), the relevant entrypoint is _CorValidateImage(). The Remarks section in the linked MSDN article describes the mechanism that turns a 32-bit .exe file into a 64-bit process: