| Рабочим названием платформы .NET было |
Опубликован: 28.06.2006 | Уровень: специалист | Доступ: свободно | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Дополнительный материал 1:
Приложение A
Исходный код программы pegen
Исходный код программы pegen, выполняющей генерацию сборки .NET, размещен в четырех файлах:
-
macros.h
Содержит макроопределения, которые используются в остальных файлах.
-
pe.h
Интерфейс модуля генерации PE-файла.
-
pe.c
Реализация модуля генерации PE-файла.
-
main.c
Главный модуль, использующий модуль генерации для создания простейшей сборки .NET.
A.1. macros.h
#ifndef MACROS_H
#define MACROS_H
#define SECTION_ALIGNMENT 0x2000
#define EXE_TYPE 0x1
#define DLL_TYPE 0x0
#define SIZEOF_JMP_STUB 6
#define SIZEOF_IMPORT_TABLE 82
#define CNT_CODE 0x00000020
#define CNT_INITIALIZED_DATA 0x00000040
#define CNT_UNINITIALIZED_DATA 0x00000080
#define MEM_DISCARDABLE 0x02000000
#define MEM_EXECUTE 0x20000000
#define MEM_READ 0x40000000
#define MEM_WRITE 0x80000000
#define IMAGE_FILE_MACHINE_I386 0x014c
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9
// Aligned to FileAlignment boundary
#define SIZEOF_HEADERS(params) \
align(sizeof(struct HEADERS), params->FileAlignment)
#define SIZEOF_TEXT(params) \
align(params->SizeOfMetadata + params->SizeOfCilCode, \
params->FileAlignment)
#define SIZEOF_CLI(params) \
align(sizeof(struct CLI_SECTION_IMAGE), params->FileAlignment)
#define SIZEOF_RELOC(params) \
align(sizeof(struct RELOC_SECTION), params->FileAlignment)
// Aligned to SectionAlignment boundary
#define SIZEOF_HEADERS_M(params) \
align(sizeof(struct HEADERS), SECTION_ALIGNMENT)
#define SIZEOF_TEXT_M(params) \
align(params->SizeOfMetadata + params->SizeOfCilCode, \
SECTION_ALIGNMENT)
#define SIZEOF_CLI_M \
align(sizeof(struct CLI_SECTION_IMAGE), SECTION_ALIGNMENT)
#define SIZEOF_RELOC_M \
align(sizeof(struct RELOC_SECTION), SECTION_ALIGNMENT)
#define SIZEOF_METHODS(params) \
align(params->SizeOfCilCode, SECTION_ALIGNMENT)
// Not aligned
#define SIZEOF_HEADERS_NOTALIGNED \
sizeof(struct HEADERS)
#define SIZEOF_CLI_NOTALIGNED \
sizeof(struct CLI_SECTION_IMAGE)
#define SIZEOF_TEXT_NOTALIGNED(params) \
params->SizeOfMetadata + params->SizeOfCilCode
#define SIZEOF_CLI_HEADER \
sizeof(struct IMAGE_COR20_HEADER)
#define SIZEOF_RELOC_NOTALIGNED \
sizeof(struct RELOC_SECTION)
#define SIZEOF_DATA_DIRECTORY \
sizeof(struct IMAGE_DATA_DIRECTORY)
// RVA of section
#define RVA_OF_TEXT \
align(sizeof(struct HEADERS), SECTION_ALIGNMENT)
#define RVA_OF_CLI(params) \
RVA_OF_TEXT + \
align(params->SizeOfMetadata + params->SizeOfCilCode,
SECTION_ALIGNMENT)
#define RVA_OF_RELOC(params) \
RVA_OF_CLI(params) + SIZEOF_CLI_M
#define TYPE_OFFSET(a,b) \
(a*0x1000 | b)
#define OFFSETOF(s,m) \
(size_t)&(((s *)0)->m)
#endif