diff --git a/client/crash_report_database_win.cc b/client/crash_report_database_win.cc index 28a64bc9..6dbaf0ea 100644 --- a/client/crash_report_database_win.cc +++ b/client/crash_report_database_win.cc @@ -576,12 +576,9 @@ OperationStatus CrashReportDatabaseWin::PrepareNewCrashReport( ::UUID system_uuid; if (UuidCreate(&system_uuid) != RPC_S_OK) return kFileSystemError; - static_assert(sizeof(system_uuid) == 16, "unexpected system uuid size"); - static_assert(offsetof(::UUID, Data1) == 0, "unexpected uuid layout"); scoped_ptr new_report(new NewReport()); - new_report->uuid.InitializeFromBytes( - reinterpret_cast(&system_uuid.Data1)); + new_report->uuid.InitializeFromSystemUUID(&system_uuid); new_report->path = base_dir_.Append(kReportsDirectory) .Append(new_report->uuid.ToString16() + L"." + kCrashReportFileExtension); diff --git a/util/misc/uuid.cc b/util/misc/uuid.cc index 967ee224..904efcd3 100644 --- a/util/misc/uuid.cc +++ b/util/misc/uuid.cc @@ -88,6 +88,16 @@ bool UUID::InitializeFromString(const base::StringPiece& string) { return true; } +#if defined(OS_WIN) +void UUID::InitializeFromSystemUUID(const ::UUID* system_uuid) { + static_assert(sizeof(::UUID) == sizeof(UUID), + "unexpected system uuid size"); + static_assert(offsetof(::UUID, Data1) == offsetof(UUID, data_1), + "unexpected system uuid layout"); + memcpy(this, system_uuid, sizeof(::UUID)); +} +#endif // OS_WIN + std::string UUID::ToString() const { return base::StringPrintf("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", data_1, diff --git a/util/misc/uuid.h b/util/misc/uuid.h index b1b830d9..29b36bc0 100644 --- a/util/misc/uuid.h +++ b/util/misc/uuid.h @@ -23,6 +23,10 @@ #include "base/strings/string_piece.h" #include "build/build_config.h" +#if defined(OS_WIN) +#include +#endif + namespace crashpad { //! \brief A universally unique identifier (%UUID). @@ -63,12 +67,19 @@ struct UUID { //! parsed, with the object state untouched. bool InitializeFromString(const base::StringPiece& string); +#if defined(OS_WIN) || DOXYGEN + //! \brief Initializes the %UUID from a system `UUID` or `GUID` structure. + //! + //! \param[in] system_uuid A system `UUID` or `GUID` structure. + void InitializeFromSystemUUID(const ::UUID* system_uuid); +#endif // OS_WIN + //! \brief Formats the %UUID per RFC 4122 ยง3. //! //! \return A string of the form `"00112233-4455-6677-8899-aabbccddeeff"`. std::string ToString() const; -#if defined(OS_WIN) +#if defined(OS_WIN) || DOXYGEN //! \brief The same as ToString, but returned as a string16. base::string16 ToString16() const; #endif // OS_WIN diff --git a/util/misc/uuid_test.cc b/util/misc/uuid_test.cc index 01f3b6a5..0d08b22c 100644 --- a/util/misc/uuid_test.cc +++ b/util/misc/uuid_test.cc @@ -20,6 +20,7 @@ #include "base/basictypes.h" #include "base/format_macros.h" +#include "base/scoped_generic.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" @@ -204,6 +205,33 @@ TEST(UUID, FromString) { EXPECT_EQ("5762c15d-50b5-4171-a2e9-7429c9ec6cab", uuid.ToString()); } +#if defined(OS_WIN) + +TEST(UUID, FromSystem) { + ::GUID system_uuid; + ASSERT_EQ(RPC_S_OK, UuidCreate(&system_uuid)); + + UUID uuid; + uuid.InitializeFromSystemUUID(&system_uuid); + + RPC_WSTR system_string; + ASSERT_EQ(RPC_S_OK, UuidToString(&system_uuid, &system_string)); + + struct ScopedRpcStringFreeTraits { + static RPC_WSTR* InvalidValue() { return nullptr; } + static void Free(RPC_WSTR* rpc_string) { + EXPECT_EQ(RPC_S_OK, RpcStringFree(rpc_string)); + } + }; + using ScopedRpcString = + base::ScopedGeneric; + ScopedRpcString scoped_system_string(&system_string); + + EXPECT_EQ(reinterpret_cast(system_string), uuid.ToString16()); +} + +#endif // OS_WIN + } // namespace } // namespace test } // namespace crashpad diff --git a/util/util.gyp b/util/util.gyp index f5a22f5e..aea75269 100644 --- a/util/util.gyp +++ b/util/util.gyp @@ -208,6 +208,7 @@ ['OS=="win"', { 'link_settings': { 'libraries': [ + '-lrpcrt4.lib', '-lwinhttp.lib', ], },