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 { |
11 namespace win { | 11 namespace win { |
12 | 12 |
13 // TODO(jschuh): crbug.com/167707 Make sure this code works on 64-bit. | |
14 | |
15 // Structure to perform imports enumerations. | 13 // Structure to perform imports enumerations. |
16 struct EnumAllImportsStorage { | 14 struct EnumAllImportsStorage { |
17 PEImage::EnumImportsFunction callback; | 15 PEImage::EnumImportsFunction callback; |
18 PVOID cookie; | 16 PVOID cookie; |
19 }; | 17 }; |
20 | 18 |
21 namespace { | 19 namespace { |
22 | 20 |
23 // PdbInfo Signature | 21 // PdbInfo Signature |
24 const DWORD kPdbInfoSignature = 'SDSR'; | 22 const DWORD kPdbInfoSignature = 'SDSR'; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
206 PBYTE function = reinterpret_cast<PBYTE>(RVAToAddr(*export_entry)); | 204 PBYTE function = reinterpret_cast<PBYTE>(RVAToAddr(*export_entry)); |
207 | 205 |
208 PBYTE exports = reinterpret_cast<PBYTE>( | 206 PBYTE exports = reinterpret_cast<PBYTE>( |
209 GetImageDirectoryEntryAddr(IMAGE_DIRECTORY_ENTRY_EXPORT)); | 207 GetImageDirectoryEntryAddr(IMAGE_DIRECTORY_ENTRY_EXPORT)); |
210 DWORD size = GetImageDirectoryEntrySize(IMAGE_DIRECTORY_ENTRY_EXPORT); | 208 DWORD size = GetImageDirectoryEntrySize(IMAGE_DIRECTORY_ENTRY_EXPORT); |
211 | 209 |
212 // Check for forwarded exports as a special case. | 210 // Check for forwarded exports as a special case. |
213 if (exports <= function && exports + size > function) | 211 if (exports <= function && exports + size > function) |
214 #pragma warning(push) | 212 #pragma warning(push) |
215 #pragma warning(disable: 4312) | 213 #pragma warning(disable: 4312) |
216 // This cast generates a warning because it is 32 bit specific. | 214 // Cast from 32-bit value to 64-bit pointer generates C4312 on 64-bit. |
Nico
2015/12/23 20:57:01
It'd be nice if the comment also said why the warn
Will Harris
2015/12/24 05:35:51
I changed this function to return -1 on both 64-bi
| |
217 return reinterpret_cast<FARPROC>(0xFFFFFFFF); | 215 return reinterpret_cast<FARPROC>(0xFFFFFFFF); |
218 #pragma warning(pop) | 216 #pragma warning(pop) |
219 | 217 |
220 return reinterpret_cast<FARPROC>(function); | 218 return reinterpret_cast<FARPROC>(function); |
221 } | 219 } |
222 | 220 |
223 bool PEImage::GetProcOrdinal(LPCSTR function_name, WORD *ordinal) const { | 221 bool PEImage::GetProcOrdinal(LPCSTR function_name, WORD *ordinal) const { |
224 if (NULL == ordinal) | 222 if (NULL == ordinal) |
225 return false; | 223 return false; |
226 | 224 |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
449 if (rvas) { | 447 if (rvas) { |
450 module_name = | 448 module_name = |
451 reinterpret_cast<LPCSTR>(RVAToAddr(delay_descriptor->rvaDLLName)); | 449 reinterpret_cast<LPCSTR>(RVAToAddr(delay_descriptor->rvaDLLName)); |
452 name_table = reinterpret_cast<PIMAGE_THUNK_DATA>( | 450 name_table = reinterpret_cast<PIMAGE_THUNK_DATA>( |
453 RVAToAddr(delay_descriptor->rvaINT)); | 451 RVAToAddr(delay_descriptor->rvaINT)); |
454 iat = reinterpret_cast<PIMAGE_THUNK_DATA>( | 452 iat = reinterpret_cast<PIMAGE_THUNK_DATA>( |
455 RVAToAddr(delay_descriptor->rvaIAT)); | 453 RVAToAddr(delay_descriptor->rvaIAT)); |
456 } else { | 454 } else { |
457 #pragma warning(push) | 455 #pragma warning(push) |
458 #pragma warning(disable: 4312) | 456 #pragma warning(disable: 4312) |
459 // These casts generate warnings because they are 32 bit specific. | 457 // Casts from 32-bit values to 64-bit pointers generates C4312 on 64-bit. |
Nico
2015/12/23 20:57:01
ditto
Will Harris
2015/12/24 05:35:51
Done. Actually just changed the cast instead of su
| |
460 module_name = reinterpret_cast<LPCSTR>(delay_descriptor->rvaDLLName); | 458 module_name = reinterpret_cast<LPCSTR>(delay_descriptor->rvaDLLName); |
461 name_table = | 459 name_table = |
462 reinterpret_cast<PIMAGE_THUNK_DATA>(delay_descriptor->rvaINT); | 460 reinterpret_cast<PIMAGE_THUNK_DATA>(delay_descriptor->rvaINT); |
463 iat = reinterpret_cast<PIMAGE_THUNK_DATA>(delay_descriptor->rvaIAT); | 461 iat = reinterpret_cast<PIMAGE_THUNK_DATA>(delay_descriptor->rvaIAT); |
464 #pragma warning(pop) | 462 #pragma warning(pop) |
465 } | 463 } |
466 | 464 |
467 if (!callback(*this, delay_descriptor, module_name, name_table, iat, | 465 if (!callback(*this, delay_descriptor, module_name, name_table, iat, |
468 cookie)) | 466 cookie)) |
469 return false; | 467 return false; |
(...skipping 16 matching lines...) Expand all Loading... | |
486 if (IMAGE_SNAP_BY_ORDINAL(name_table->u1.Ordinal)) { | 484 if (IMAGE_SNAP_BY_ORDINAL(name_table->u1.Ordinal)) { |
487 ordinal = static_cast<WORD>(IMAGE_ORDINAL32(name_table->u1.Ordinal)); | 485 ordinal = static_cast<WORD>(IMAGE_ORDINAL32(name_table->u1.Ordinal)); |
488 } else { | 486 } else { |
489 PIMAGE_IMPORT_BY_NAME import; | 487 PIMAGE_IMPORT_BY_NAME import; |
490 bool rvas = (delay_descriptor->grAttrs & dlattrRva) != 0; | 488 bool rvas = (delay_descriptor->grAttrs & dlattrRva) != 0; |
491 | 489 |
492 if (rvas) { | 490 if (rvas) { |
493 import = reinterpret_cast<PIMAGE_IMPORT_BY_NAME>( | 491 import = reinterpret_cast<PIMAGE_IMPORT_BY_NAME>( |
494 RVAToAddr(name_table->u1.ForwarderString)); | 492 RVAToAddr(name_table->u1.ForwarderString)); |
495 } else { | 493 } else { |
496 #pragma warning(push) | |
497 #pragma warning(disable: 4312) | |
498 // This cast generates a warning because it is 32 bit specific. | |
499 import = reinterpret_cast<PIMAGE_IMPORT_BY_NAME>( | 494 import = reinterpret_cast<PIMAGE_IMPORT_BY_NAME>( |
500 name_table->u1.ForwarderString); | 495 name_table->u1.ForwarderString); |
501 #pragma warning(pop) | |
502 } | 496 } |
503 | 497 |
504 hint = import->Hint; | 498 hint = import->Hint; |
505 name = reinterpret_cast<LPCSTR>(&import->Name); | 499 name = reinterpret_cast<LPCSTR>(&import->Name); |
506 } | 500 } |
507 | 501 |
508 if (!callback(*this, module_name, ordinal, name, hint, iat, cookie)) | 502 if (!callback(*this, module_name, ordinal, name, hint, iat, cookie)) |
509 return false; | 503 return false; |
510 } | 504 } |
511 | 505 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
579 DWORD disk_offset; | 573 DWORD disk_offset; |
580 | 574 |
581 if (!ImageAddrToOnDiskOffset(in_memory, &disk_offset)) | 575 if (!ImageAddrToOnDiskOffset(in_memory, &disk_offset)) |
582 return NULL; | 576 return NULL; |
583 | 577 |
584 return PEImage::RVAToAddr(disk_offset); | 578 return PEImage::RVAToAddr(disk_offset); |
585 } | 579 } |
586 | 580 |
587 } // namespace win | 581 } // namespace win |
588 } // namespace base | 582 } // namespace base |
OLD | NEW |