| Index: third_party/breakpad/src/client/windows/crash_generation/client_info.cc
|
| diff --git a/third_party/breakpad/src/client/windows/crash_generation/client_info.cc b/third_party/breakpad/src/client/windows/crash_generation/client_info.cc
|
| deleted file mode 100644
|
| index 94f9c3cdcab99498103191863218f6cb8245a6ab..0000000000000000000000000000000000000000
|
| --- a/third_party/breakpad/src/client/windows/crash_generation/client_info.cc
|
| +++ /dev/null
|
| @@ -1,200 +0,0 @@
|
| -// Copyright (c) 2008, Google Inc.
|
| -// All rights reserved.
|
| -//
|
| -// Redistribution and use in source and binary forms, with or without
|
| -// modification, are permitted provided that the following conditions are
|
| -// met:
|
| -//
|
| -// * Redistributions of source code must retain the above copyright
|
| -// notice, this list of conditions and the following disclaimer.
|
| -// * Redistributions in binary form must reproduce the above
|
| -// copyright notice, this list of conditions and the following disclaimer
|
| -// in the documentation and/or other materials provided with the
|
| -// distribution.
|
| -// * Neither the name of Google Inc. nor the names of its
|
| -// contributors may be used to endorse or promote products derived from
|
| -// this software without specific prior written permission.
|
| -//
|
| -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -
|
| -#include "client/windows/crash_generation/client_info.h"
|
| -#include "client/windows/common/ipc_protocol.h"
|
| -
|
| -static const wchar_t kCustomInfoProcessUptimeName[] = L"ptime";
|
| -
|
| -namespace google_breakpad {
|
| -
|
| -ClientInfo::ClientInfo(CrashGenerationServer* crash_server,
|
| - DWORD pid,
|
| - MINIDUMP_TYPE dump_type,
|
| - DWORD* thread_id,
|
| - EXCEPTION_POINTERS** ex_info,
|
| - MDRawAssertionInfo* assert_info,
|
| - const CustomClientInfo& custom_client_info)
|
| - : crash_server_(crash_server),
|
| - pid_(pid),
|
| - dump_type_(dump_type),
|
| - ex_info_(ex_info),
|
| - assert_info_(assert_info),
|
| - custom_client_info_(custom_client_info),
|
| - thread_id_(thread_id),
|
| - process_handle_(NULL),
|
| - dump_requested_handle_(NULL),
|
| - dump_generated_handle_(NULL),
|
| - dump_request_wait_handle_(NULL),
|
| - process_exit_wait_handle_(NULL) {
|
| - GetSystemTimeAsFileTime(&start_time_);
|
| -}
|
| -
|
| -bool ClientInfo::Initialize() {
|
| - process_handle_ = OpenProcess(GENERIC_ALL, FALSE, pid_);
|
| - if (!process_handle_) {
|
| - return false;
|
| - }
|
| -
|
| - dump_requested_handle_ = CreateEvent(NULL, // Security attributes.
|
| - TRUE, // Manual reset.
|
| - FALSE, // Initial state.
|
| - NULL); // Name.
|
| - if (!dump_requested_handle_) {
|
| - return false;
|
| - }
|
| -
|
| - dump_generated_handle_ = CreateEvent(NULL, // Security attributes.
|
| - TRUE, // Manual reset.
|
| - FALSE, // Initial state.
|
| - NULL); // Name.
|
| - return dump_generated_handle_ != NULL;
|
| -}
|
| -
|
| -ClientInfo::~ClientInfo() {
|
| - if (dump_request_wait_handle_) {
|
| - // Wait for callbacks that might already be running to finish.
|
| - UnregisterWaitEx(dump_request_wait_handle_, INVALID_HANDLE_VALUE);
|
| - }
|
| -
|
| - if (process_exit_wait_handle_) {
|
| - // Wait for the callback that might already be running to finish.
|
| - UnregisterWaitEx(process_exit_wait_handle_, INVALID_HANDLE_VALUE);
|
| - }
|
| -
|
| - if (process_handle_) {
|
| - CloseHandle(process_handle_);
|
| - }
|
| -
|
| - if (dump_requested_handle_) {
|
| - CloseHandle(dump_requested_handle_);
|
| - }
|
| -
|
| - if (dump_generated_handle_) {
|
| - CloseHandle(dump_generated_handle_);
|
| - }
|
| -}
|
| -
|
| -void ClientInfo::UnregisterWaits() {
|
| - if (dump_request_wait_handle_) {
|
| - UnregisterWait(dump_request_wait_handle_);
|
| - dump_request_wait_handle_ = NULL;
|
| - }
|
| -
|
| - if (process_exit_wait_handle_) {
|
| - UnregisterWait(process_exit_wait_handle_);
|
| - process_exit_wait_handle_ = NULL;
|
| - }
|
| -}
|
| -
|
| -bool ClientInfo::GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const {
|
| - SIZE_T bytes_count = 0;
|
| - if (!ReadProcessMemory(process_handle_,
|
| - ex_info_,
|
| - ex_info,
|
| - sizeof(*ex_info),
|
| - &bytes_count)) {
|
| - return false;
|
| - }
|
| -
|
| - return bytes_count == sizeof(*ex_info);
|
| -}
|
| -
|
| -bool ClientInfo::GetClientThreadId(DWORD* thread_id) const {
|
| - SIZE_T bytes_count = 0;
|
| - if (!ReadProcessMemory(process_handle_,
|
| - thread_id_,
|
| - thread_id,
|
| - sizeof(*thread_id),
|
| - &bytes_count)) {
|
| - return false;
|
| - }
|
| -
|
| - return bytes_count == sizeof(*thread_id);
|
| -}
|
| -
|
| -void ClientInfo::SetProcessUptime() {
|
| - FILETIME now = {0};
|
| - GetSystemTimeAsFileTime(&now);
|
| -
|
| - ULARGE_INTEGER time_start;
|
| - time_start.HighPart = start_time_.dwHighDateTime;
|
| - time_start.LowPart = start_time_.dwLowDateTime;
|
| -
|
| - ULARGE_INTEGER time_now;
|
| - time_now.HighPart = now.dwHighDateTime;
|
| - time_now.LowPart = now.dwLowDateTime;
|
| -
|
| - // Calculate the delay and convert it from 100-nanoseconds to milliseconds.
|
| - __int64 delay = (time_now.QuadPart - time_start.QuadPart) / 10 / 1000;
|
| -
|
| - // Convert it to a string.
|
| - wchar_t* value = custom_info_entries_.get()[custom_client_info_.count].value;
|
| - _i64tow_s(delay, value, CustomInfoEntry::kValueMaxLength, 10);
|
| -}
|
| -
|
| -bool ClientInfo::PopulateCustomInfo() {
|
| - SIZE_T bytes_count = 0;
|
| - SIZE_T read_count = sizeof(CustomInfoEntry) * custom_client_info_.count;
|
| -
|
| - // If the scoped array for custom info already has an array, it will be
|
| - // the same size as what we need. This is because the number of custom info
|
| - // entries is always the same. So allocate memory only if scoped array has
|
| - // a NULL pointer.
|
| - if (!custom_info_entries_.get()) {
|
| - // Allocate an extra entry for reporting uptime for the client process.
|
| - custom_info_entries_.reset(
|
| - new CustomInfoEntry[custom_client_info_.count + 1]);
|
| - // Use the last element in the array for uptime.
|
| - custom_info_entries_.get()[custom_client_info_.count].set_name(
|
| - kCustomInfoProcessUptimeName);
|
| - }
|
| -
|
| - if (!ReadProcessMemory(process_handle_,
|
| - custom_client_info_.entries,
|
| - custom_info_entries_.get(),
|
| - read_count,
|
| - &bytes_count)) {
|
| - return false;
|
| - }
|
| -
|
| - SetProcessUptime();
|
| - return (bytes_count != read_count);
|
| -}
|
| -
|
| -CustomClientInfo ClientInfo::GetCustomInfo() const {
|
| - CustomClientInfo custom_info;
|
| - custom_info.entries = custom_info_entries_.get();
|
| - // Add 1 to the count from the client process to account for extra entry for
|
| - // process uptime.
|
| - custom_info.count = custom_client_info_.count + 1;
|
| - return custom_info;
|
| -}
|
| -
|
| -} // namespace google_breakpad
|
|
|