Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3292)

Unified Diff: components/crash/content/app/crashpad.cc

Issue 2077323004: Remove dependency on base/win/win_util.cc from crashpad. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments and update patch description Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome_elf/elf_imports_unittest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « chrome_elf/elf_imports_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698