text: // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include "cloud_print/virtual_driver/win/virtual_driver_helpers.h"
  
  #include <windows.h>
  #include <winspool.h>
  
  #include "base/files/file_util.h"
  #include "base/logging.h"
  #include "base/strings/string16.h"
  #include "base/win/windows_version.h"
  #include "cloud_print/common/win/cloud_print_utils.h"
  
  namespace cloud_print {
  
  void DisplayWindowsMessage(HWND hwnd,
                             HRESULT hr,
                             const base::string16& caption) {
    ::MessageBox(hwnd, GetErrorMessage(hr).c_str(), caption.c_str(), MB_OK);
  }
  
  base::string16 GetPortMonitorDllName() {
    if (IsSystem64Bit()) {
      return base::string16(L"gcp_portmon64.dll");
    } else {
      return base::string16(L"gcp_portmon.dll");
    }
  }
  
  HRESULT GetPrinterDriverDir(base::FilePath* path) {
    BYTE driver_dir_buffer[MAX_PATH * sizeof(wchar_t)];
    DWORD needed = 0;
    if (!GetPrinterDriverDirectory(NULL, NULL, 1, driver_dir_buffer,
                                   MAX_PATH * sizeof(wchar_t), &needed)) {
      // We could try to allocate a larger buffer if needed > MAX_PATH
      // but that really shouldn't happen.
      return cloud_print::GetLastHResult();
    }
    *path = base::FilePath(reinterpret_cast<wchar_t*>(driver_dir_buffer));
  
    // The XPS driver is a "Level 3" driver
    *path = path->Append(L"3");
    return S_OK;
  }
  
  bool IsSystem64Bit() {
    base::win::OSInfo::WindowsArchitecture arch =
        base::win::OSInfo::GetArchitecture();
    return (arch == base::win::OSInfo::X64_ARCHITECTURE) ||
           (arch == base::win::OSInfo::IA64_ARCHITECTURE);
  }
  }  // namespace cloud_print
  