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/util/compat_checks.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SEP stands for Symantec End Point Protection. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring GetSEPVersion() { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t kProductKey[] = 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"SOFTWARE\\Symantec\\Symantec Endpoint Protection\\SMC"; 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Versions before 11MR3 were always 32-bit, so check in the 32-bit hive. 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::win::RegKey key( 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HKEY_LOCAL_MACHINE, kProductKey, KEY_READ | KEY_WOW64_32KEY); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring version_str; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.ReadValue(L"ProductVersion", &version_str); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return version_str; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The product version should be a string like "11.0.3001.2224". This function 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returns as params the first 3 values. Return value is false if anything 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// does not fit the format. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParseSEPVersion(const std::wstring& version, int* v0, int* v1, int* v2) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::wstring> v; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(version, L'.', &v); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v.size() != 4) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::StringToInt(v[0], v0)) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::StringToInt(v[1], v1)) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::StringToInt(v[2], v2)) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The incompatible versions are anything before 11MR3, which is 11.0.3001. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsBadSEPVersion(int v0, int v1, int v2) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v0 < 11) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v1 > 0) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v2 < 3001) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasIncompatibleSymantecEndpointVersion(const wchar_t* version) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int v0, v1, v2; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring ver_str(version ? version : GetSEPVersion()); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ParseSEPVersion(ver_str, &v0, &v1, &v2)) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsBadSEPVersion(v0, v1, v2); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63