| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_ | 5 #ifndef CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_ |
| 6 #define CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_ | 6 #define CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 static void NormalizeModule(Module* module); | 112 static void NormalizeModule(Module* module); |
| 113 | 113 |
| 114 // A static function that checks whether |module| has been |blacklisted|. | 114 // A static function that checks whether |module| has been |blacklisted|. |
| 115 static ModuleStatus Match(const Module& module, | 115 static ModuleStatus Match(const Module& module, |
| 116 const BlacklistEntry& blacklisted); | 116 const BlacklistEntry& blacklisted); |
| 117 | 117 |
| 118 explicit ModuleEnumerator(EnumerateModulesModel* observer); | 118 explicit ModuleEnumerator(EnumerateModulesModel* observer); |
| 119 ~ModuleEnumerator(); | 119 ~ModuleEnumerator(); |
| 120 | 120 |
| 121 // Start scanning the loaded module list (if a scan is not already in | 121 // Start scanning the loaded module list (if a scan is not already in |
| 122 // progress). This function does not block while reading the module list, but | 122 // progress). This function does not block while reading the module list |
| 123 // will notify when done through the MODULE_LIST_ENUMERATED notification. | 123 // (unless we are in limited_mode, see below), and will notify when done |
| 124 // through the MODULE_LIST_ENUMERATED notification. |
| 124 // The process will also send MODULE_INCOMPATIBILITY_DETECTED if an | 125 // The process will also send MODULE_INCOMPATIBILITY_DETECTED if an |
| 125 // incompatible module was detected. | 126 // incompatible module was detected. |
| 126 void ScanNow(ModulesVector* list); | 127 // When in |limited_mode|, this function will not leverage the File thread |
| 128 // to run asynchronously and will therefore block until scanning is done |
| 129 // (and will also not send out any notifications). |
| 130 void ScanNow(ModulesVector* list, bool limited_mode); |
| 127 | 131 |
| 128 private: | 132 private: |
| 129 FRIEND_TEST_ALL_PREFIXES(EnumerateModulesTest, CollapsePath); | 133 FRIEND_TEST_ALL_PREFIXES(EnumerateModulesTest, CollapsePath); |
| 130 | 134 |
| 131 // The (currently) hard coded blacklist of known bad modules. | 135 // The (currently) hard coded blacklist of known bad modules. |
| 132 static const BlacklistEntry kModuleBlacklist[]; | 136 static const BlacklistEntry kModuleBlacklist[]; |
| 133 | 137 |
| 134 // This function does the actual file scanning work on the FILE thread. It | 138 // This function does the actual file scanning work on the FILE thread (or |
| 135 // enumerates all loaded modules in the process and other modules of | 139 // block the main thread when in limited_mode). It enumerates all loaded |
| 136 // interest, such as the registered Winsock LSP modules and stores them in | 140 // modules in the process and other modules of interest, such as the |
| 137 // |enumerated_modules_|. It then normalizes the module info and matches | 141 // registered Winsock LSP modules and stores them in |enumerated_modules_|. |
| 138 // them against a blacklist of known bad modules. Finally, it calls | 142 // It then normalizes the module info and matches them against a blacklist |
| 139 // ReportBack to let the observer know we are done. | 143 // of known bad modules. Finally, it calls ReportBack to let the observer |
| 140 void ScanOnFileThread(); | 144 // know we are done. |
| 145 void ScanImpl(); |
| 141 | 146 |
| 142 // Enumerate all modules loaded into the Chrome process. | 147 // Enumerate all modules loaded into the Chrome process. |
| 143 void EnumerateLoadedModules(); | 148 void EnumerateLoadedModules(); |
| 144 | 149 |
| 145 // Enumerate all registered Windows shell extensions. | 150 // Enumerate all registered Windows shell extensions. |
| 146 void EnumerateShellExtensions(); | 151 void EnumerateShellExtensions(); |
| 147 | 152 |
| 148 // Enumerate all registered Winsock LSP modules. | 153 // Enumerate all registered Winsock LSP modules. |
| 149 void EnumerateWinsockModules(); | 154 void EnumerateWinsockModules(); |
| 150 | 155 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 // where people keep there files, c:\windows vs. d:\windows, etc. | 198 // where people keep there files, c:\windows vs. d:\windows, etc. |
| 194 PathMapping path_mapping_; | 199 PathMapping path_mapping_; |
| 195 | 200 |
| 196 // The vector containing all the enumerated modules (loaded and modules of | 201 // The vector containing all the enumerated modules (loaded and modules of |
| 197 // interest). | 202 // interest). |
| 198 ModulesVector* enumerated_modules_; | 203 ModulesVector* enumerated_modules_; |
| 199 | 204 |
| 200 // The observer, who needs to be notified when we are done. | 205 // The observer, who needs to be notified when we are done. |
| 201 EnumerateModulesModel* observer_; | 206 EnumerateModulesModel* observer_; |
| 202 | 207 |
| 208 // See limited_mode below. |
| 209 bool limited_mode_; |
| 210 |
| 203 // The thread that we need to call back on to report that we are done. | 211 // The thread that we need to call back on to report that we are done. |
| 204 BrowserThread::ID callback_thread_id_; | 212 BrowserThread::ID callback_thread_id_; |
| 205 | 213 |
| 206 DISALLOW_COPY_AND_ASSIGN(ModuleEnumerator); | 214 DISALLOW_COPY_AND_ASSIGN(ModuleEnumerator); |
| 207 }; | 215 }; |
| 208 | 216 |
| 209 // This is a singleton class that enumerates all modules loaded into Chrome, | 217 // This is a singleton class that enumerates all modules loaded into Chrome, |
| 210 // both currently loaded modules (called DLLs on Windows) and modules 'of | 218 // both currently loaded modules (called DLLs on Windows) and modules 'of |
| 211 // interest', such as WinSock LSP modules. This class also marks each module | 219 // interest', such as WinSock LSP modules. This class also marks each module |
| 212 // as benign or suspected bad or outright bad, using a supplied blacklist that | 220 // as benign or suspected bad or outright bad, using a supplied blacklist that |
| (...skipping 15 matching lines...) Expand all Loading... |
| 228 int suspected_bad_modules_detected() { | 236 int suspected_bad_modules_detected() { |
| 229 return suspected_bad_modules_detected_; | 237 return suspected_bad_modules_detected_; |
| 230 } | 238 } |
| 231 | 239 |
| 232 // Returns the number of confirmed bad modules found in the last scan. | 240 // Returns the number of confirmed bad modules found in the last scan. |
| 233 // Returns 0 if no scan has taken place yet. | 241 // Returns 0 if no scan has taken place yet. |
| 234 int confirmed_bad_modules_detected() { | 242 int confirmed_bad_modules_detected() { |
| 235 return confirmed_bad_modules_detected_; | 243 return confirmed_bad_modules_detected_; |
| 236 } | 244 } |
| 237 | 245 |
| 238 // Asynchronously start the scan for the loaded module list. | 246 // Set to true when we the scanning process can not rely on certain Chrome |
| 239 // When the list is ready. | 247 // services to exists. |
| 248 void set_limited_mode(bool limited_mode) { |
| 249 limited_mode_ = limited_mode; |
| 250 } |
| 251 |
| 252 // Asynchronously start the scan for the loaded module list, except when in |
| 253 // limited_mode (in which case it blocks). |
| 240 void ScanNow(); | 254 void ScanNow(); |
| 241 | 255 |
| 242 // Gets the whole module list as a ListValue. | 256 // Gets the whole module list as a ListValue. |
| 243 ListValue* GetModuleList(); | 257 ListValue* GetModuleList(); |
| 244 | 258 |
| 245 private: | 259 private: |
| 246 friend struct DefaultSingletonTraits<EnumerateModulesModel>; | 260 friend struct DefaultSingletonTraits<EnumerateModulesModel>; |
| 247 friend class ModuleEnumerator; | 261 friend class ModuleEnumerator; |
| 248 | 262 |
| 249 EnumerateModulesModel(); | 263 EnumerateModulesModel(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 261 // any bad modules will be marked. | 275 // any bad modules will be marked. |
| 262 ModuleEnumerator::ModulesVector enumerated_modules_; | 276 ModuleEnumerator::ModulesVector enumerated_modules_; |
| 263 | 277 |
| 264 // The object responsible for enumerating the modules on the File thread. | 278 // The object responsible for enumerating the modules on the File thread. |
| 265 scoped_refptr<ModuleEnumerator> module_enumerator_; | 279 scoped_refptr<ModuleEnumerator> module_enumerator_; |
| 266 | 280 |
| 267 // When this singleton object is constructed we go and fire off this timer to | 281 // When this singleton object is constructed we go and fire off this timer to |
| 268 // start scanning for modules after a certain amount of time has passed. | 282 // start scanning for modules after a certain amount of time has passed. |
| 269 base::OneShotTimer<EnumerateModulesModel> check_modules_timer_; | 283 base::OneShotTimer<EnumerateModulesModel> check_modules_timer_; |
| 270 | 284 |
| 285 // While normally |false|, this mode can be set to indicate that the scanning |
| 286 // process should not rely on certain services normally available to Chrome, |
| 287 // such as the resource bundle and the notification system, not to mention |
| 288 // having multiple threads. This mode is useful during diagnostics, which |
| 289 // runs without firing up all necessary Chrome services first. |
| 290 bool limited_mode_; |
| 291 |
| 271 // True if we are currently scanning for modules. | 292 // True if we are currently scanning for modules. |
| 272 bool scanning_; | 293 bool scanning_; |
| 273 | 294 |
| 274 // The number of confirmed bad modules (not including suspected bad ones) | 295 // The number of confirmed bad modules (not including suspected bad ones) |
| 275 // found during last scan. | 296 // found during last scan. |
| 276 int confirmed_bad_modules_detected_; | 297 int confirmed_bad_modules_detected_; |
| 277 | 298 |
| 278 // The number of suspected bad modules (not including confirmed bad ones) | 299 // The number of suspected bad modules (not including confirmed bad ones) |
| 279 // found during last scan. | 300 // found during last scan. |
| 280 int suspected_bad_modules_detected_; | 301 int suspected_bad_modules_detected_; |
| 281 | 302 |
| 282 DISALLOW_COPY_AND_ASSIGN(EnumerateModulesModel); | 303 DISALLOW_COPY_AND_ASSIGN(EnumerateModulesModel); |
| 283 }; | 304 }; |
| 284 | 305 |
| 285 #endif // CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_ | 306 #endif // CHROME_BROWSER_ENUMERATE_MODULES_MODEL_WIN_H_ |
| OLD | NEW |