15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/test/resource_loader.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Populates |resource_data| with the address and size of the resource in
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |module| identified by |name_or_id| of type |type_name_or_id|, returning
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// true on success.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DoLoad(HMODULE module, const wchar_t* name_or_id,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const wchar_t* type_name_or_id,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            std::pair<const uint8*, DWORD>* resource_data) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool loaded = false;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRSRC resource_info;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resource_info = FindResource(module, name_or_id, type_name_or_id);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (resource_info != NULL) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HGLOBAL loaded_resource;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loaded_resource = LoadResource(module, resource_info);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (loaded_resource != NULL) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_data->first =
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<const uint8*>(LockResource(loaded_resource));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (resource_data->first != NULL) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resource_data->second = SizeofResource(module, resource_info);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DPCHECK(resource_data->second != 0);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loaded = true;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DPCHECK(false) << "LockResource failed";
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DPCHECK(false) << "LoadResource failed";
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DPLOG(INFO) << "FindResource failed";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return loaded;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace upgrade_test {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ResourceLoader::ResourceLoader() : module_(NULL) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ResourceLoader::~ResourceLoader() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (module_ != NULL) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOOL result = FreeLibrary(module_);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DPCHECK(result != 0) << "FreeLibrary failed";
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ResourceLoader::Initialize(const base::FilePath& pe_image_path) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(module_ == NULL);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  module_ = LoadLibraryEx(pe_image_path.value().c_str(), NULL,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          (LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE |
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           LOAD_LIBRARY_AS_IMAGE_RESOURCE));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DPLOG_IF(INFO, module_ == NULL)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Failed loading \"" << pe_image_path.value() << "\"";
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return module_ != NULL;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ResourceLoader::Load(const std::wstring& name,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::wstring& type,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          std::pair<const uint8*, DWORD>* resource_data) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(resource_data != NULL);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(module_ != NULL);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DoLoad(module_, name.c_str(), type.c_str(), resource_data);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ResourceLoader::Load(WORD id,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          WORD type,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          std::pair<const uint8*, DWORD>* resource_data) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(resource_data != NULL);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(module_ != NULL);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DoLoad(module_, MAKEINTRESOURCE(id), MAKEINTRESOURCE(type),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                resource_data);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace upgrade_test
92