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