| Index: components/crash/content/app/crashpad.cc
|
| diff --git a/components/crash/content/app/crashpad.cc b/components/crash/content/app/crashpad.cc
|
| index 2ac5a8c4892128dc106169841e108b14d53ed758..e471628fdb7b34de3fcc8cefaeb8cfbfbc502630 100644
|
| --- a/components/crash/content/app/crashpad.cc
|
| +++ b/components/crash/content/app/crashpad.cc
|
| @@ -42,7 +42,6 @@
|
|
|
| #if BUILDFLAG(ENABLE_KASKO)
|
| #include "base/win/scoped_handle.h"
|
| -#include "base/win/win_util.h"
|
| #include "third_party/crashpad/crashpad/snapshot/api/module_annotations_win.h"
|
| #endif
|
|
|
| @@ -105,10 +104,59 @@ void DumpWithoutCrashing() {
|
| }
|
|
|
| #if BUILDFLAG(ENABLE_KASKO)
|
| +// TODO(ananta)
|
| +// We cannot depend on functionality in base which pulls in dependencies on
|
| +// user32 directly or indirectly. The GetLoadedModulesSnapshot is a copy of the
|
| +// function in base/win/win_util.cc. Depending on the base function pulls in
|
| +// dependencies on user32 due to other functionality in win_util.cc. This
|
| +// function should be removed when KASKO is removed.
|
| +bool GetLoadedModulesSnapshot(HANDLE process, std::vector<HMODULE>* snapshot) {
|
| + DCHECK(snapshot);
|
| + DCHECK_EQ(0u, snapshot->size());
|
| + snapshot->resize(128);
|
| +
|
| + // We will retry at least once after first determining |bytes_required|. If
|
| + // the list of modules changes after we receive |bytes_required| we may retry
|
| + // more than once.
|
| + int retries_remaining = 5;
|
| + do {
|
| + DWORD bytes_required = 0;
|
| + // EnumProcessModules returns 'success' even if the buffer size is too
|
| + // small.
|
| + DCHECK_GE(std::numeric_limits<DWORD>::max(),
|
| + snapshot->size() * sizeof(HMODULE));
|
| + if (!::EnumProcessModules(
|
| + process, &(*snapshot)[0],
|
| + static_cast<DWORD>(snapshot->size() * sizeof(HMODULE)),
|
| + &bytes_required)) {
|
| + DPLOG(ERROR) << "::EnumProcessModules failed.";
|
| + return false;
|
| + }
|
| + DCHECK_EQ(0u, bytes_required % sizeof(HMODULE));
|
| + size_t num_modules = bytes_required / sizeof(HMODULE);
|
| + if (num_modules <= snapshot->size()) {
|
| + // Buffer size was too big, presumably because a module was unloaded.
|
| + snapshot->erase(snapshot->begin() + num_modules, snapshot->end());
|
| + return true;
|
| + } else if (num_modules == 0) {
|
| + DLOG(ERROR) << "Can't determine the module list size.";
|
| + return false;
|
| + } else {
|
| + // Buffer size was too small. Try again with a larger buffer. A little
|
| + // more room is given to avoid multiple expensive calls to
|
| + // ::EnumProcessModules() just because one module has been added.
|
| + snapshot->resize(num_modules + 8, NULL);
|
| + }
|
| + } while (--retries_remaining);
|
| +
|
| + DLOG(ERROR) << "Failed to enumerate modules.";
|
| + return false;
|
| +}
|
| +
|
| HMODULE GetModuleInProcess(base::ProcessHandle process,
|
| const wchar_t* module_name) {
|
| std::vector<HMODULE> modules_snapshot;
|
| - if (!base::win::GetLoadedModulesSnapshot(process, &modules_snapshot))
|
| + if (!GetLoadedModulesSnapshot(process, &modules_snapshot))
|
| return nullptr;
|
|
|
| for (HMODULE module : modules_snapshot) {
|
|
|