/***************************************************************************** ;* * ;* 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 };