| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 #include "chrome/browser/conflicts/module_database_win.h" | 5 #include "chrome/browser/conflicts/module_database_win.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <tuple> | 8 #include <tuple> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 | 11 |
| 12 namespace { | 12 namespace { |
| 13 | 13 |
| 14 // Document the assumptions made on the ProcessType enum in order to convert | 14 // Document the assumptions made on the ProcessType enum in order to convert |
| 15 // them to bits. | 15 // them to bits. |
| 16 static_assert(content::PROCESS_TYPE_UNKNOWN == 1, | 16 static_assert(content::PROCESS_TYPE_UNKNOWN == 1, |
| 17 "assumes unknown process type has value 1"); | 17 "assumes unknown process type has value 1"); |
| 18 static_assert(content::PROCESS_TYPE_BROWSER == 2, | 18 static_assert(content::PROCESS_TYPE_BROWSER == 2, |
| 19 "assumes browser process type has value 2"); | 19 "assumes browser process type has value 2"); |
| 20 constexpr uint32_t kFirstValidProcessType = content::PROCESS_TYPE_BROWSER; | 20 constexpr uint32_t kFirstValidProcessType = content::PROCESS_TYPE_BROWSER; |
| 21 | 21 |
| 22 ModuleDatabase* g_instance = nullptr; | 22 ModuleDatabase* g_instance = nullptr; |
| 23 | 23 |
| 24 } // namespace | 24 } // namespace |
| 25 | 25 |
| 26 ModuleDatabase::ModuleDatabase( | 26 ModuleDatabase::ModuleDatabase( |
| 27 scoped_refptr<base::SequencedTaskRunner> task_runner) | 27 scoped_refptr<base::SequencedTaskRunner> task_runner) |
| 28 : task_runner_(std::move(task_runner)), weak_ptr_factory_(this) {} | 28 : task_runner_(std::move(task_runner)), |
| 29 module_inspector_(this), |
| 30 weak_ptr_factory_(this) {} |
| 29 | 31 |
| 30 ModuleDatabase::~ModuleDatabase() { | 32 ModuleDatabase::~ModuleDatabase() { |
| 31 if (this == g_instance) | 33 if (this == g_instance) |
| 32 g_instance = nullptr; | 34 g_instance = nullptr; |
| 33 } | 35 } |
| 34 | 36 |
| 35 // static | 37 // static |
| 36 ModuleDatabase* ModuleDatabase::GetInstance() { | 38 ModuleDatabase* ModuleDatabase::GetInstance() { |
| 37 return g_instance; | 39 return g_instance; |
| 38 } | 40 } |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 ModuleDatabase::ModuleInfo* ModuleDatabase::FindOrCreateModuleInfo( | 288 ModuleDatabase::ModuleInfo* ModuleDatabase::FindOrCreateModuleInfo( |
| 287 const base::FilePath& module_path, | 289 const base::FilePath& module_path, |
| 288 uint32_t module_size, | 290 uint32_t module_size, |
| 289 uint32_t module_time_date_stamp) { | 291 uint32_t module_time_date_stamp) { |
| 290 auto result = modules_.emplace( | 292 auto result = modules_.emplace( |
| 291 std::piecewise_construct, | 293 std::piecewise_construct, |
| 292 std::forward_as_tuple(module_path, module_size, module_time_date_stamp, | 294 std::forward_as_tuple(module_path, module_size, module_time_date_stamp, |
| 293 modules_.size()), | 295 modules_.size()), |
| 294 std::forward_as_tuple()); | 296 std::forward_as_tuple()); |
| 295 | 297 |
| 298 // New modules must be inspected. |
| 299 if (result.second) |
| 300 module_inspector_.AddModule(result.first->first); |
| 301 |
| 296 return &(*result.first); | 302 return &(*result.first); |
| 297 } | 303 } |
| 298 | 304 |
| 299 ModuleDatabase::ProcessInfo* ModuleDatabase::GetProcessInfo( | 305 ModuleDatabase::ProcessInfo* ModuleDatabase::GetProcessInfo( |
| 300 uint32_t process_id, | 306 uint32_t process_id, |
| 301 uint64_t creation_time) { | 307 uint64_t creation_time) { |
| 302 ProcessInfoKey key(process_id, creation_time, content::PROCESS_TYPE_UNKNOWN); | 308 ProcessInfoKey key(process_id, creation_time, content::PROCESS_TYPE_UNKNOWN); |
| 303 auto it = processes_.find(key); | 309 auto it = processes_.find(key); |
| 304 if (it == processes_.end()) | 310 if (it == processes_.end()) |
| 305 return nullptr; | 311 return nullptr; |
| 306 return &(*it); | 312 return &(*it); |
| 307 } | 313 } |
| 308 | 314 |
| 309 void ModuleDatabase::CreateProcessInfo(uint32_t process_id, | 315 void ModuleDatabase::CreateProcessInfo(uint32_t process_id, |
| 310 uint64_t creation_time, | 316 uint64_t creation_time, |
| 311 content::ProcessType process_type) { | 317 content::ProcessType process_type) { |
| 312 processes_.emplace(std::piecewise_construct, | 318 processes_.emplace(std::piecewise_construct, |
| 313 std::forward_as_tuple(ProcessInfoKey( | 319 std::forward_as_tuple(ProcessInfoKey( |
| 314 process_id, creation_time, process_type)), | 320 process_id, creation_time, process_type)), |
| 315 std::forward_as_tuple(ProcessInfoData())); | 321 std::forward_as_tuple(ProcessInfoData())); |
| 316 } | 322 } |
| 317 | 323 |
| 318 void ModuleDatabase::DeleteProcessInfo(uint32_t process_id, | 324 void ModuleDatabase::DeleteProcessInfo(uint32_t process_id, |
| 319 uint64_t creation_time) { | 325 uint64_t creation_time) { |
| 320 ProcessInfoKey key(process_id, creation_time, content::PROCESS_TYPE_UNKNOWN); | 326 ProcessInfoKey key(process_id, creation_time, content::PROCESS_TYPE_UNKNOWN); |
| 321 processes_.erase(key); | 327 processes_.erase(key); |
| 322 } | 328 } |
| 323 | 329 |
| 330 void ModuleDatabase::OnModuleInspected(const ModuleInfoKey& module_key, |
| 331 const ModuleInfoData& module_data) { |
| 332 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| 333 |
| 334 // Received the data. Copy it. |
| 335 auto it = modules_.find(module_key); |
| 336 if (it != modules_.end()) |
| 337 it->second.CopyInspectionData(module_data); |
| 338 } |
| 339 |
| 324 // ModuleDatabase::ProcessInfoKey ---------------------------------------------- | 340 // ModuleDatabase::ProcessInfoKey ---------------------------------------------- |
| 325 | 341 |
| 326 ModuleDatabase::ProcessInfoKey::ProcessInfoKey( | 342 ModuleDatabase::ProcessInfoKey::ProcessInfoKey( |
| 327 uint32_t process_id, | 343 uint32_t process_id, |
| 328 uint64_t creation_time, | 344 uint64_t creation_time, |
| 329 content::ProcessType process_type) | 345 content::ProcessType process_type) |
| 330 : process_id(process_id), | 346 : process_id(process_id), |
| 331 creation_time(creation_time), | 347 creation_time(creation_time), |
| 332 process_type(process_type) {} | 348 process_type(process_type) {} |
| 333 | 349 |
| 334 ModuleDatabase::ProcessInfoKey::~ProcessInfoKey() = default; | 350 ModuleDatabase::ProcessInfoKey::~ProcessInfoKey() = default; |
| 335 | 351 |
| 336 bool ModuleDatabase::ProcessInfoKey::operator<( | 352 bool ModuleDatabase::ProcessInfoKey::operator<( |
| 337 const ProcessInfoKey& pik) const { | 353 const ProcessInfoKey& pik) const { |
| 338 // The key consists of the pair of (process_id, creation_time). | 354 // The key consists of the pair of (process_id, creation_time). |
| 339 // Use the std::tuple lexicographic comparison operator. | 355 // Use the std::tuple lexicographic comparison operator. |
| 340 return std::make_tuple(process_id, creation_time) < | 356 return std::make_tuple(process_id, creation_time) < |
| 341 std::make_tuple(pik.process_id, pik.creation_time); | 357 std::make_tuple(pik.process_id, pik.creation_time); |
| 342 } | 358 } |
| 343 | 359 |
| 344 // ModuleDatabase::ProcessInfoData --------------------------------------------- | 360 // ModuleDatabase::ProcessInfoData --------------------------------------------- |
| 345 | 361 |
| 346 ModuleDatabase::ProcessInfoData::ProcessInfoData() = default; | 362 ModuleDatabase::ProcessInfoData::ProcessInfoData() = default; |
| 347 | 363 |
| 348 ModuleDatabase::ProcessInfoData::ProcessInfoData(const ProcessInfoData& other) = | 364 ModuleDatabase::ProcessInfoData::ProcessInfoData(const ProcessInfoData& other) = |
| 349 default; | 365 default; |
| 350 | 366 |
| 351 ModuleDatabase::ProcessInfoData::~ProcessInfoData() = default; | 367 ModuleDatabase::ProcessInfoData::~ProcessInfoData() = default; |
| OLD | NEW |