| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This file implements PEImage, a generic class to manipulate PE files. | 5 // This file implements PEImage, a generic class to manipulate PE files. |
| 6 // This file was adapted from GreenBorder's Code. | 6 // This file was adapted from GreenBorder's Code. |
| 7 | 7 |
| 8 #include "base/win/pe_image.h" | 8 #include "base/win/pe_image.h" |
| 9 | 9 |
| 10 namespace base { | 10 namespace base { |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 bool PEImage::ImageAddrToOnDiskOffset(LPVOID address, | 561 bool PEImage::ImageAddrToOnDiskOffset(LPVOID address, |
| 562 DWORD *on_disk_offset) const { | 562 DWORD *on_disk_offset) const { |
| 563 if (NULL == address) | 563 if (NULL == address) |
| 564 return false; | 564 return false; |
| 565 | 565 |
| 566 // Get the section that this address belongs to. | 566 // Get the section that this address belongs to. |
| 567 PIMAGE_SECTION_HEADER section_header = GetImageSectionFromAddr(address); | 567 PIMAGE_SECTION_HEADER section_header = GetImageSectionFromAddr(address); |
| 568 if (NULL == section_header) | 568 if (NULL == section_header) |
| 569 return false; | 569 return false; |
| 570 | 570 |
| 571 #pragma warning(suppress : 4302) // pointer truncation | |
| 572 // These casts generate warnings because they are 32 bit specific. | |
| 573 // Don't follow the virtual RVAToAddr, use the one on the base. | 571 // Don't follow the virtual RVAToAddr, use the one on the base. |
| 574 DWORD offset_within_section = reinterpret_cast<DWORD>(address) - | 572 DWORD offset_within_section = |
| 575 reinterpret_cast<DWORD>(PEImage::RVAToAddr( | 573 static_cast<DWORD>(reinterpret_cast<uintptr_t>(address)) - |
| 576 section_header->VirtualAddress)); | 574 static_cast<DWORD>(reinterpret_cast<uintptr_t>( |
| 575 PEImage::RVAToAddr(section_header->VirtualAddress))); |
| 577 | 576 |
| 578 *on_disk_offset = section_header->PointerToRawData + offset_within_section; | 577 *on_disk_offset = section_header->PointerToRawData + offset_within_section; |
| 579 return true; | 578 return true; |
| 580 } | 579 } |
| 581 | 580 |
| 582 PVOID PEImage::RVAToAddr(DWORD rva) const { | 581 PVOID PEImage::RVAToAddr(DWORD rva) const { |
| 583 if (rva == 0) | 582 if (rva == 0) |
| 584 return NULL; | 583 return NULL; |
| 585 | 584 |
| 586 return reinterpret_cast<char*>(module_) + rva; | 585 return reinterpret_cast<char*>(module_) + rva; |
| 587 } | 586 } |
| 588 | 587 |
| 589 PVOID PEImageAsData::RVAToAddr(DWORD rva) const { | 588 PVOID PEImageAsData::RVAToAddr(DWORD rva) const { |
| 590 if (rva == 0) | 589 if (rva == 0) |
| 591 return NULL; | 590 return NULL; |
| 592 | 591 |
| 593 PVOID in_memory = PEImage::RVAToAddr(rva); | 592 PVOID in_memory = PEImage::RVAToAddr(rva); |
| 594 DWORD disk_offset; | 593 DWORD disk_offset; |
| 595 | 594 |
| 596 if (!ImageAddrToOnDiskOffset(in_memory, &disk_offset)) | 595 if (!ImageAddrToOnDiskOffset(in_memory, &disk_offset)) |
| 597 return NULL; | 596 return NULL; |
| 598 | 597 |
| 599 return PEImage::RVAToAddr(disk_offset); | 598 return PEImage::RVAToAddr(disk_offset); |
| 600 } | 599 } |
| 601 | 600 |
| 602 } // namespace win | 601 } // namespace win |
| 603 } // namespace base | 602 } // namespace base |
| OLD | NEW |