Home | History | Annotate | Download | only in mini_installer
      1 // Copyright (c) 2006-2009 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/mini_installer/pe_resource.h"
      6 
      7 PEResource::PEResource(HRSRC resource, HMODULE module)
      8     : resource_(resource), module_(module) {
      9 }
     10 
     11 PEResource::PEResource(const wchar_t* name, const wchar_t* type, HMODULE module)
     12     : resource_(NULL), module_(module) {
     13   resource_ = ::FindResource(module, name, type);
     14 }
     15 
     16 bool PEResource::IsValid() {
     17   return (NULL != resource_);
     18 }
     19 
     20 size_t PEResource::Size() {
     21   return ::SizeofResource(module_, resource_);
     22 }
     23 
     24 bool PEResource::WriteToDisk(const wchar_t* full_path) {
     25   // Resource handles are not real HGLOBALs so do not attempt to close them.
     26   // Windows frees them whenever there is memory pressure.
     27   HGLOBAL data_handle = ::LoadResource(module_, resource_);
     28   if (NULL == data_handle) {
     29     return false;
     30   }
     31   void* data = ::LockResource(data_handle);
     32   if (NULL == data) {
     33     return false;
     34   }
     35   size_t resource_size = Size();
     36   HANDLE out_file = ::CreateFile(full_path, GENERIC_WRITE, 0, NULL,
     37                                   CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
     38   if (INVALID_HANDLE_VALUE == out_file) {
     39     return false;
     40   }
     41   DWORD written = 0;
     42   if (!::WriteFile(out_file, data, static_cast<DWORD>(resource_size),
     43                    &written, NULL)) {
     44       ::CloseHandle(out_file);
     45       return false;
     46   }
     47   return ::CloseHandle(out_file) ? true : false;
     48 }
     49