Changeset 4358 for trunk/tools/common/kFilePE.cpp
- Timestamp:
- Oct 2, 2000, 6:01:40 AM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/common/kFilePE.cpp
r824 r4358 34 34 #include <assert.h> 35 35 #include <peexe.h> 36 #include "kFile.h" 36 37 #include "kFileFormatBase.h" 37 38 #include "kFilePe.h" … … 45 46 kFilePE::kFilePE(FILE *phFile) throw(int) : pvBase(NULL), 46 47 pDosHdr(NULL), pFileHdr(NULL), pOptHdr(NULL), paDataDir(NULL), paSectionHdr(NULL), 47 pExportDir(NULL) 48 pExportDir(NULL), 49 pImportDir(NULL), 50 pRsrcDir(NULL), 51 pBRelocDir(NULL), 52 pDebugDir(NULL), 53 pCopyright(NULL), 54 pulGlobalPtr(NULL), 55 pTLSDir(NULL), 56 pLoadConfigDir(NULL), 57 pBoundImportDir(NULL), 58 pIATDir(NULL), 59 pDelayImportDir(NULL) 48 60 { 49 61 IMAGE_DOS_HEADER doshdr; … … 93 105 94 106 cbSection = min(pSectionHdr->Misc.VirtualSize, pSectionHdr->SizeOfRawData); 95 if (fseek(phFile, pSectionHdr->PointerToRawData, SEEK_SET) 96 || 97 fread((void*)((ULONG)pvBase + pSectionHdr->VirtualAddress), (size_t)cbSection, 1, phFile) != 1 107 if (cbSection 108 && 109 (fseek(phFile, pSectionHdr->PointerToRawData, SEEK_SET) 110 || 111 fread((void*)((ULONG)pvBase + pSectionHdr->VirtualAddress), (size_t)cbSection, 1, phFile) != 1 112 ) 98 113 ) 99 114 { … … 120 135 pOptHdr->NumberOfRvaAndSizes*sizeof(*paDataDir)); 121 136 122 if (paDataDir[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress) 123 pExportDir = (PIMAGE_EXPORT_DIRECTORY)((int)pvBase + paDataDir[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); 137 //if (paDataDir[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress) 138 // pExportDir = (PIMAGE_EXPORT_DIRECTORY)((int)pvBase + paDataDir[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); 139 for (i = 0; i < pOptHdr->NumberOfRvaAndSizes && i < 16; i++) 140 { 141 if (paDataDir[i].VirtualAddress != 0) 142 { 143 if (paDataDir[i].VirtualAddress < pOptHdr->SizeOfImage) 144 ((PULONG)&this->pExportDir)[i] = (int)pvBase + paDataDir[i].VirtualAddress; 145 #ifdef DEBUG 146 else 147 fprintf(stderr, "bad directory pointer %d\n", i); 148 #endif 149 } 150 } 124 151 } 125 152 else … … 227 254 228 255 256 /** 257 * Mini dump function. 258 */ 259 BOOL kFilePE::dump(kFile *pOut) 260 { 261 int i,j,k; 262 int c; 263 264 /* 265 * Dump sections. 266 */ 267 pOut->printf("Sections\n" 268 "--------\n"); 269 for (i = 0; i < pFileHdr->NumberOfSections; i++) 270 { 271 pOut->printf("%2d %-8.8s VirtSize: 0x%08x RVA: 0x%08x\n" 272 " RawSize: 0x%08x FileOffset: 0x%08x\n" 273 " #Relocs: 0x%08x FileOffset: 0x%08x\n" 274 " #LineNbr: 0x%08x FileOffset: 0x%08x\n" 275 " Characteristics: 0x%08x\n", 276 i, 277 paSectionHdr[i].Name, 278 paSectionHdr[i].Misc.VirtualSize, 279 paSectionHdr[i].VirtualAddress, 280 paSectionHdr[i].PointerToRawData, 281 paSectionHdr[i].PointerToRawData, 282 paSectionHdr[i].NumberOfRelocations, 283 paSectionHdr[i].PointerToRelocations, 284 paSectionHdr[i].NumberOfLinenumbers, 285 paSectionHdr[i].PointerToLinenumbers, 286 paSectionHdr[i].Characteristics 287 ); 288 289 } 290 291 292 /* 293 * Dump the directories. 294 */ 295 pOut->printf("Data Directory\n" 296 "--------------\n"); 297 for (i = 0; i < pOptHdr->NumberOfRvaAndSizes; i++) 298 { 299 static const char * apszDirectoryNames[] = 300 { 301 "Export", 302 "Import", 303 "Resource", 304 "Exception", 305 "Security", 306 "Base Reloc", 307 "Debug", 308 "Copyright", 309 "Global Ptr", 310 "TLS", 311 "Load Config", 312 "Bound Import", 313 "IAT", 314 "Delay Import", 315 "COM Descriptor", 316 "unknown", 317 "unknown" 318 }; 319 320 pOut->printf("%2d %-16s Size: 0x%08x RVA: 0x%08x\n", 321 i, 322 apszDirectoryNames[i], 323 pOptHdr->DataDirectory[i].Size, 324 pOptHdr->DataDirectory[i].VirtualAddress); 325 } 326 pOut->printf("\n"); 327 328 329 /* 330 * Dump TLS directory if present 331 */ 332 if (pTLSDir) 333 { 334 pOut->printf("TLS Directory\n" 335 "-------------\n"); 336 if (pOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].Size % sizeof(IMAGE_TLS_DIRECTORY)) 337 pOut->printf(" Warning! The size directory isn't a multiple of the directory struct!"); 338 339 c = (int)(pOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].Size / sizeof(IMAGE_TLS_DIRECTORY)); 340 for (i = 0; i < c; i++) 341 { 342 343 pOut->printf("%2d StartAddressOfRawData %p\n" 344 " EndAddressOfRawData %p\n" 345 " AddressOfIndex %p\n" 346 " AddressOfCallBacks %p\n" 347 " SizeOfZeroFill %p\n" 348 " Characteristics %p\n", 349 i, 350 pTLSDir[i].StartAddressOfRawData, 351 pTLSDir[i].EndAddressOfRawData, 352 pTLSDir[i].AddressOfIndex, 353 pTLSDir[i].AddressOfCallBacks, 354 pTLSDir[i].SizeOfZeroFill, 355 pTLSDir[i].Characteristics); 356 357 /* Print Callbacks */ 358 if (pTLSDir[i].AddressOfCallBacks) 359 { 360 PULONG paulIndex; 361 PULONG paulCallback; 362 ULONG ulBorlandRVAFix = 0UL; 363 364 /* Check if the addresses in the TLSDir is RVAs or real addresses */ 365 if (pTLSDir[i].StartAddressOfRawData > pOptHdr->ImageBase) 366 ulBorlandRVAFix = pOptHdr->ImageBase; 367 368 j = 0; 369 paulIndex = (PULONG)((ULONG)pTLSDir[i].AddressOfIndex - ulBorlandRVAFix + (ULONG)this->pvBase); 370 paulCallback = (PULONG)((ULONG)pTLSDir[i].AddressOfCallBacks - ulBorlandRVAFix + (ULONG)this->pvBase); 371 if (*paulCallback) 372 { 373 pOut->printf(" Callbacks:\n"); 374 for (j = 0; paulCallback[j] != 0; j++) 375 { 376 pOut->printf(" %02d Address: 0x%08x Index: 0x%08x\n", 377 paulIndex[j], 378 paulCallback[j]); 379 } 380 } 381 else 382 pOut->printf(" (Empty callback array!)\n"); 383 } 384 385 } 386 387 pOut->printf("\n"); 388 } 389 390 391 return TRUE; 392 } 393
Note:
See TracChangeset
for help on using the changeset viewer.