15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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 "cloud_print/virtual_driver/win/virtual_driver_helpers.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <winspool.h>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cloud_print/common/win/cloud_print_utils.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cloud_print {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kMaxMessageLen = 100;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void DisplayWindowsMessage(HWND hwnd, HRESULT hr,
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           const base::string16 &caption) {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ::MessageBox(hwnd, GetErrorMessage(hr).c_str(), caption.c_str(), MB_OK);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 GetPortMonitorDllName() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsSystem64Bit()) {
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16(L"gcp_portmon64.dll");
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16(L"gcp_portmon.dll");
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)HRESULT GetPrinterDriverDir(base::FilePath* path) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BYTE driver_dir_buffer[MAX_PATH * sizeof(wchar_t)];
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD needed = 0;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetPrinterDriverDirectory(NULL,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 NULL,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 1,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 driver_dir_buffer,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 MAX_PATH * sizeof(wchar_t),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 &needed)) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We could try to allocate a larger buffer if needed > MAX_PATH
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // but that really shouldn't happen.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return cloud_print::GetLastHResult();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *path = base::FilePath(reinterpret_cast<wchar_t*>(driver_dir_buffer));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The XPS driver is a "Level 3" driver
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *path = path->Append(L"3");
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return S_OK;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsSystem64Bit() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::OSInfo::WindowsArchitecture arch =
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::win::OSInfo::GetInstance()->architecture();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (arch == base::win::OSInfo::X64_ARCHITECTURE) ||
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (arch == base::win::OSInfo::IA64_ARCHITECTURE);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62