1 // Copyright (c) 2010 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.
5 #include "chrome/installer/util/compat_checks.h"
7 #include "base/strings/string_number_conversions.h"
8 #include "base/strings/string_split.h"
9 #include "base/strings/string_util.h"
10 #include "base/win/registry.h"
14 // SEP stands for Symantec End Point Protection.
15 std::wstring
GetSEPVersion() {
16 const wchar_t kProductKey
[] =
17 L
"SOFTWARE\\Symantec\\Symantec Endpoint Protection\\SMC";
18 // Versions before 11MR3 were always 32-bit, so check in the 32-bit hive.
19 base::win::RegKey
key(
20 HKEY_LOCAL_MACHINE
, kProductKey
, KEY_READ
| KEY_WOW64_32KEY
);
21 std::wstring version_str
;
22 key
.ReadValue(L
"ProductVersion", &version_str
);
26 // The product version should be a string like "11.0.3001.2224". This function
27 // returns as params the first 3 values. Return value is false if anything
28 // does not fit the format.
29 bool ParseSEPVersion(const base::string16
& version
,
30 int* v0
, int* v1
, int* v2
) {
31 std::vector
<base::StringPiece16
> v
= base::SplitStringPiece(
32 version
, L
".", base::TRIM_WHITESPACE
, base::SPLIT_WANT_ALL
);
35 if (!base::StringToInt(v
[0], v0
))
37 if (!base::StringToInt(v
[1], v1
))
39 if (!base::StringToInt(v
[2], v2
))
44 // The incompatible versions are anything before 11MR3, which is 11.0.3001.
45 bool IsBadSEPVersion(int v0
, int v1
, int v2
) {
57 bool HasIncompatibleSymantecEndpointVersion(const wchar_t* version
) {
59 std::wstring
ver_str(version
? version
: GetSEPVersion());
60 if (!ParseSEPVersion(ver_str
, &v0
, &v1
, &v2
))
62 return IsBadSEPVersion(v0
, v1
, v2
);