blob: 15bbe5154b866e263ecf6f05dd72775bb7e5fee4 [file] [log] [blame]
license.botf003cfe2008-08-24 09:55:55 +09001// 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.commit3f4a7322008-07-27 06:49:38 +09004#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
16namespace image_util {
17
18// ImageMetrics
19ImageMetrics::ImageMetrics(HANDLE process) : process_(process) {
20}
21
22ImageMetrics::~ImageMetrics() {
23}
24
25bool 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
37bool 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
48bool 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.botf003cfe2008-08-24 09:55:55 +090073