Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenimage.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
1.7.6.1
|