13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file. 4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#ifndef CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_ 6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_ 7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#pragma once 8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <utility> 10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <vector> 11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 12201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/gtest_prod_util.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h" 15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/string16.h" 16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/timer.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "googleurl/src/gurl.h" 19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass EnumerateModulesModel; 21513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass FilePath; 22513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ListValue; 23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// A helper class that implements the enumerate module functionality on the File 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// thread. 26513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ModuleEnumerator : public base::RefCountedThreadSafe<ModuleEnumerator> { 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // What type of module we are dealing with. Loaded modules are modules we 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // detect as loaded in the process at the time of scanning. The others are 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // modules of interest and may or may not be loaded in the process at the 31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // time of scan. 32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch enum ModuleType { 33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LOADED_MODULE = 1 << 0, 34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch SHELL_EXTENSION = 1 << 1, 35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WINSOCK_MODULE_REGISTRATION = 1 << 2, 36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch }; 37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The blacklist status of the module. Suspected Bad modules have been 39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // partially matched (ie. name matches and location, but not description) 40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // whereas Confirmed Bad modules have been identified further (ie. 41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // AuthentiCode signer matches). 42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch enum ModuleStatus { 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // This is returned by the matching function when comparing against the 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // blacklist and the module does not match the current entry in the 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // blacklist. 46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NOT_MATCHED, 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The module is not on the blacklist. Assume it is good. 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GOOD, 49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Module is a suspected bad module. 50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch SUSPECTED_BAD, 51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Module is a bad bad dog. 52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CONFIRMED_BAD, 53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch }; 54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A bitmask with the possible resolutions for bad modules. 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch enum RecommendedAction { 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NONE = 0, 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch INVESTIGATING = 1 << 0, 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch UNINSTALL = 1 << 1, 60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DISABLE = 1 << 2, 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch UPDATE = 1 << 3, 62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch SEE_LINK = 1 << 4, 63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch }; 64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The structure we populate when enumerating modules. 66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch struct Module { 67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The type of module found 68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ModuleType type; 69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The module status (benign/bad/etc). 70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ModuleStatus status; 71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The module path, not including filename. 72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 location; 73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The name of the module (filename). 74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 name; 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The name of the product the module belongs to. 76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 product_name; 77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The module file description. 78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 description; 79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The module version. 80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 version; 81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The signer of the digital certificate for the module. 82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 digital_signer; 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The help tips bitmask. 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RecommendedAction recommended_action; 85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The duplicate count within each category of modules. 86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch int duplicate_count; 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Whether this module has been normalized (necessary before checking it 88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // against blacklist). 89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool normalized; 90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch }; 91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A vector typedef of all modules enumerated. 93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef std::vector<Module> ModulesVector; 94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A structure we populate with the blacklist entries. 96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch struct BlacklistEntry { 97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* filename; 98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* location; 99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* desc_or_signer; 100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const char* version_from; // Version where conflict started. 101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const char* version_to; // First version that works. 102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RecommendedAction help_tip; 103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch }; 104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A static function that normalizes the module information in the |module| 106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // struct. Module information needs to be normalized before comparing against 107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the blacklist. This is because the same module can be described in many 108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // different ways, ie. file paths can be presented in long/short name form, 109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // and are not case sensitive on Windows. Also, the version string returned 110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // can include appended text, which we don't want to use during comparison 111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // against the blacklist. 112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void NormalizeModule(Module* module); 113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A static function that checks whether |module| has been |blacklisted|. 115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static ModuleStatus Match(const Module& module, 116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const BlacklistEntry& blacklisted); 117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch explicit ModuleEnumerator(EnumerateModulesModel* observer); 1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ~ModuleEnumerator(); 120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Start scanning the loaded module list (if a scan is not already in 1223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // progress). This function does not block while reading the module list 1233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // (unless we are in limited_mode, see below), and will notify when done 1243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // through the MODULE_LIST_ENUMERATED notification. 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The process will also send MODULE_INCOMPATIBILITY_BADGE_CHANGE to let 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // observers know when it is time to update the wrench menu badge. 1273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // When in |limited_mode|, this function will not leverage the File thread 1283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // to run asynchronously and will therefore block until scanning is done 1293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // (and will also not send out any notifications). 1303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen void ScanNow(ModulesVector* list, bool limited_mode); 131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch FRIEND_TEST_ALL_PREFIXES(EnumerateModulesTest, CollapsePath); 134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The (currently) hard coded blacklist of known bad modules. 136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static const BlacklistEntry kModuleBlacklist[]; 137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1383f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // This function does the actual file scanning work on the FILE thread (or 1393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // block the main thread when in limited_mode). It enumerates all loaded 1403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // modules in the process and other modules of interest, such as the 1413f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // registered Winsock LSP modules and stores them in |enumerated_modules_|. 1423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // It then normalizes the module info and matches them against a blacklist 1433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // of known bad modules. Finally, it calls ReportBack to let the observer 1443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // know we are done. 1453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen void ScanImpl(); 146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Enumerate all modules loaded into the Chrome process. 148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void EnumerateLoadedModules(); 149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Enumerate all registered Windows shell extensions. 151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void EnumerateShellExtensions(); 152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Enumerate all registered Winsock LSP modules. 154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void EnumerateWinsockModules(); 155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Reads the registered shell extensions found under |parent| key in the 157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // registry. 158201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void ReadShellExtensions(HKEY parent); 159201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 160201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Given a |module|, initializes the structure and loads additional 161201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // information using the location field of the module. 162201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void PopulateModuleInformation(Module* module); 163201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 164201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Checks the module list to see if a |module| of the same type, location 165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // and name has been added before and if so, increments its duplication 166201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // counter. If it doesn't appear in the list, it is added. 167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void AddToListWithoutDuplicating(const Module&); 168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Builds up a vector of path values mapping to environment variable, 170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // with pairs like [c:\windows\, %systemroot%]. This is later used to 171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // collapse paths like c:\windows\system32 into %systemroot%\system32, which 172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // we can use for comparison against our blacklist (which uses only env vars). 173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // NOTE: The vector will not contain an exhaustive list of environment 174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // variables, only the ones currently found on the blacklist or ones that are 175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // likely to appear there. 176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void PreparePathMappings(); 177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // For a given |module|, collapse the path from c:\windows to %systemroot%, 179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // based on the |path_mapping_| vector. 180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void CollapsePath(Module* module); 181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Takes each module in the |enumerated_modules_| vector and matches it 183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // against a fixed blacklist of bad and suspected bad modules. 184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void MatchAgainstBlacklist(); 185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // This function executes on the UI thread when the scanning and matching 187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // process is done. It notifies the observer. 188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void ReportBack(); 189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Given a filename, returns the Subject (who signed it) retrieved from 191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the digital signature (Authenticode). 192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 GetSubjectNameFromDigitalSignature(const FilePath& filename); 193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The typedef for the vector that maps a regular file path to %env_var%. 195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef std::vector< std::pair<string16, string16> > PathMapping; 196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The vector of paths to %env_var%, used to account for differences in 198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // where people keep there files, c:\windows vs. d:\windows, etc. 199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch PathMapping path_mapping_; 200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The vector containing all the enumerated modules (loaded and modules of 202513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // interest). 203513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ModulesVector* enumerated_modules_; 204513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The observer, who needs to be notified when we are done. 206513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EnumerateModulesModel* observer_; 207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 2083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // See limited_mode below. 2093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen bool limited_mode_; 2103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 211513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The thread that we need to call back on to report that we are done. 212513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch BrowserThread::ID callback_thread_id_; 213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ModuleEnumerator); 215513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// This is a singleton class that enumerates all modules loaded into Chrome, 218513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// both currently loaded modules (called DLLs on Windows) and modules 'of 219513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// interest', such as WinSock LSP modules. This class also marks each module 220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// as benign or suspected bad or outright bad, using a supplied blacklist that 221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// is currently hard-coded. 222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// 223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// To use this class, grab the singleton pointer and call ScanNow(). 224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Then wait to get notified through MODULE_LIST_ENUMERATED when the list is 225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// ready. 226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// 227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// This class can be used on the UI thread as it asynchronously offloads the 228513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// file work over to the FILE thread and reports back to the caller with a 229513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// notification. 230513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass EnumerateModulesModel { 231513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen static EnumerateModulesModel* GetInstance(); 233513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if we should show the conflict notification. The conflict 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // notification is only shown once during the lifetime of the process. 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool ShouldShowConflictWarning() const; 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Called when the user has acknowledged the conflict notification. 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void AcknowledgeConflictNotification(); 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 241513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the number of suspected bad modules found in the last scan. 242513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns 0 if no scan has taken place yet. 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int suspected_bad_modules_detected() const { 244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return suspected_bad_modules_detected_; 245513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 247513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the number of confirmed bad modules found in the last scan. 248513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns 0 if no scan has taken place yet. 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int confirmed_bad_modules_detected() const { 250513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return confirmed_bad_modules_detected_; 251513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 252513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 2533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Set to true when we the scanning process can not rely on certain Chrome 2543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // services to exists. 2553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen void set_limited_mode(bool limited_mode) { 2563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen limited_mode_ = limited_mode; 2573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen } 2583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 2593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Asynchronously start the scan for the loaded module list, except when in 2603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // limited_mode (in which case it blocks). 261513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void ScanNow(); 262513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 263513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Gets the whole module list as a ListValue. 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ListValue* GetModuleList() const; 265513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 266513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 267513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch friend struct DefaultSingletonTraits<EnumerateModulesModel>; 268513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch friend class ModuleEnumerator; 269513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 270513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EnumerateModulesModel(); 271513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual ~EnumerateModulesModel(); 272513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 273513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Called on the UI thread when the helper class is done scanning. 274513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void DoneScanning(); 275513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 276513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Constructs a Help Center article URL for help with a particular module. 277513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The module must have the SEE_LINK attribute for |recommended_action| set, 278513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // otherwise this returns a blank string. 279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL ConstructHelpCenterUrl(const ModuleEnumerator::Module& module) const; 280513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 281513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The vector containing all the modules enumerated. Will be normalized and 282513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // any bad modules will be marked. 283513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ModuleEnumerator::ModulesVector enumerated_modules_; 284513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 285513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The object responsible for enumerating the modules on the File thread. 286513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<ModuleEnumerator> module_enumerator_; 287513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 288513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // When this singleton object is constructed we go and fire off this timer to 289513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // start scanning for modules after a certain amount of time has passed. 290513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch base::OneShotTimer<EnumerateModulesModel> check_modules_timer_; 291513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 2923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // While normally |false|, this mode can be set to indicate that the scanning 2933f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // process should not rely on certain services normally available to Chrome, 2943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // such as the resource bundle and the notification system, not to mention 2953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // having multiple threads. This mode is useful during diagnostics, which 2963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // runs without firing up all necessary Chrome services first. 2973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen bool limited_mode_; 2983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // True if we are currently scanning for modules. 300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool scanning_; 301513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Whether the conflict notification has been acknowledged by the user. 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool conflict_notification_acknowledged_; 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 305513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The number of confirmed bad modules (not including suspected bad ones) 306513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // found during last scan. 307513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int confirmed_bad_modules_detected_; 308513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 309513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The number of suspected bad modules (not including confirmed bad ones) 310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // found during last scan. 311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int suspected_bad_modules_detected_; 312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DISALLOW_COPY_AND_ASSIGN(EnumerateModulesModel); 314513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 316513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif // CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_ 317