@@ -383,64 +383,69 @@ void PEImage::GetExports( vecExports& exports )
383
383
// / <param name="index">Directory index</param>
384
384
// / <param name="keepRelative">Keep address relative to image base</param>
385
385
// / <returns>Directory address</returns>
386
- size_t PEImage::DirectoryAddress ( int index, bool keepRelative /* = false */ ) const
386
+ uintptr_t PEImage::DirectoryAddress ( int index, AddressType type /* = VA */ ) const
387
387
{
388
388
// Sanity check
389
389
if (index < 0 || index >= IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
390
390
return 0 ;
391
391
392
- const IMAGE_DATA_DIRECTORY* idd = _is64 ? _pImageHdr64->OptionalHeader .DataDirectory
393
- : _pImageHdr32->OptionalHeader .DataDirectory ;
392
+ const auto idd = _is64 ? _pImageHdr64->OptionalHeader .DataDirectory : _pImageHdr32->OptionalHeader .DataDirectory ;
393
+ return idd[index].VirtualAddress == 0 ? 0 : ResolveRVAToVA ( idd[index].VirtualAddress , type );
394
+ }
394
395
395
- if (idd[index].VirtualAddress == 0 )
396
+ // / <summary>
397
+ // / Get data directory size
398
+ // / </summary>
399
+ // / <param name="index">Data directory index</param>
400
+ // / <returns>Data directory size</returns>
401
+ size_t PEImage::DirectorySize ( int index ) const
402
+ {
403
+ // Sanity check
404
+ if (index < 0 || index >= IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
396
405
return 0 ;
397
- else
398
- return ResolveRVAToVA ( idd[index].VirtualAddress , keepRelative );
406
+
407
+ const IMAGE_DATA_DIRECTORY* idd = _is64 ? _pImageHdr64->OptionalHeader .DataDirectory : _pImageHdr32->OptionalHeader .DataDirectory ;
408
+ return idd[index].VirtualAddress != 0 ? static_cast <size_t >(idd[index].Size ) : 0 ;
399
409
}
400
410
411
+
401
412
// / <summary>
402
413
// / Resolve virtual memory address to physical file offset
403
414
// / </summary>
404
415
// / <param name="Rva">Memory address</param>
405
416
// / <param name="keepRelative">Keep address relative to file start</param>
406
417
// / <returns>Resolved address</returns>
407
- uintptr_t PEImage::ResolveRVAToVA ( uintptr_t Rva, bool keepRelative /* = false */ ) const
418
+ uintptr_t PEImage::ResolveRVAToVA ( uintptr_t Rva, AddressType type /* = VA */ ) const
408
419
{
409
- if (_isPlainData )
420
+ switch (type )
410
421
{
411
- for (auto & sec : _sections)
422
+ case blackbone::pe::RVA:
423
+ return Rva;
424
+
425
+ case blackbone::pe::VA:
426
+ case blackbone::pe::RPA:
427
+ if (_isPlainData)
412
428
{
413
- if (Rva >= sec. VirtualAddress && Rva < sec. VirtualAddress + sec. Misc . VirtualSize )
429
+ for ( auto & sec : _sections )
414
430
{
415
- if (keepRelative)
416
- return (Rva - sec.VirtualAddress + sec.PointerToRawData );
417
- else
418
- return reinterpret_cast <uintptr_t >(_pFileBase) + (Rva - sec.VirtualAddress + sec.PointerToRawData );
431
+ if (Rva >= sec.VirtualAddress && Rva < sec.VirtualAddress + sec.Misc .VirtualSize )
432
+ if (type == VA)
433
+ return reinterpret_cast <uintptr_t >(_pFileBase) + Rva - sec.VirtualAddress + sec.PointerToRawData ;
434
+ else
435
+ return Rva - sec.VirtualAddress + sec.PointerToRawData ;
419
436
}
437
+
438
+ return 0 ;
420
439
}
440
+ else
441
+ return (type == VA) ? (reinterpret_cast <uintptr_t >(_pFileBase) + Rva) : Rva;
421
442
443
+ default :
422
444
return 0 ;
423
445
}
424
- else
425
- return (keepRelative ? Rva : (reinterpret_cast <uintptr_t >(_pFileBase) + Rva));
426
- }
427
446
428
- // / <summary>
429
- // / Get data directory size
430
- // / </summary>
431
- // / <param name="index">Data directory index</param>
432
- // / <returns>Data directory size</returns>
433
- size_t PEImage::DirectorySize ( int index ) const
434
- {
435
- // Sanity check
436
- if (index < 0 || index >= IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
437
- return 0 ;
438
-
439
- const IMAGE_DATA_DIRECTORY* idd = _is64 ? _pImageHdr64->OptionalHeader .DataDirectory : _pImageHdr32->OptionalHeader .DataDirectory ;
440
- return idd[index].VirtualAddress != 0 ? static_cast <size_t >(idd[index].Size ) : 0 ;
441
447
}
442
448
443
-
444
449
// / <summary>
445
450
// / Retrieve image TLS callbacks
446
451
// / Callbacks are rebased for target image
0 commit comments