Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenexeformat.h
Go to the documentation of this file.
00001 #ifndef REACTOS_EXEFORMAT_H_INCLUDED_ 00002 #define REACTOS_EXEFORMAT_H_INCLUDED_ 1 00003 00004 /* 00005 * LOADER API 00006 */ 00007 /* OUT flags returned by a loader */ 00008 #define EXEFMT_LOAD_ASSUME_SEGMENTS_SORTED (1 << 0) 00009 #define EXEFMT_LOAD_ASSUME_SEGMENTS_NO_OVERLAP (1 << 1) 00010 #define EXEFMT_LOAD_ASSUME_SEGMENTS_PAGE_ALIGNED (1 << 2) 00011 00012 #define EXEFMT_LOAD_ASSUME_SEGMENTS_OK \ 00013 ( \ 00014 EXEFMT_LOAD_ASSUME_SEGMENTS_SORTED | \ 00015 EXEFMT_LOAD_ASSUME_SEGMENTS_NO_OVERLAP | \ 00016 EXEFMT_LOAD_ASSUME_SEGMENTS_PAGE_ALIGNED \ 00017 ) 00018 00019 /* 00020 Minumum size of the buffer passed to each loader for identification of the 00021 executable 00022 */ 00023 #define EXEFMT_LOAD_HEADER_SIZE (0x2000) 00024 00025 /* Special values for the base address of images */ 00026 /* 00027 Base address can't be represented in an ULONG_PTR: any effective load address 00028 will require relocation 00029 */ 00030 #define EXEFMT_LOAD_BASE_NONE ((ULONG_PTR)-1) 00031 00032 /* Base address never matters, relocation never required */ 00033 #define EXEFMT_LOAD_BASE_ANY ((ULONG_PTR)-2) 00034 00035 typedef NTSTATUS (NTAPI * PEXEFMT_CB_READ_FILE) 00036 ( 00037 IN PVOID File, 00038 IN PLARGE_INTEGER Offset, 00039 IN ULONG Length, 00040 OUT PVOID * Data, 00041 OUT PVOID * AllocBase, 00042 OUT PULONG ReadSize 00043 ); 00044 00045 typedef PMM_SECTION_SEGMENT (NTAPI * PEXEFMT_CB_ALLOCATE_SEGMENTS) 00046 ( 00047 IN ULONG NrSegments 00048 ); 00049 00050 typedef NTSTATUS (NTAPI * PEXEFMT_LOADER) 00051 ( 00052 IN CONST VOID * FileHeader, 00053 IN SIZE_T FileHeaderSize, 00054 IN PVOID File, 00055 OUT PMM_IMAGE_SECTION_OBJECT ImageSectionObject, 00056 OUT PULONG Flags, 00057 IN PEXEFMT_CB_READ_FILE ReadFileCb, 00058 IN PEXEFMT_CB_ALLOCATE_SEGMENTS AllocateSegmentsCb 00059 ); 00060 00061 /* 00062 * STATUS CONSTANTS 00063 */ 00064 00065 #define FACILITY_ROS_EXEFMT (0x10) 00066 00067 /* 00068 * Returned by ExeFormat loaders to tell the caller the format isn't supported, 00069 * as opposed to STATUS_INVALID_IMAGE_FORMAT meaning the format is supported, 00070 * but the particular file is malformed 00071 */ 00072 #define STATUS_ROS_EXEFMT_UNKNOWN_FORMAT ((NTSTATUS)0xA0100001) 00073 00074 /* 00075 * Returned by MmCreateSection to signal successful loading of an executable 00076 * image, saving the caller the effort of determining the executable's format 00077 * again. The full status to return is obtained by performing a bitwise OR of 00078 * STATUS_ROS_EXEFMT_LOADED_FORMAT and the appropriate EXEFMT_LOADED_XXX 00079 */ 00080 #define FACILITY_ROS_EXEFMT_FORMAT (0x11) 00081 #define STATUS_ROS_EXEFMT_LOADED_FORMAT ((NTSTATUS)0x60110000) 00082 00083 /* non-standard format, ZwQuerySection required to retrieve the format tag */ 00084 #define EXEFMT_LOADED_EXTENDED (0x0000FFFF) 00085 00086 /* Windows PE32/PE32+ */ 00087 #define EXEFMT_LOADED_PE32 (0x00000000) 00088 #define EXEFMT_LOADED_PE64 (0x00000001) 00089 00090 /* Wine ELF */ 00091 #define EXEFMT_LOADED_WINE32 (0x00000002) 00092 #define EXEFMT_LOADED_WINE64 (0x00000003) 00093 00094 /* regular ELF */ 00095 #define EXEFMT_LOADED_ELF32 (0x00000004) 00096 #define EXEFMT_LOADED_ELF64 (0x00000005) 00097 00098 /* TODO: Intsafe should be made into a library, as it's generally useful */ 00099 static __inline BOOLEAN Intsafe_CanAddULongPtr(IN ULONG_PTR Addend1, IN ULONG_PTR Addend2) 00100 { 00101 return Addend1 <= (MAXULONG_PTR - Addend2); 00102 } 00103 00104 static __inline BOOLEAN Intsafe_CanAddLong64(IN LONG64 Addend1, IN LONG64 Addend2) 00105 { 00106 return Addend1 <= (MAXLONGLONG - Addend2); 00107 } 00108 00109 static __inline BOOLEAN Intsafe_CanAddULong32(IN ULONG Addend1, IN ULONG Addend2) 00110 { 00111 return Addend1 <= (MAXULONG - Addend2); 00112 } 00113 00114 static __inline BOOLEAN Intsafe_AddULong32(OUT PULONG Result, IN ULONG Addend1, IN ULONG Addend2) 00115 { 00116 if(!Intsafe_CanAddULong32(Addend1, Addend2)) 00117 return FALSE; 00118 00119 *Result = Addend1 + Addend2; 00120 return TRUE; 00121 } 00122 00123 static __inline BOOLEAN Intsafe_CanMulULong32(IN ULONG Factor1, IN ULONG Factor2) 00124 { 00125 return Factor1 <= (MAXULONG / Factor2); 00126 } 00127 00128 static __inline BOOLEAN Intsafe_CanOffsetPointer(IN CONST VOID * Pointer, IN SIZE_T Offset) 00129 { 00130 /* FIXME: (PVOID)MAXULONG_PTR isn't necessarily a valid address */ 00131 return Intsafe_CanAddULongPtr((ULONG_PTR)Pointer, Offset); 00132 } 00133 00134 static __inline BOOLEAN IsPowerOf2(IN ULONG Number) 00135 { 00136 if(Number == 0) 00137 return FALSE; 00138 return (Number & (Number - 1)) == 0; 00139 } 00140 00141 static __inline ULONG ModPow2(IN ULONG Address, IN ULONG Alignment) 00142 { 00143 ASSERT(IsPowerOf2(Alignment)); 00144 return Address & (Alignment - 1); 00145 } 00146 00147 static __inline BOOLEAN IsAligned(IN ULONG Address, IN ULONG Alignment) 00148 { 00149 return ModPow2(Address, Alignment) == 0; 00150 } 00151 00152 static __inline BOOLEAN AlignUp(OUT PULONG AlignedAddress, IN ULONG Address, IN ULONG Alignment) 00153 { 00154 ULONG nExcess = ModPow2(Address, Alignment); 00155 00156 if(nExcess == 0) 00157 { 00158 *AlignedAddress = Address; 00159 return nExcess == 0; 00160 } 00161 else 00162 return Intsafe_AddULong32(AlignedAddress, Address, Alignment - nExcess); 00163 } 00164 00165 #define PEFMT_FIELDS_EQUAL(TYPE1_, TYPE2_, FIELD_) \ 00166 ( \ 00167 (FIELD_OFFSET(TYPE1_, FIELD_) == FIELD_OFFSET(TYPE2_, FIELD_)) && \ 00168 (RTL_FIELD_SIZE(TYPE1_, FIELD_) == RTL_FIELD_SIZE(TYPE2_, FIELD_)) \ 00169 ) 00170 #endif 00171 00172 /* EOF */ Generated on Mon May 28 2012 04:32:49 for ReactOS by
1.7.6.1
|