Шаг 25 - IMAGE_FILE_HEADER

В прошлом шаге мы получили ссылку на структуру PIMAGE_NT_HEADERS, которая включает две структуры. Одна из них IMAGE_FILE_HEADER. Вот так ее мы получим.

......
	if ( pPEHeader->Signature != IMAGE_NT_SIGNATURE ) 
	{
		MessageBox(NULL,"Error PE Header signature PE","Error",MB_OK);
		return FALSE; 
	}

	IMAGE_FILE_HEADER FileHeader;
	FileHeader=(IMAGE_FILE_HEADER) pPEHeader->FileHeader; 

	return TRUE;
}

Что находится в этой структуре ??? Вот ее описание.

typedef struct _IMAGE_FILE_HEADER 
{
	USHORT  Machine;
	USHORT  NumberOfSections;
	ULONG   TimeDateStamp;
	ULONG   PointerToSymbolTable;
	ULONG   NumberOfSymbols;
	USHORT  SizeOfOptionalHeader;
	USHORT  Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

#define IMAGE_SIZEOF_FILE_HEADER 20

Последнее определение - это ее размер. Что мешает сделать нам sizeof я не понимаю. Наверно лучше этим размером не пользоваться. Первое поле Machine говорит нам о том, для какого процессора программа. Что там может быть ??? Ну, например:

Intel
MIPS
Alpha
IBM PowerPC
и так далее.

Вот мы и проверим:

......
	IMAGE_FILE_HEADER FileHeader;
	FileHeader=(IMAGE_FILE_HEADER) pPEHeader->FileHeader; 

	if (FileHeader.Machine!=IMAGE_FILE_MACHINE_I386)
	{
		MessageBox(NULL,"Error Not 386 Proccesor","Error",MB_OK);
		return FALSE; 
	}

	return TRUE;
}

Отсюда напрашивается интересный вывод. У меня стоит Windows 98 на процессоре Pentium 200MMX. А операционная система скомпилирована для команд 386. Значит она не использует новые классные команды процессора Pentium. То есть ядро операционной системы их не использует. Следующее поле это NumberOfSections. Это количество заголовков сегментов в исполнимом файле. Сегменты расположены в файле последовательно и это число позволяет опеределить когда они закончатся. В поле TimeDateStamp находится время создания модуля компоновщиком. Только это время хитрое. Это число секунд, которые прошли от полночи 1 января, 1970, по Greenwich (Англия). Поле Characteristics содержит признак наличия отладочной информации. Дело в том, что отладочная информация может находиться как в самом PE файле, так и в отдельном .DBG или вообще ее может на быть. Все это описано в этом поле.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 5.11.2000