Рабочим названием платформы .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