| OLD | NEW |
| 1 // Copyright 2015 The Crashpad Authors. All rights reserved. | 1 // Copyright 2015 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
| 13 // limitations under the License. | 13 // limitations under the License. |
| 14 | 14 |
| 15 #include "snapshot/win/system_snapshot_win.h" | 15 #include "snapshot/win/system_snapshot_win.h" |
| 16 | 16 |
| 17 #include <intrin.h> | 17 #include <intrin.h> |
| 18 #include <powrprof.h> | 18 #include <powrprof.h> |
| 19 #include <windows.h> | 19 #include <windows.h> |
| 20 #include <winnt.h> | 20 #include <winnt.h> |
| 21 | 21 |
| 22 #include <algorithm> | 22 #include <algorithm> |
| 23 #include <utility> | 23 #include <utility> |
| 24 #include <vector> | 24 #include <vector> |
| 25 | 25 |
| 26 #include "base/memory/scoped_ptr.h" | |
| 27 #include "base/numerics/safe_conversions.h" | 26 #include "base/numerics/safe_conversions.h" |
| 28 #include "base/strings/stringprintf.h" | 27 #include "base/strings/stringprintf.h" |
| 29 #include "base/strings/utf_string_conversions.h" | 28 #include "base/strings/utf_string_conversions.h" |
| 29 #include "util/win/module_version.h" |
| 30 | 30 |
| 31 namespace crashpad { | 31 namespace crashpad { |
| 32 | 32 |
| 33 namespace { | 33 namespace { |
| 34 | 34 |
| 35 //! \brief Gets a string representation for a VS_FIXEDFILEINFO.dwFileFlags | 35 //! \brief Gets a string representation for a VS_FIXEDFILEINFO.dwFileFlags |
| 36 //! value. | 36 //! value. |
| 37 std::string GetStringForFileFlags(uint32_t file_flags) { | 37 std::string GetStringForFileFlags(uint32_t file_flags) { |
| 38 std::string result; | 38 std::string result; |
| 39 DCHECK_EQ(file_flags & VS_FF_INFOINFERRED, 0u); | 39 DCHECK_EQ(file_flags & VS_FF_INFOINFERRED, 0u); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 | 88 |
| 89 // We use both GetVersionEx and VerQueryValue. GetVersionEx is not trustworthy | 89 // We use both GetVersionEx and VerQueryValue. GetVersionEx is not trustworthy |
| 90 // after Windows 8 (depending on the application manifest) so its data is used | 90 // after Windows 8 (depending on the application manifest) so its data is used |
| 91 // only to fill the os_server_ field, and the rest comes from the version | 91 // only to fill the os_server_ field, and the rest comes from the version |
| 92 // information stamped on kernel32.dll. | 92 // information stamped on kernel32.dll. |
| 93 OSVERSIONINFOEX version_info = {sizeof(version_info)}; | 93 OSVERSIONINFOEX version_info = {sizeof(version_info)}; |
| 94 if (!GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&version_info))) { | 94 if (!GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&version_info))) { |
| 95 PLOG(WARNING) << "GetVersionEx"; | 95 PLOG(WARNING) << "GetVersionEx"; |
| 96 } else { | 96 } else { |
| 97 const wchar_t kSystemDll[] = L"kernel32.dll"; | 97 const wchar_t kSystemDll[] = L"kernel32.dll"; |
| 98 DWORD size = GetFileVersionInfoSize(kSystemDll, nullptr); | 98 VS_FIXEDFILEINFO ffi; |
| 99 if (!size) { | 99 if (GetModuleVersionAndType(base::FilePath(kSystemDll), &ffi)) { |
| 100 PLOG(WARNING) << "GetFileVersionInfoSize"; | 100 std::string flags_string = GetStringForFileFlags(ffi.dwFileFlags); |
| 101 } else { | 101 os_server_ = version_info.wProductType != VER_NT_WORKSTATION; |
| 102 scoped_ptr<uint8_t[]> data(new uint8_t[size]); | 102 std::string os_name = GetStringForFileOS(ffi.dwFileOS); |
| 103 if (!GetFileVersionInfo(kSystemDll, 0, size, data.get())) { | 103 os_version_major_ = ffi.dwFileVersionMS >> 16; |
| 104 PLOG(WARNING) << "GetFileVersionInfo"; | 104 os_version_minor_ = ffi.dwFileVersionMS & 0xffff; |
| 105 } else { | 105 os_version_bugfix_ = ffi.dwFileVersionLS >> 16; |
| 106 VS_FIXEDFILEINFO* fixed_file_info; | 106 os_version_build_ = |
| 107 UINT size; | 107 base::StringPrintf("%d", ffi.dwFileVersionLS & 0xffff); |
| 108 if (!VerQueryValue(data.get(), | 108 os_version_full_ = base::StringPrintf( |
| 109 L"\\", | 109 "%s %d.%d.%d.%s%s", |
| 110 reinterpret_cast<void**>(&fixed_file_info), | 110 os_name.c_str(), |
| 111 &size)) { | 111 os_version_major_, |
| 112 PLOG(WARNING) << "VerQueryValue"; | 112 os_version_minor_, |
| 113 } else { | 113 os_version_bugfix_, |
| 114 uint32_t valid_flags = | 114 os_version_build_.c_str(), |
| 115 fixed_file_info->dwFileFlags & fixed_file_info->dwFileFlagsMask; | 115 flags_string.empty() ? "" : (std::string(" (") + flags_string + ")") |
| 116 std::string flags_string = GetStringForFileFlags(valid_flags); | 116 .c_str()); |
| 117 os_version_major_ = | |
| 118 (fixed_file_info->dwFileVersionMS & 0xffff0000) >> 16; | |
| 119 os_version_minor_ = fixed_file_info->dwFileVersionMS & 0xffff; | |
| 120 os_version_bugfix_ = | |
| 121 (fixed_file_info->dwFileVersionLS & 0xffff0000) >> 16; | |
| 122 os_version_build_ = base::StringPrintf( | |
| 123 "%d", fixed_file_info->dwFileVersionLS & 0xffff); | |
| 124 os_server_ = version_info.wProductType != VER_NT_WORKSTATION; | |
| 125 std::string os_name = GetStringForFileOS(fixed_file_info->dwFileOS); | |
| 126 os_version_full_ = base::StringPrintf( | |
| 127 "%s %d.%d.%d.%s%s", | |
| 128 os_name.c_str(), | |
| 129 os_version_major_, | |
| 130 os_version_minor_, | |
| 131 os_version_bugfix_, | |
| 132 os_version_build_.c_str(), | |
| 133 flags_string.empty() ? "" : (std::string(" (") + flags_string + | |
| 134 ")").c_str()); | |
| 135 } | |
| 136 } | |
| 137 } | 117 } |
| 138 } | 118 } |
| 139 | 119 |
| 140 INITIALIZATION_STATE_SET_VALID(initialized_); | 120 INITIALIZATION_STATE_SET_VALID(initialized_); |
| 141 } | 121 } |
| 142 | 122 |
| 143 CPUArchitecture SystemSnapshotWin::GetCPUArchitecture() const { | 123 CPUArchitecture SystemSnapshotWin::GetCPUArchitecture() const { |
| 144 INITIALIZATION_STATE_DCHECK_VALID(initialized_); | 124 INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
| 145 | 125 |
| 146 return process_reader_->Is64Bit() ? kCPUArchitectureX86_64 | 126 return process_reader_->Is64Bit() ? kCPUArchitectureX86_64 |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 *standard_offset_seconds = | 327 *standard_offset_seconds = |
| 348 (time_zone_information.Bias + time_zone_information.StandardBias) * -60; | 328 (time_zone_information.Bias + time_zone_information.StandardBias) * -60; |
| 349 *daylight_offset_seconds = | 329 *daylight_offset_seconds = |
| 350 (time_zone_information.Bias + time_zone_information.DaylightBias) * -60; | 330 (time_zone_information.Bias + time_zone_information.DaylightBias) * -60; |
| 351 *standard_name = base::UTF16ToUTF8(time_zone_information.StandardName); | 331 *standard_name = base::UTF16ToUTF8(time_zone_information.StandardName); |
| 352 *daylight_name = base::UTF16ToUTF8(time_zone_information.DaylightName); | 332 *daylight_name = base::UTF16ToUTF8(time_zone_information.DaylightName); |
| 353 } | 333 } |
| 354 | 334 |
| 355 } // namespace internal | 335 } // namespace internal |
| 356 } // namespace crashpad | 336 } // namespace crashpad |
| OLD | NEW |