Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 30 стр.

UptoLike

TEM_WINDOWS_GUI (0x2).»
unsigned short DLLFlags;
В [2] сказано, что это поле всегда равно 0. На практике оно ино-
гда содержит значение 0x400 («No safe exception handler»), когда
именно – установить пока не удалось. Самое интересное, что в
[5] флаг 0x400 вообще не описан.
long StackReserveSize;
Количество виртуальной памяти, резервируемое под стек. Как
правило, содержит 0x100000.
long StackCommitSize;
Начальный размер стека. Как правило, равен 0x1000.
long HeapReserveSize;
Количество виртуальной памяти, резервируемое под кучу. Как
правило, содержит 0x100000.
long HeapCommitSize;
Начальный размер кучи. Как правило, равен 0x1000.
long LoaderFlags;
Не используется и всегда содержит 0.
long NumberOfDataDirectories;
Количество директорий данных в дополнительном заголовке.
Для сборок .NET обязательно равно 16.
В конце дополнительного заголовка размещается массив из 16 дире-
кторий данных. Каждая директория данных состоит из двух полей:
long RVA;
RVA некоторой структуры. Если данная структура отсутствует в
PE-файле, это поле равно 0.
long size;
Размер структуры. Для отсутствующей структуры размер равен
0.
Для сборок .NET важны 4 из 16 директорий данных (остальные 12 ди-
ректорий, как правило, могут быть обнулены):
Директория импорта (номер 2, находится по смещению 8 отно-
сительно начала массива директорий). Указывает на данные о
функциях, импортруемых из динамическх библиотек (другими
словами, указывает на секцию «.idata»).
Директория релокаций (номер 6, смещение 40). Указывает на
таблицу релокаций.
Директория таблицы адресов импорта (номер 13, смещение 96).
В некотором смысле дублирует директорию импорта, указывая
на таблицу адресов импорта.
Директория заголовка CLI (номер 15, смещение 112). Указывает
на заголовок, описывающий метаданные сборки .NET.
Структура программных компонентов
47
сборка. Это поле игнорируется загрузчиком, и в случае сборок
.NET должно содержать значение 0.
unsigned short UserMajor;
Старшее число версии данного PE-файла. Для сборок .NET все-
гда 0.
unsigned short UserMinor;
Младшее число версии данного PE-файла. Для сборок .NET
всегда 0.
unsigned short SubsysMajor;
Старшее число версии подсистемы Windows, которая требуется
для запуска программы. В свое время применялось для того,
чтобы отличать программы, использующие новый по тем време-
нам интерфейс Windows 95 и Windows NT 4.0. В настоящее вре-
мя не используется. Для сборок .NET всегда равно 4.
unsigned short SubsysMinor;
Младшее число версии подсистемы Windows. Для сборок .NET
всегда равно 0.
long Reserved;
Это поле зарезервировано и всегда содержит 0.
long ImageSize;
Размер образа PE-файла в памяти. Это поле равно RVA секции,
которая могла бы идти непосредственно после последней сек-
ции в PE-файле. Естественно, что оно выровнено по значению
SectionAlignment.
long HeaderSize;
Суммарный размер всех заголовков, включая заголовок MS-
DOS, заголовок PE-файла, дополнительный заголовок PE-фай-
ла и массив заголовков секций. Суммарный размер кратен зна-
чению из поля FileAlignment.
long FileChecksum;
Контрольная сумма PE-файла. Для сборок .NET – всегда 0.
unsigned short SubSystem;
Идентифицирует подсистему для запуска PE-файла. Для сборок
.NET допустимы следующие значения:
0x2 – необходим графический пользовательский интерфейс
Windows;
0x3 – запускается в консольном режиме;
0x9 – необходим графический пользовательский интерфейс
Windows CE.
В [2] приводится неверная информация об этом поле:
«Subsystem required to run this image. Shall be either IMAGE_SUB-
SYSTEM_WINDOWS_CE_GUI (0x3) or IMAGE_SUBSYS-
46
CIL и системное программирование в Microsoft .NET
46                           CIL и системное программирование в Microsoft .NET   Структура программных компонентов                                      47


          сборка. Это поле игнорируется загрузчиком, и в случае сборок                     TEM_WINDOWS_GUI (0x2).»
          .NET должно содержать значение 0.                                           unsigned short DLLFlags;
     unsigned short UserMajor;                                                             В [2] сказано, что это поле всегда равно 0. На практике оно ино-
          Старшее число версии данного PE-файла. Для сборок .NET все-                      гда содержит значение 0x400 («No safe exception handler»), когда
          гда 0.                                                                           именно – установить пока не удалось. Самое интересное, что в
     unsigned short UserMinor;                                                             [5] флаг 0x400 вообще не описан.
          Младшее число версии данного PE-файла. Для сборок .NET                      long StackReserveSize;
          всегда 0.                                                                        Количество виртуальной памяти, резервируемое под стек. Как
     unsigned short SubsysMajor;                                                           правило, содержит 0x100000.
          Старшее число версии подсистемы Windows, которая требуется                  long StackCommitSize;
          для запуска программы. В свое время применялось для того,                        Начальный размер стека. Как правило, равен 0x1000.
          чтобы отличать программы, использующие новый по тем време-                  long HeapReserveSize;
          нам интерфейс Windows 95 и Windows NT 4.0. В настоящее вре-                      Количество виртуальной памяти, резервируемое под кучу. Как
          мя не используется. Для сборок .NET всегда равно 4.                              правило, содержит 0x100000.
     unsigned short SubsysMinor;                                                      long HeapCommitSize;
          Младшее число версии подсистемы Windows. Для сборок .NET                         Начальный размер кучи. Как правило, равен 0x1000.
          всегда равно 0.                                                             long LoaderFlags;
     long Reserved;                                                                        Не используется и всегда содержит 0.
          Это поле зарезервировано и всегда содержит 0.                               long NumberOfDataDirectories;
     long ImageSize;                                                                       Количество директорий данных в дополнительном заголовке.
          Размер образа PE-файла в памяти. Это поле равно RVA секции,                      Для сборок .NET обязательно равно 16.
          которая могла бы идти непосредственно после последней сек-                  В конце дополнительного заголовка размещается массив из 16 дире-
          ции в PE-файле. Естественно, что оно выровнено по значению             кторий данных. Каждая директория данных состоит из двух полей:
          SectionAlignment.                                                           long RVA;
     long HeaderSize;                                                                      RVA некоторой структуры. Если данная структура отсутствует в
          Суммарный размер всех заголовков, включая заголовок MS-                          PE-файле, это поле равно 0.
          DOS, заголовок PE-файла, дополнительный заголовок PE-фай-                   long size;
          ла и массив заголовков секций. Суммарный размер кратен зна-                      Размер структуры. Для отсутствующей структуры размер равен
          чению из поля FileAlignment.                                                     0.
     long FileChecksum;                                                               Для сборок .NET важны 4 из 16 директорий данных (остальные 12 ди-
          Контрольная сумма PE-файла. Для сборок .NET – всегда 0.                ректорий, как правило, могут быть обнулены):
     unsigned short SubSystem;                                                          • Директория импорта (номер 2, находится по смещению 8 отно-
          Идентифицирует подсистему для запуска PE-файла. Для сборок                       сительно начала массива директорий). Указывает на данные о
          .NET допустимы следующие значения:                                               функциях, импортруемых из динамическх библиотек (другими
          0x2 – необходим графический пользовательский интерфейс                           словами, указывает на секцию «.idata»).
          Windows;                                                                      • Директория релокаций (номер 6, смещение 40). Указывает на
          0x3 – запускается в консольном режиме;                                           таблицу релокаций.
          0x9 – необходим графический пользовательский интерфейс                        • Директория таблицы адресов импорта (номер 13, смещение 96).
          Windows CE.                                                                      В некотором смысле дублирует директорию импорта, указывая
          В [2] приводится неверная информация об этом поле:                               на таблицу адресов импорта.
          «Subsystem required to run this image. Shall be either IMAGE_SUB-             • Директория заголовка CLI (номер 15, смещение 112). Указывает
          SYSTEM_WINDOWS_CE_GUI (0x3) or IMAGE_SUBSYS-                                     на заголовок, описывающий метаданные сборки .NET.