Index: snapshot/win/module_snapshot_win.cc |
diff --git a/snapshot/win/module_snapshot_win.cc b/snapshot/win/module_snapshot_win.cc |
index c3f915f8b4b70185ee62048be52069a73574d250..77a8e037524762f5325e9615d8107f6499fbdff6 100644 |
--- a/snapshot/win/module_snapshot_win.cc |
+++ b/snapshot/win/module_snapshot_win.cc |
@@ -18,6 +18,7 @@ |
#include "snapshot/win/pe_image_reader.h" |
#include "util/misc/tri_state.h" |
#include "util/misc/uuid.h" |
+#include "util/win/module_version.h" |
namespace crashpad { |
namespace internal { |
@@ -39,13 +40,13 @@ bool ModuleSnapshotWin::Initialize( |
INITIALIZATION_STATE_SET_INITIALIZING(initialized_); |
process_reader_ = process_reader; |
- name_ = base::UTF16ToUTF8(process_reader_module.name); |
+ name_ = process_reader_module.name; |
timestamp_ = process_reader_module.timestamp; |
pe_image_reader_.reset(new PEImageReader()); |
if (!pe_image_reader_->Initialize(process_reader_, |
process_reader_module.dll_base, |
process_reader_module.size, |
- name_)) { |
+ base::UTF16ToUTF8(name_))) { |
return false; |
} |
@@ -74,7 +75,7 @@ void ModuleSnapshotWin::GetCrashpadOptions(CrashpadInfoClientOptions* options) { |
std::string ModuleSnapshotWin::Name() const { |
INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
- return name_; |
+ return base::UTF16ToUTF8(name_); |
} |
uint64_t ModuleSnapshotWin::Address() const { |
@@ -97,7 +98,18 @@ void ModuleSnapshotWin::FileVersion(uint16_t* version_0, |
uint16_t* version_2, |
uint16_t* version_3) const { |
INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
- CHECK(false) << "TODO(scottmg)"; |
+ VS_FIXEDFILEINFO ffi; |
+ if (GetModuleVersionAndType(base::FilePath(name_), &ffi)) { |
+ *version_0 = ffi.dwFileVersionMS >> 16; |
+ *version_1 = ffi.dwFileVersionMS & 0xffff; |
+ *version_2 = ffi.dwFileVersionLS >> 16; |
+ *version_3 = ffi.dwFileVersionLS & 0xffff; |
+ } else { |
+ *version_0 = 0; |
+ *version_1 = 0; |
+ *version_2 = 0; |
+ *version_3 = 0; |
+ } |
} |
void ModuleSnapshotWin::SourceVersion(uint16_t* version_0, |
@@ -105,13 +117,32 @@ void ModuleSnapshotWin::SourceVersion(uint16_t* version_0, |
uint16_t* version_2, |
uint16_t* version_3) const { |
INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
- CHECK(false) << "TODO(scottmg)"; |
+ VS_FIXEDFILEINFO ffi; |
+ if (GetModuleVersionAndType(base::FilePath(name_), &ffi)) { |
+ *version_0 = ffi.dwProductVersionMS >> 16; |
+ *version_1 = ffi.dwProductVersionMS & 0xffff; |
+ *version_2 = ffi.dwProductVersionLS >> 16; |
+ *version_3 = ffi.dwProductVersionLS & 0xffff; |
+ } else { |
+ *version_0 = 0; |
+ *version_1 = 0; |
+ *version_2 = 0; |
+ *version_3 = 0; |
+ } |
} |
ModuleSnapshot::ModuleType ModuleSnapshotWin::GetModuleType() const { |
INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
- CHECK(false) << "TODO(scottmg)"; |
- return ModuleSnapshot::ModuleType(); |
+ VS_FIXEDFILEINFO ffi; |
+ if (GetModuleVersionAndType(base::FilePath(name_), &ffi)) { |
+ if (ffi.dwFileType == VFT_APP) |
+ return ModuleSnapshot::kModuleTypeExecutable; |
+ if (ffi.dwFileType == VFT_DLL) |
+ return ModuleSnapshot::kModuleTypeSharedLibrary; |
+ if (ffi.dwFileType == VFT_DRV || ffi.dwFileType == VFT_VXD) |
+ return ModuleSnapshot::kModuleTypeLoadableModule; |
+ } |
+ return ModuleSnapshot::kModuleTypeUnknown; |
} |
void ModuleSnapshotWin::UUID(crashpad::UUID* uuid) const { |