| Index: chrome/browser/enumerate_modules_model_win.h
|
| diff --git a/chrome/browser/enumerate_modules_model_win.h b/chrome/browser/enumerate_modules_model_win.h
|
| deleted file mode 100644
|
| index d40a81e7d67f09cbd07ff338f5294b04c8f869fa..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/enumerate_modules_model_win.h
|
| +++ /dev/null
|
| @@ -1,366 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_
|
| -#define CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_
|
| -
|
| -#include <utility>
|
| -#include <vector>
|
| -
|
| -#include "base/gtest_prod_util.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/memory/singleton.h"
|
| -#include "base/strings/string16.h"
|
| -#include "base/timer/timer.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "url/gurl.h"
|
| -
|
| -class EnumerateModulesModel;
|
| -
|
| -namespace base {
|
| -class FilePath;
|
| -class ListValue;
|
| -}
|
| -
|
| -// A helper class that implements the enumerate module functionality on the File
|
| -// thread.
|
| -class ModuleEnumerator : public base::RefCountedThreadSafe<ModuleEnumerator> {
|
| - public:
|
| - // What type of module we are dealing with. Loaded modules are modules we
|
| - // detect as loaded in the process at the time of scanning. The others are
|
| - // modules of interest and may or may not be loaded in the process at the
|
| - // time of scan.
|
| - enum ModuleType {
|
| - LOADED_MODULE = 1 << 0,
|
| - SHELL_EXTENSION = 1 << 1,
|
| - WINSOCK_MODULE_REGISTRATION = 1 << 2,
|
| - };
|
| -
|
| - // The blacklist status of the module. Suspected Bad modules have been
|
| - // partially matched (ie. name matches and location, but not description)
|
| - // whereas Confirmed Bad modules have been identified further (ie.
|
| - // AuthentiCode signer matches).
|
| - enum ModuleStatus {
|
| - // This is returned by the matching function when comparing against the
|
| - // blacklist and the module does not match the current entry in the
|
| - // blacklist.
|
| - NOT_MATCHED,
|
| - // The module is not on the blacklist. Assume it is good.
|
| - GOOD,
|
| - // Module is a suspected bad module.
|
| - SUSPECTED_BAD,
|
| - // Module is a bad bad dog.
|
| - CONFIRMED_BAD,
|
| - };
|
| -
|
| - // A bitmask with the possible resolutions for bad modules.
|
| - enum RecommendedAction {
|
| - NONE = 0,
|
| - INVESTIGATING = 1 << 0,
|
| - UNINSTALL = 1 << 1,
|
| - DISABLE = 1 << 2,
|
| - UPDATE = 1 << 3,
|
| - SEE_LINK = 1 << 4,
|
| - NOTIFY_USER = 1 << 5,
|
| - };
|
| -
|
| - // Which Windows OS is affected.
|
| - enum OperatingSystem {
|
| - ALL = -1,
|
| - XP = 1 << 0,
|
| - };
|
| -
|
| - // The structure we populate when enumerating modules.
|
| - struct Module {
|
| - Module();
|
| - Module(const Module& rhs);
|
| - Module(ModuleType type,
|
| - ModuleStatus status,
|
| - const base::string16& location,
|
| - const base::string16& name,
|
| - const base::string16& product_name,
|
| - const base::string16& description,
|
| - const base::string16& version,
|
| - const base::string16& digital_signer,
|
| - RecommendedAction recommended_action);
|
| - ~Module();
|
| -
|
| - // The type of module found
|
| - ModuleType type;
|
| - // The module status (benign/bad/etc).
|
| - ModuleStatus status;
|
| - // The module path, not including filename.
|
| - base::string16 location;
|
| - // The name of the module (filename).
|
| - base::string16 name;
|
| - // The name of the product the module belongs to.
|
| - base::string16 product_name;
|
| - // The module file description.
|
| - base::string16 description;
|
| - // The module version.
|
| - base::string16 version;
|
| - // The signer of the digital certificate for the module.
|
| - base::string16 digital_signer;
|
| - // The help tips bitmask.
|
| - RecommendedAction recommended_action;
|
| - // The duplicate count within each category of modules.
|
| - int duplicate_count;
|
| - // Whether this module has been normalized (necessary before checking it
|
| - // against blacklist).
|
| - bool normalized;
|
| - };
|
| -
|
| - // A vector typedef of all modules enumerated.
|
| - typedef std::vector<Module> ModulesVector;
|
| -
|
| - // A structure we populate with the blacklist entries.
|
| - struct BlacklistEntry {
|
| - const char* filename;
|
| - const char* location;
|
| - const char* desc_or_signer;
|
| - const char* version_from; // Version where conflict started.
|
| - const char* version_to; // First version that works.
|
| - OperatingSystem os; // Bitmask, representing what OS this entry applies to.
|
| - RecommendedAction help_tip;
|
| - };
|
| -
|
| - // A static function that normalizes the module information in the |module|
|
| - // struct. Module information needs to be normalized before comparing against
|
| - // the blacklist. This is because the same module can be described in many
|
| - // different ways, ie. file paths can be presented in long/short name form,
|
| - // and are not case sensitive on Windows. Also, the version string returned
|
| - // can include appended text, which we don't want to use during comparison
|
| - // against the blacklist.
|
| - static void NormalizeModule(Module* module);
|
| -
|
| - // A static function that checks whether |module| has been |blacklisted|.
|
| - static ModuleStatus Match(const Module& module,
|
| - const BlacklistEntry& blacklisted);
|
| -
|
| - explicit ModuleEnumerator(EnumerateModulesModel* observer);
|
| -
|
| - // Start scanning the loaded module list (if a scan is not already in
|
| - // progress). This function does not block while reading the module list
|
| - // (unless we are in limited_mode, see below), and will notify when done
|
| - // through the MODULE_LIST_ENUMERATED notification.
|
| - // The process will also send MODULE_INCOMPATIBILITY_BADGE_CHANGE to let
|
| - // observers know when it is time to update the wrench menu badge.
|
| - // When in |limited_mode|, this function will not leverage the File thread
|
| - // to run asynchronously and will therefore block until scanning is done
|
| - // (and will also not send out any notifications).
|
| - void ScanNow(ModulesVector* list, bool limited_mode);
|
| -
|
| - private:
|
| - FRIEND_TEST_ALL_PREFIXES(EnumerateModulesTest, CollapsePath);
|
| -
|
| - friend class base::RefCountedThreadSafe<ModuleEnumerator>;
|
| - ~ModuleEnumerator();
|
| -
|
| - // The (currently) hard coded blacklist of known bad modules.
|
| - static const BlacklistEntry kModuleBlacklist[];
|
| -
|
| - // This function does the actual file scanning work on the FILE thread (or
|
| - // block the main thread when in limited_mode). It enumerates all loaded
|
| - // modules in the process and other modules of interest, such as the
|
| - // registered Winsock LSP modules and stores them in |enumerated_modules_|.
|
| - // It then normalizes the module info and matches them against a blacklist
|
| - // of known bad modules. Finally, it calls ReportBack to let the observer
|
| - // know we are done.
|
| - void ScanImpl();
|
| -
|
| - // Enumerate all modules loaded into the Chrome process.
|
| - void EnumerateLoadedModules();
|
| -
|
| - // Enumerate all registered Windows shell extensions.
|
| - void EnumerateShellExtensions();
|
| -
|
| - // Enumerate all registered Winsock LSP modules.
|
| - void EnumerateWinsockModules();
|
| -
|
| - // Reads the registered shell extensions found under |parent| key in the
|
| - // registry.
|
| - void ReadShellExtensions(HKEY parent);
|
| -
|
| - // Given a |module|, initializes the structure and loads additional
|
| - // information using the location field of the module.
|
| - void PopulateModuleInformation(Module* module);
|
| -
|
| - // Checks the module list to see if a |module| of the same type, location
|
| - // and name has been added before and if so, increments its duplication
|
| - // counter. If it doesn't appear in the list, it is added.
|
| - void AddToListWithoutDuplicating(const Module&);
|
| -
|
| - // Builds up a vector of path values mapping to environment variable,
|
| - // with pairs like [c:\windows\, %systemroot%]. This is later used to
|
| - // collapse paths like c:\windows\system32 into %systemroot%\system32, which
|
| - // we can use for comparison against our blacklist (which uses only env vars).
|
| - // NOTE: The vector will not contain an exhaustive list of environment
|
| - // variables, only the ones currently found on the blacklist or ones that are
|
| - // likely to appear there.
|
| - void PreparePathMappings();
|
| -
|
| - // For a given |module|, collapse the path from c:\windows to %systemroot%,
|
| - // based on the |path_mapping_| vector.
|
| - void CollapsePath(Module* module);
|
| -
|
| - // Takes each module in the |enumerated_modules_| vector and matches it
|
| - // against a fixed blacklist of bad and suspected bad modules.
|
| - void MatchAgainstBlacklist();
|
| -
|
| - // This function executes on the UI thread when the scanning and matching
|
| - // process is done. It notifies the observer.
|
| - void ReportBack();
|
| -
|
| - // Given a filename, returns the Subject (who signed it) retrieved from
|
| - // the digital signature (Authenticode).
|
| - base::string16 GetSubjectNameFromDigitalSignature(
|
| - const base::FilePath& filename);
|
| -
|
| - // The typedef for the vector that maps a regular file path to %env_var%.
|
| - typedef std::vector< std::pair<base::string16, base::string16> > PathMapping;
|
| -
|
| - // The vector of paths to %env_var%, used to account for differences in
|
| - // where people keep there files, c:\windows vs. d:\windows, etc.
|
| - PathMapping path_mapping_;
|
| -
|
| - // The vector containing all the enumerated modules (loaded and modules of
|
| - // interest).
|
| - ModulesVector* enumerated_modules_;
|
| -
|
| - // The observer, who needs to be notified when we are done.
|
| - EnumerateModulesModel* observer_;
|
| -
|
| - // See limited_mode below.
|
| - bool limited_mode_;
|
| -
|
| - // The thread that we need to call back on to report that we are done.
|
| - content::BrowserThread::ID callback_thread_id_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ModuleEnumerator);
|
| -};
|
| -
|
| -// This is a singleton class that enumerates all modules loaded into Chrome,
|
| -// both currently loaded modules (called DLLs on Windows) and modules 'of
|
| -// interest', such as WinSock LSP modules. This class also marks each module
|
| -// as benign or suspected bad or outright bad, using a supplied blacklist that
|
| -// is currently hard-coded.
|
| -//
|
| -// To use this class, grab the singleton pointer and call ScanNow().
|
| -// Then wait to get notified through MODULE_LIST_ENUMERATED when the list is
|
| -// ready.
|
| -//
|
| -// This class can be used on the UI thread as it asynchronously offloads the
|
| -// file work over to the FILE thread and reports back to the caller with a
|
| -// notification.
|
| -class EnumerateModulesModel {
|
| - public:
|
| - // UMA histogram constants.
|
| - enum UmaModuleConflictHistogramOptions {
|
| - ACTION_BUBBLE_SHOWN = 0,
|
| - ACTION_BUBBLE_LEARN_MORE,
|
| - ACTION_MENU_LEARN_MORE,
|
| - ACTION_BOUNDARY, // Must be the last value.
|
| - };
|
| -
|
| - static EnumerateModulesModel* GetInstance();
|
| -
|
| - // Returns true if we should show the conflict notification. The conflict
|
| - // notification is only shown once during the lifetime of the process.
|
| - bool ShouldShowConflictWarning() const;
|
| -
|
| - // Called when the user has acknowledged the conflict notification.
|
| - void AcknowledgeConflictNotification();
|
| -
|
| - // Returns the number of suspected bad modules found in the last scan.
|
| - // Returns 0 if no scan has taken place yet.
|
| - int suspected_bad_modules_detected() const {
|
| - return suspected_bad_modules_detected_;
|
| - }
|
| -
|
| - // Returns the number of confirmed bad modules found in the last scan.
|
| - // Returns 0 if no scan has taken place yet.
|
| - int confirmed_bad_modules_detected() const {
|
| - return confirmed_bad_modules_detected_;
|
| - }
|
| -
|
| - // Returns how many modules to notify the user about.
|
| - int modules_to_notify_about() const {
|
| - return modules_to_notify_about_;
|
| - }
|
| -
|
| - // Set to true when we the scanning process can not rely on certain Chrome
|
| - // services to exists.
|
| - void set_limited_mode(bool limited_mode) {
|
| - limited_mode_ = limited_mode;
|
| - }
|
| -
|
| - // Checks to see if a scanning task should be started and sets one off, if so.
|
| - void MaybePostScanningTask();
|
| -
|
| - // Asynchronously start the scan for the loaded module list, except when in
|
| - // limited_mode (in which case it blocks).
|
| - void ScanNow();
|
| -
|
| - // Gets the whole module list as a ListValue.
|
| - base::ListValue* GetModuleList() const;
|
| -
|
| - // Gets the Help Center URL for the first *notable* conflict module that we've
|
| - // elected to notify the user about.
|
| - GURL GetFirstNotableConflict();
|
| -
|
| - private:
|
| - friend struct base::DefaultSingletonTraits<EnumerateModulesModel>;
|
| - friend class ModuleEnumerator;
|
| -
|
| - EnumerateModulesModel();
|
| - virtual ~EnumerateModulesModel();
|
| -
|
| - // Called on the UI thread when the helper class is done scanning.
|
| - void DoneScanning();
|
| -
|
| - // Constructs a Help Center article URL for help with a particular module.
|
| - // The module must have the SEE_LINK attribute for |recommended_action| set,
|
| - // otherwise this returns a blank string.
|
| - GURL ConstructHelpCenterUrl(const ModuleEnumerator::Module& module) const;
|
| -
|
| - // The vector containing all the modules enumerated. Will be normalized and
|
| - // any bad modules will be marked.
|
| - ModuleEnumerator::ModulesVector enumerated_modules_;
|
| -
|
| - // The object responsible for enumerating the modules on the File thread.
|
| - scoped_refptr<ModuleEnumerator> module_enumerator_;
|
| -
|
| - // When this singleton object is constructed we go and fire off this timer to
|
| - // start scanning for modules after a certain amount of time has passed.
|
| - base::OneShotTimer check_modules_timer_;
|
| -
|
| - // While normally |false|, this mode can be set to indicate that the scanning
|
| - // process should not rely on certain services normally available to Chrome,
|
| - // such as the resource bundle and the notification system, not to mention
|
| - // having multiple threads. This mode is useful during diagnostics, which
|
| - // runs without firing up all necessary Chrome services first.
|
| - bool limited_mode_;
|
| -
|
| - // True if we are currently scanning for modules.
|
| - bool scanning_;
|
| -
|
| - // Whether the conflict notification has been acknowledged by the user.
|
| - bool conflict_notification_acknowledged_;
|
| -
|
| - // The number of confirmed bad modules (not including suspected bad ones)
|
| - // found during last scan.
|
| - int confirmed_bad_modules_detected_;
|
| -
|
| - // The number of bad modules the user needs to be aggressively notified about.
|
| - int modules_to_notify_about_;
|
| -
|
| - // The number of suspected bad modules (not including confirmed bad ones)
|
| - // found during last scan.
|
| - int suspected_bad_modules_detected_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(EnumerateModulesModel);
|
| -};
|
| -
|
| -#endif // CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_
|
|
|