Index: third_party/crashpad/crashpad/util/win/initial_client_data.cc |
diff --git a/third_party/crashpad/crashpad/util/win/initial_client_data.cc b/third_party/crashpad/crashpad/util/win/initial_client_data.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cbeecf164ab81229710e4f1ed5d0e793cbbae9e4 |
--- /dev/null |
+++ b/third_party/crashpad/crashpad/util/win/initial_client_data.cc |
@@ -0,0 +1,113 @@ |
+// Copyright 2016 The Crashpad Authors. All rights reserved. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+ |
+#include "util/win/initial_client_data.h" |
+ |
+#include <vector> |
+ |
+#include "base/logging.h" |
+#include "base/strings/stringprintf.h" |
+#include "util/stdlib/string_number_conversion.h" |
+#include "util/string/split_string.h" |
+#include "util/win/handle.h" |
+ |
+namespace crashpad { |
+ |
+namespace { |
+ |
+bool HandleFromString(const std::string& str, HANDLE* handle) { |
+ unsigned int handle_uint; |
+ if (!StringToNumber(str, &handle_uint) || |
+ (*handle = IntToHandle(handle_uint)) == INVALID_HANDLE_VALUE) { |
+ LOG(ERROR) << "could not convert '" << str << "' to HANDLE"; |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+bool AddressFromString(const std::string& str, WinVMAddress* address) { |
+ if (!StringToNumber(str, address)) { |
+ LOG(ERROR) << "could not convert '" << str << "' to WinVMAddress"; |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+} // namespace |
+ |
+InitialClientData::InitialClientData() |
+ : crash_exception_information_(0), |
+ non_crash_exception_information_(0), |
+ debug_critical_section_address_(0), |
+ request_crash_dump_(nullptr), |
+ request_non_crash_dump_(nullptr), |
+ non_crash_dump_completed_(nullptr), |
+ first_pipe_instance_(INVALID_HANDLE_VALUE), |
+ client_process_(nullptr), |
+ is_valid_(false) {} |
+ |
+InitialClientData::InitialClientData( |
+ HANDLE request_crash_dump, |
+ HANDLE request_non_crash_dump, |
+ HANDLE non_crash_dump_completed, |
+ HANDLE first_pipe_instance, |
+ HANDLE client_process, |
+ WinVMAddress crash_exception_information, |
+ WinVMAddress non_crash_exception_information, |
+ WinVMAddress debug_critical_section_address) |
+ : crash_exception_information_(crash_exception_information), |
+ non_crash_exception_information_(non_crash_exception_information), |
+ debug_critical_section_address_(debug_critical_section_address), |
+ request_crash_dump_(request_crash_dump), |
+ request_non_crash_dump_(request_non_crash_dump), |
+ non_crash_dump_completed_(non_crash_dump_completed), |
+ first_pipe_instance_(first_pipe_instance), |
+ client_process_(client_process), |
+ is_valid_(true) {} |
+ |
+bool InitialClientData::InitializeFromString(const std::string& str) { |
+ std::vector<std::string> parts(SplitString(str, ',')); |
+ if (parts.size() != 8) { |
+ LOG(ERROR) << "expected 8 comma separated arguments"; |
+ return false; |
+ } |
+ |
+ if (!HandleFromString(parts[0], &request_crash_dump_) || |
+ !HandleFromString(parts[1], &request_non_crash_dump_) || |
+ !HandleFromString(parts[2], &non_crash_dump_completed_) || |
+ !HandleFromString(parts[3], &first_pipe_instance_) || |
+ !HandleFromString(parts[4], &client_process_) || |
+ !AddressFromString(parts[5], &crash_exception_information_) || |
+ !AddressFromString(parts[6], &non_crash_exception_information_) || |
+ !AddressFromString(parts[7], &debug_critical_section_address_)) { |
+ return false; |
+ } |
+ |
+ is_valid_ = true; |
+ return true; |
+} |
+ |
+std::string InitialClientData::StringRepresentation() const { |
+ return base::StringPrintf("0x%x,0x%x,0x%x,0x%x,0x%x,0x%I64x,0x%I64x,0x%I64x", |
+ HandleToInt(request_crash_dump_), |
+ HandleToInt(request_non_crash_dump_), |
+ HandleToInt(non_crash_dump_completed_), |
+ HandleToInt(first_pipe_instance_), |
+ HandleToInt(client_process_), |
+ crash_exception_information_, |
+ non_crash_exception_information_, |
+ debug_critical_section_address_); |
+} |
+ |
+} // namespace crashpad |