license.bot | f003cfe | 2008-08-24 09:55:55 +0900 | [diff] [blame^] | 1 | // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 4 | #include <windows.h> |
| 5 | #include <ImageHlp.h> |
| 6 | #include <psapi.h> |
| 7 | |
| 8 | #include "base/image_util.h" |
| 9 | #include "base/process_util.h" |
| 10 | |
| 11 | // imagehlp.dll appears to ship in all win versions after Win95. |
| 12 | // nsylvain verified it is present in win2k. |
| 13 | // Using #pragma comment for dependency, instead of LoadLibrary/GetProcAddress. |
| 14 | #pragma comment(lib, "imagehlp.lib") |
| 15 | |
| 16 | namespace image_util { |
| 17 | |
| 18 | // ImageMetrics |
| 19 | ImageMetrics::ImageMetrics(HANDLE process) : process_(process) { |
| 20 | } |
| 21 | |
| 22 | ImageMetrics::~ImageMetrics() { |
| 23 | } |
| 24 | |
| 25 | bool ImageMetrics::GetDllImageSectionData(const std::string& loaded_dll_name, |
| 26 | ImageSectionsData* section_sizes) { |
| 27 | // Get a handle to the loaded DLL |
| 28 | HMODULE the_dll = GetModuleHandleA(loaded_dll_name.c_str()); |
| 29 | char full_filename[MAX_PATH]; |
| 30 | // Get image path |
| 31 | if (GetModuleFileNameExA(process_, the_dll, full_filename, MAX_PATH)) { |
| 32 | return GetImageSectionSizes(full_filename, section_sizes); |
| 33 | } |
| 34 | return false; |
| 35 | } |
| 36 | |
| 37 | bool ImageMetrics::GetProcessImageSectionData(ImageSectionsData* |
| 38 | section_sizes) { |
| 39 | char exe_path[MAX_PATH]; |
| 40 | // Get image path |
| 41 | if (GetModuleFileNameExA(process_, NULL, exe_path, MAX_PATH)) { |
| 42 | return GetImageSectionSizes(exe_path, section_sizes); |
| 43 | } |
| 44 | return false; |
| 45 | } |
| 46 | |
| 47 | // private |
| 48 | bool ImageMetrics::GetImageSectionSizes(char* qualified_path, |
| 49 | ImageSectionsData* result) { |
| 50 | LOADED_IMAGE li; |
| 51 | // TODO (timsteele): There is no unicode version for MapAndLoad, hence |
| 52 | // why ansi functions are used in this class. Should we try and rewrite |
| 53 | // this call ourselves to be safe? |
| 54 | if (MapAndLoad(qualified_path, 0, &li, FALSE, TRUE)) { |
| 55 | IMAGE_SECTION_HEADER* section_header = li.Sections; |
| 56 | for (unsigned i = 0; i < li.NumberOfSections; i++, section_header++) { |
| 57 | std::string name(reinterpret_cast<char*>(section_header->Name)); |
| 58 | ImageSectionData data(name, section_header->Misc.VirtualSize ? |
| 59 | section_header->Misc.VirtualSize : |
| 60 | section_header->SizeOfRawData); |
| 61 | // copy into result |
| 62 | result->push_back(data); |
| 63 | } |
| 64 | } else { |
| 65 | // map and load failed |
| 66 | return false; |
| 67 | } |
| 68 | UnMapAndLoad(&li); |
| 69 | return true; |
| 70 | } |
| 71 | |
| 72 | } // namespace image_util |
license.bot | f003cfe | 2008-08-24 09:55:55 +0900 | [diff] [blame^] | 73 | |