Home | History | Annotate | Download | only in win
      1 // Copyright 2013 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.
      4 
      5 #include "chrome/browser/install_verification/win/module_list.h"
      6 
      7 #include <Psapi.h>
      8 
      9 #include <algorithm>
     10 
     11 #include "base/logging.h"
     12 #include "chrome/browser/install_verification/win/module_info.h"
     13 
     14 namespace {
     15 
     16 void CheckFreeLibrary(HMODULE module) {
     17   BOOL result = ::FreeLibrary(module);
     18   DCHECK(result);
     19 }
     20 
     21 }  // namespace
     22 
     23 ModuleList::~ModuleList() {
     24   std::for_each(modules_.begin(), modules_.end(), &CheckFreeLibrary);
     25 }
     26 
     27 scoped_ptr<ModuleList> ModuleList::FromLoadedModuleSnapshot(
     28     const std::vector<HMODULE>& snapshot) {
     29   scoped_ptr<ModuleList> instance(new ModuleList);
     30 
     31   for (size_t i = 0; i < snapshot.size(); ++i) {
     32     HMODULE module = NULL;
     33     // ::GetModuleHandleEx add-ref's the module if successful.
     34     if (::GetModuleHandleEx(
     35             GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
     36             reinterpret_cast<LPCWSTR>(snapshot[i]),
     37             &module)) {
     38         instance->modules_.push_back(module);
     39     }
     40   }
     41 
     42   return instance.Pass();
     43 }
     44 
     45 void ModuleList::GetModuleInfoSet(std::set<ModuleInfo>* module_info_set) {
     46   HANDLE current_process = ::GetCurrentProcess();
     47   for (size_t i = 0; i < modules_.size(); ++i) {
     48     wchar_t filename[MAX_PATH];
     49     // Simply ignore modules where GetModuleFileName or GetModuleInformation
     50     // failed, they might have been unloaded.
     51     if (::GetModuleFileName(modules_[i], filename, MAX_PATH) &&
     52         filename[0]) {
     53       MODULEINFO sys_module_info = {};
     54       if (::GetModuleInformation(
     55               current_process, modules_[i],
     56               &sys_module_info, sizeof(sys_module_info))) {
     57         module_info_set->insert(ModuleInfo(
     58             filename,
     59             reinterpret_cast<uintptr_t>(sys_module_info.lpBaseOfDll),
     60             sys_module_info.SizeOfImage));
     61       }
     62     }
     63   }
     64 }
     65 
     66 ModuleList::ModuleList() {}
     67