ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

exeformat.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.