Московский государственный технический университет им. Н.Э. Баумана
Опубликован: 28.06.2006 | Доступ: свободный | Студентов: 12461 / 340 | Оценка: 4.54 / 3.83 | Длительность: 22:03:00
ISBN: 978-5-9556-0055-0
Дополнительный материал 1:

Приложение A

< Лекция 15 || Дополнительный материал 1: 1234 || Дополнительный материал 2 >

Исходный код программы 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
< Лекция 15 || Дополнительный материал 1: 1234 || Дополнительный материал 2 >
Анастасия Булинкова
Анастасия Булинкова
Рабочим названием платформы .NET было