Home | History | Annotate | Download | only in test
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/installer/test/resource_loader.h"
      6 
      7 #include <windows.h>
      8 
      9 #include "base/files/file_path.h"
     10 #include "base/logging.h"
     11 
     12 namespace {
     13 
     14 // Populates |resource_data| with the address and size of the resource in
     15 // |module| identified by |name_or_id| of type |type_name_or_id|, returning
     16 // true on success.
     17 bool DoLoad(HMODULE module, const wchar_t* name_or_id,
     18             const wchar_t* type_name_or_id,
     19             std::pair<const uint8*, DWORD>* resource_data) {
     20   bool loaded = false;
     21   HRSRC resource_info;
     22 
     23   resource_info = FindResource(module, name_or_id, type_name_or_id);
     24   if (resource_info != NULL) {
     25     HGLOBAL loaded_resource;
     26 
     27     loaded_resource = LoadResource(module, resource_info);
     28     if (loaded_resource != NULL) {
     29       resource_data->first =
     30           static_cast<const uint8*>(LockResource(loaded_resource));
     31       if (resource_data->first != NULL) {
     32         resource_data->second = SizeofResource(module, resource_info);
     33         DPCHECK(resource_data->second != 0);
     34         loaded = true;
     35       } else {
     36         DPCHECK(false) << "LockResource failed";
     37       }
     38     } else {
     39       DPCHECK(false) << "LoadResource failed";
     40     }
     41   } else {
     42     DPLOG(INFO) << "FindResource failed";
     43   }
     44 
     45   return loaded;
     46 }
     47 
     48 }  // namespace
     49 
     50 namespace upgrade_test {
     51 
     52 ResourceLoader::ResourceLoader() : module_(NULL) {
     53 }
     54 
     55 ResourceLoader::~ResourceLoader() {
     56   if (module_ != NULL) {
     57     BOOL result = FreeLibrary(module_);
     58     DPCHECK(result != 0) << "FreeLibrary failed";
     59   }
     60 }
     61 
     62 bool ResourceLoader::Initialize(const base::FilePath& pe_image_path) {
     63   DCHECK(module_ == NULL);
     64   module_ = LoadLibraryEx(pe_image_path.value().c_str(), NULL,
     65                           (LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE |
     66                            LOAD_LIBRARY_AS_IMAGE_RESOURCE));
     67   DPLOG_IF(INFO, module_ == NULL)
     68       << "Failed loading \"" << pe_image_path.value() << "\"";
     69   return module_ != NULL;
     70 }
     71 
     72 bool ResourceLoader::Load(const std::wstring& name,
     73                           const std::wstring& type,
     74                           std::pair<const uint8*, DWORD>* resource_data) {
     75   DCHECK(resource_data != NULL);
     76   DCHECK(module_ != NULL);
     77 
     78   return DoLoad(module_, name.c_str(), type.c_str(), resource_data);
     79 }
     80 
     81 bool ResourceLoader::Load(WORD id,
     82                           WORD type,
     83                           std::pair<const uint8*, DWORD>* resource_data) {
     84   DCHECK(resource_data != NULL);
     85   DCHECK(module_ != NULL);
     86 
     87   return DoLoad(module_, MAKEINTRESOURCE(id), MAKEINTRESOURCE(type),
     88                 resource_data);
     89 }
     90 
     91 }  // namespace upgrade_test
     92