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