2012-04-30 10 views
10

Я думаю, мой вопрос о загрузчике CLR. Я хочу понять механику за CorFlags.exe/32BIT+ функциональность.Как работает CorFlags.exe/32BIT +?

Мы знаем, что при запуске сборки, скомпилированной с Любой флаг CPU, установленный в 64-разрядной Windows, запускается как 64-разрядный процесс. Если на этой сборке запускается CorFlags /32BIT+, она начнется как 32-разрядный процесс. Я думаю, что это увлекательная особенность.

У меня так много вопросов по этому поводу:

  1. Как это реализуется?
  2. Включен ли загрузчик ОС?
  3. Возможно ли создать собственное приложение (я думаю, неуправляемый), который загружает 32-битную или 64-битную CLR по желанию?

Есть ли статья, книга, блог и т. Д., Которая объясняет внутреннюю работу этой функции?

ответ

5

Это плохо документировано в любом месте, о котором я знаю, я могу указать только на соответствующую статью MSDN. Да, ваше предположение верно, загрузчик в Windows XP и выше осведомлены об управляемых исполняемых файлах. Он автоматически загружает платформу загрузчика .NET (c: \ windows \ system32 \ mscoree.dll), соответствующая точка входа - _CorValidateImage(). Раздел Замечания в связанном статье MSDN описывает механизм, который превращает 32-битный exe-файл в 64-разрядного процесса:

В Windows XP и более поздних версий, операционная система сдержек погрузчиком для управляемых модулей путем изучения бит каталога дескриптора COM в заголовке общего объектного файла (COFF). Установленный бит указывает управляемый модуль. Если загрузчик обнаружит управляемый модуль, он загружает Mscoree.dll и вызывает _CorValidateImage, который выполняет следующие действия:

  • подтверждает, что изображение является действительным управляемым модулем.
  • Изменяет точку входа в изображении на точку входа в среде выполнения общего языка (CLR).
  • Для 64-разрядных версий Windows изменяет изображение, которое находится в памяти, путем преобразования его из формата PE32 в формат PE32 +.
  • Возврат к загрузчику при загрузке изображений управляемого модуля.

исполняемых образов, загрузчик операционной системы затем вызывает функцию _CorExeMain, независимо от точки входа, указанной в исполняемом файле. Для изображений сборки DLL загрузчик вызывает функцию _CorDllMain .

_CorExeMain или _CorDllMain выполняет следующие действия:

  • инициализирует CLR.
  • Располагает управляемую точку входа из заголовка CLR сборки.
  • Начинается исполнение.

Загрузчик вызывает функцию _CorImageUnloading, когда управляемый модуль изображения выгружаются.Однако эта функция не выполняет никаких действий ; он просто возвращается.

+0

Благодарим за быстрый ответ. Это хорошая отправная точка. Я хотел узнать, как clr занимается секциями .reloc. Я вырыл в sscli, в основном в pedecoder.h/pewriter.cpp и нашел ответы. Тем не менее, есть много вопросов (например, о Windows 2000 x64), но я думаю, что найду ответы в sscli. –

+0

Это прост, Windows 2000 x64 последний раз был замечен большим белым Yeti. –

+1

Ничего себе. Интересно, есть ли способ воспользоваться этой «особой осведомленностью», чтобы создать правильные живые (родные коды) для Windows. – Fowl

2

Чтобы добавить ответ Ганса, есть также код режима ядра Windows, который отвечает на этот флаг. Каждый загруженный исполняемый файл имеет структуру ядра, связанную с ней SECTION_IMAGE_INFORMATION. Вот его символ информация:

0: kd> dt nt!_SECTION_IMAGE_INFORMATION 
      +0x000 TransferAddress   : Ptr64 Void 
      +0x008 ZeroBits     : Uint4B 
      +0x010 MaximumStackSize   : Uint8B 
      +0x018 CommittedStackSize  : Uint8B 
      +0x020 SubSystemType    : Uint4B 
      +0x024 SubSystemMinorVersion  : Uint2B 
      +0x026 SubSystemMajorVersion  : Uint2B 
      +0x024 SubSystemVersion   : Uint4B 
      +0x028 GpValue     : Uint4B 
      +0x02c ImageCharacteristics  : Uint2B 
      +0x02e DllCharacteristics  : Uint2B 
      +0x030 Machine     : Uint2B 
      +0x032 ImageContainsCode   : UChar 
      +0x033 ImageFlags    : UChar 
      +0x033 ComPlusNativeReady  : Pos 0, 1 Bit 
      +0x033 ComPlusILOnly    : Pos 1, 1 Bit 
      +0x033 ImageDynamicallyRelocated : Pos 2, 1 Bit 
      +0x033 ImageMappedFlat   : Pos 3, 1 Bit 
      +0x033 BaseBelow4gb    : Pos 4, 1 Bit 
      +0x033 Reserved     : Pos 5, 3 Bits 

Флаги ComPlusILOnly и ComPlusNativeReady связаны с .NET, ComPlusILOnly просто говорит, если сборка CIL только (не смешанный или родной - в этом случае сборка уже от архитектуры), и ComPlusNativeReady - 1, только если/32BIT + не установлен (32BITREQ or 32BITPREF in newer CorFlags version). Эти флаги проверяются в течение nt!PspAllocateProcess, и на их основе создается процесс 32-bit или 64-bit.

I wrote about it с некоторыми подробностями.

+0

Большое спасибо !!! Я запутался в вычислении некоторых смещений полей этой структуры, используя устаревшую информацию в справочнике Native API Reference для Windows NT/2000. –