/*****************************************************************************
;*                                                                           *
;*    This structure define format of LE header for OS/2,Windows exe files   *
;*       ----------------------------------------------------------          *
;*                                                                           *
;*    Author Trigub Serge. B&M&T Corp.                                       *
;*           10 January 1993                                                 *
;*                                                                           *
;*****************************************************************************/

enum CPU_Type
{
	i80286       = 0x01,
	i80386       = 0x02,
	i80486       = 0x03,
	i80586       = 0x04,
	i860_N10     = 0x20,
	i860_N11     = 0x21,
	MIPS_Mark_I  = 0x40,
	MIPS_Mark_II = 0x41,
	MIPS_Mark_III = 0x42
};

struct Module_Type_Flags
{
	unsigned long Module_Is_DLL        : 1;
	unsigned long Reserved1            : 1;
	unsigned long Errors_In_Module     : 1;
	unsigned long Reserved2            : 1;
	unsigned long Code_Load_Application: 1;
	unsigned long Application_Type     : 3;

	unsigned long Reserved3            : 2;
	unsigned long No_External_FIXUP    : 1;
	unsigned long No_Internal_FIXUP    : 1;
	unsigned long Protected_Mode_Only  : 1;
	unsigned long Global_Initialization: 1;
	unsigned long Multipledata         : 1;
	unsigned long Singledata           : 1;
};

struct LE_Header
{
	unsigned short Signature;	// Signature 'LE' for exe header
	unsigned char Byte_Order;
	unsigned char Word_Order;
	unsigned long Exec_Format_Level;
	unsigned short CPU_Type;
	unsigned short Target_OS;
	unsigned long Module_Version;
	union
	{
		unsigned long Type_Flags;
		Module_Type_Flags Flags;
	};
	unsigned long Number_Of_Memory_Pages;
	unsigned long Initial_CS;
	unsigned long Initial_EI;
	unsigned long Initial_SS;
	unsigned long Initial_ESP;
	unsigned long Memory_Page_Size;
	unsigned long Bytes_On_Last_Page;
	unsigned long Fixup_Section_Size;
	unsigned long Fixup_Section_Checksum;
	unsigned long Loader_Section_Size;
	unsigned long Loader_Section_CheckSum;
	unsigned long Object_Table_Offset;
	unsigned long Object_Table_Entries;
	unsigned long Object_Page_Map_Table_Offset;
	unsigned long Object_Iterate_Data_Map_Offset;
	unsigned long Resource_Table_Offset;
	unsigned long Resource_Table_Entries;
	unsigned long Resident_Names_Table_Offset;
	unsigned long Entry_Table_Offset;
	unsigned long Module_Directives_Table_Offset;
	unsigned long Module_Directives_Table_Entries;
	unsigned long Fixup_Page_Table_Offset;
	unsigned long Fixup_Record_Table_Offset;
	unsigned long Imported_Module_Names_Table_Offset;
	unsigned long Imported_Modules_Count;
	unsigned long Imported_Procedure_Name_Table_Offset;
	unsigned long Per_page_Checksum_Table_Offset;
	unsigned long Data_Pages_Offset;
	unsigned long Preload_Page_Count;
	unsigned long Nonresident_Names_Table_Offset;
	unsigned long Nonresident_Names_Table_Length;
	unsigned long Nonresident_Names_Table_Checksum;
	unsigned long Automatic_Data_Object;
	unsigned long Debug_Information_Offset;
	unsigned long Debug_Information_Length;
	unsigned long Preload_Instance_Pages_Number;
	unsigned long Demand_Instance_Pages_Number;
	unsigned long Extra_Heap_Allocation;
	unsigned long Unknown[1];
};

struct OBJ_FLAGS
{
	unsigned long I_O_Privilage_Level  : 1;
	unsigned long Conforming_Segment   : 1;
	unsigned long BIG_Segment          : 1;
	unsigned long Alias_16_16          : 1;
	unsigned long Reserved             : 1;
	unsigned long Resident_Long_Locable: 1;
	unsigned long Segment_Type         : 2;
	unsigned long Segment_Invalid      : 1;
	unsigned long Segment_Preloaded    : 1;
	unsigned long Segment_Shared       : 1;
	unsigned long Segment_Discardable  : 1;
	unsigned long Segment_Resource     : 1;
	unsigned long Segment_Executable   : 1;
	unsigned long Segment_Writable     : 1;
	unsigned long Segment_Readable     : 1;
};

struct Object_Table
{
	unsigned long Virtual_Segment_Size;
	unsigned long Relocation_Base_Address;
	union
	{
		unsigned long ObjTableFlags;
		OBJ_FLAGS FLAGS;
	};
	unsigned long Page_MAP_Index;
	unsigned long Page_MAP_Entries;
	unsigned long Reserved;
};


enum
{
	Segment_Type_Normal,
	Segment_Zero_Filled,
	Segment_Resident,
	Segment_Resident_contiguous
};

struct PM_FLAGS
{
	unsigned char Page_Type: 2;
	unsigned char Reserved : 6;
	unsigned char End_Page : 2;
};

struct Page_Map_Table
{
	unsigned short High_Page_Number;
	unsigned char Low_Page_Number;
	//	union{
	//		PM_FLAGS SFLAGS;
	unsigned char FLAGS;
	//	};
};

enum //LE_PM_FLG_Page_Type_Enum        ENUM    {
{
	Legal_Page      = 0,
	Iterated_Page   = 1,
	Invalid_Page    = 2,
	Zero_Filled_Page = 3
};

struct Entry_Table
{
	unsigned char Number_of_Entries;
	unsigned char Bungle_Flags;
	unsigned short Object_Index;
	//LE_Entry_First_Entry            equ     $
};

struct Entry
{
	unsigned char Entry_Flags;
	union
	{
		unsigned short Word_Offset;
		unsigned long Dword_Offset;
	};
};

struct Entry_Bungle_Flags
{
	unsigned char Bits_Entry : 1;
	unsigned char Valid_Entry: 1;
};

struct Fixup_Record_Table
{
	unsigned char Relocation_Address_Type;
	unsigned char Relocation_Type;
	unsigned short Relocation_Page_Offset;
	unsigned char Segment_or_Module_Index;
	unsigned short Offset_Or_Ordinal_Value;
};

//struct Rel_Addr_Type
//{
//	unsigned char Repeat_Offset       : 1;
//	unsigned char Target_OFFSET_Absent: 1;
//	unsigned char Rel_Addr_Type      : 4;
//};

enum// LE_Relocation_Address_Type_ENUM
{
	RA_Low_Byte           = 0,
	RA_16_bits_selector   = 2,
	RA_32_bits_Far_Pointer = 3,
	RA_16_bits_Offset     = 5,
	RA_48_bits_Far_Pointer = 6,
	RA_32_bits_Offset     = 7,
	RA_32_bits_EIP_Rel    = 8
};

//struct Reloc_Type
//{
//	unsigned char Ordinal_Byte    : 1;
//	unsigned char Reserv1         : 1;
//	unsigned char ABS_Dword       : 1;
//	unsigned char Target_Offset_32: 1;
//	unsigned char Reserv2         : 1;
//	unsigned char ADDITIVE_Type   : 1;
//	unsigned char Reloc_Type      : 2;
//};

enum //LE_Relocation_Type_ENUM
{
	Internal_Reference = 0,
	Imported_Ordinal  = 1,
	Imported_Name     = 2,
	OS_FIXUP          = 3
};

