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

image.c
Go to the documentation of this file.
00001 /*
00002  * ReactOS log2lines
00003  * Written by Jan Roeloffzen
00004  *
00005  * - Image functions for symbol info
00006  */
00007 
00008 #include <errno.h>
00009 #include <string.h>
00010 #include <rsym.h>
00011 
00012 #include "compat.h"
00013 #include "util.h"
00014 #include "options.h"
00015 #include "log2lines.h"
00016 
00017 static PIMAGE_SECTION_HEADER
00018 find_rossym_section(PIMAGE_FILE_HEADER PEFileHeader, PIMAGE_SECTION_HEADER PESectionHeaders)
00019 {
00020     size_t i;
00021     for (i = 0; i < PEFileHeader->NumberOfSections; i++)
00022     {
00023         if (0 == strcmp((char *)PESectionHeaders[i].Name, ".rossym"))
00024             return &PESectionHeaders[i];
00025     }
00026     return NULL;
00027 }
00028 
00029 size_t
00030 fixup_offset(size_t ImageBase, size_t offset)
00031 {
00032     if (offset > ABS_TRESHOLD)
00033         offset -= ImageBase;
00034     return offset;
00035 }
00036 
00037 PROSSYM_ENTRY
00038 find_offset(void *data, size_t offset)
00039 {
00040     PSYMBOLFILE_HEADER RosSymHeader = (PSYMBOLFILE_HEADER)data;
00041     PROSSYM_ENTRY Entries = (PROSSYM_ENTRY)((char *)data + RosSymHeader->SymbolsOffset);
00042     size_t symbols = RosSymHeader->SymbolsLength / sizeof(ROSSYM_ENTRY);
00043     size_t i;
00044 
00045     for (i = 0; i < symbols; i++)
00046     {
00047         if (Entries[i].Address > offset)
00048         {
00049             if (!i--)
00050                 return NULL;
00051             else
00052                 return &Entries[i];
00053         }
00054     }
00055     return NULL;
00056 }
00057 
00058 PIMAGE_SECTION_HEADER
00059 get_sectionheader(const void *FileData)
00060 {
00061     PIMAGE_DOS_HEADER PEDosHeader;
00062     PIMAGE_FILE_HEADER PEFileHeader;
00063     PIMAGE_OPTIONAL_HEADER PEOptHeader;
00064     PIMAGE_SECTION_HEADER PESectionHeaders;
00065     PIMAGE_SECTION_HEADER PERosSymSectionHeader;
00066     size_t ImageBase;
00067 
00068     /* Check if MZ header exists */
00069     PEDosHeader = (PIMAGE_DOS_HEADER)FileData;
00070     if (PEDosHeader->e_magic != IMAGE_DOS_MAGIC || PEDosHeader->e_lfanew == 0L)
00071     {
00072         l2l_dbg(0, "Input file is not a PE image.\n");
00073         summ.offset_errors++;
00074         return NULL;
00075     }
00076 
00077     /* Locate PE file header */
00078     /* sizeof(ULONG) = sizeof(MAGIC) */
00079     PEFileHeader = (PIMAGE_FILE_HEADER)((char *)FileData + PEDosHeader->e_lfanew + sizeof(ULONG));
00080 
00081     /* Locate optional header */
00082     PEOptHeader = (PIMAGE_OPTIONAL_HEADER)(PEFileHeader + 1);
00083     ImageBase = PEOptHeader->ImageBase;
00084 
00085     /* Locate PE section headers */
00086     PESectionHeaders = (PIMAGE_SECTION_HEADER)((char *)PEOptHeader + PEFileHeader->SizeOfOptionalHeader);
00087 
00088     /* find rossym section */
00089     PERosSymSectionHeader = find_rossym_section(PEFileHeader, PESectionHeaders);
00090     if (!PERosSymSectionHeader)
00091     {
00092         l2l_dbg(0, "Couldn't find rossym section in executable\n");
00093         summ.offset_errors++;
00094         return NULL;
00095     }
00096 
00097     return PERosSymSectionHeader;
00098 }
00099 
00100 int
00101 get_ImageBase(char *fname, size_t *ImageBase)
00102 {
00103     IMAGE_DOS_HEADER PEDosHeader;
00104     IMAGE_FILE_HEADER PEFileHeader;
00105     IMAGE_OPTIONAL_HEADER PEOptHeader;
00106 
00107     FILE *fr;
00108     off_t readLen;
00109     int res;
00110 
00111     *ImageBase = INVALID_BASE;
00112     fr = fopen(fname, "rb");
00113     if (!fr)
00114     {
00115         l2l_dbg(3, "get_ImageBase, cannot open '%s' (%s)\n", fname, strerror(errno));
00116         return 1;
00117     }
00118 
00119     readLen = fread(&PEDosHeader, sizeof(IMAGE_DOS_HEADER), 1, fr);
00120     if (1 != readLen)
00121     {
00122         l2l_dbg(1, "get_ImageBase %s, read error IMAGE_DOS_HEADER (%s)\n", fname, strerror(errno));
00123         fclose(fr);
00124         return 2;
00125     }
00126 
00127     /* Check if MZ header exists */
00128     if (PEDosHeader.e_magic != IMAGE_DOS_MAGIC || PEDosHeader.e_lfanew == 0L)
00129     {
00130         l2l_dbg(2, "get_ImageBase %s, MZ header missing\n", fname);
00131         fclose(fr);
00132         return 3;
00133     }
00134 
00135     /* Locate PE file header */
00136     res = fseek(fr, PEDosHeader.e_lfanew + sizeof(ULONG), SEEK_SET);
00137     readLen = fread(&PEFileHeader, sizeof(IMAGE_FILE_HEADER), 1, fr);
00138     if (1 != readLen)
00139     {
00140         l2l_dbg(1, "get_ImageBase %s, read error IMAGE_FILE_HEADER (%s)\n", fname, strerror(errno));
00141         fclose(fr);
00142         return 4;
00143     }
00144 
00145     /* Locate optional header */
00146     readLen = fread(&PEOptHeader, sizeof(IMAGE_OPTIONAL_HEADER), 1, fr);
00147     if (1 != readLen)
00148     {
00149         l2l_dbg(1, "get_ImageBase %s, read error IMAGE_OPTIONAL_HEADER (%s)\n", fname, strerror(errno));
00150         fclose(fr);
00151         return 5;
00152     }
00153 
00154     /* Check if it's really an IMAGE_OPTIONAL_HEADER we are interested in */
00155     if (PEOptHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC &&
00156         PEOptHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC)
00157     {
00158         l2l_dbg(2, "get_ImageBase %s, not an IMAGE_NT_OPTIONAL_HDR 32/64 bit\n", fname);
00159         fclose(fr);
00160         return 6;
00161     }
00162 
00163     *ImageBase = PEOptHeader.ImageBase;
00164     fclose(fr);
00165     return 0;
00166 }
00167 
00168 /* EOF */

Generated on Sat May 26 2012 04:19:07 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.