/**
*.Name      get_exeh
*
*.Title     Прочитать заголовок EXE-файла
*
*.Descr     Функция читает заголовок EXE-файла в
*           структуру типа EXE_HDR, заказывает память
*           для таблицы размещений сегментов и считывает
*           таблицу в эту область. Адрес заказанной области
*           помещается по адресу, передаваемому в rtb.
*           Если таблица размещений отсутствует, память для
*           нее не заказывается.
*
*.Proto     int get_exeh(EXE_HDR *exeh,RELOC_TAB **rtb,FILE *exe_file)
*
*.Params       exeh -  указатель на структуру, которая
*                      должна быть заполнена информацией
*                      из заголовка EXE-файла
*
*              rtb  -  указатель на указатель на таблицу
*                      размещений сегментов программы
*
*              exe_file - указатель на открытый EXE-файл
*                      (до вызова функции нельзя обращаться
*                      к этому файлу, т.к. считается, что
*                      указатель текущего смещения установлен
*                      на начало файла)
*
*.Return    0 при успешном считывании заголовка;
*           -1 в случае неправильного формата заголовка
*
*.Sample    show_exe.c
**/

#include <stdlib.h>
#include <stdio.h>
#include "sysp.h"

int get_exeh(EXE_HDR *exeh,RELOC_TAB **rtb,FILE *exe_file) {

	int i,j,k;

	// считываем форматированную часть заголовка

	for(i=0; i < sizeof(EXE_HDR); i++) {
		*(((char*)exeh) + i) = fgetc(exe_file);
		if(feof(exe_file)) break;
	}
	if(exeh->signature != 0x5a4d) return(-1); // это EXE-файл?

	if((i=exeh->rel_item) != 0) {

		// если есть таблица перемещений, заказываем для нее память

		*rtb = (RELOC_TAB *)malloc(i*sizeof(RELOC_TAB)+16);

		// считываем таблицу перемещений

		for(k=0; k<i; k++) {
			for(j=0;j < sizeof(RELOC_TAB);j++) {

				*((char*)(*rtb)+j+k*sizeof(RELOC_TAB))=fgetc(exe_file);

				if(feof(exe_file)) break;
			}
		}
	}
	else *rtb = (RELOC_TAB *)0;

	return(0);

}
