mirror of
https://github.com/chromium/crashpad.git
synced 2025-01-17 21:08:21 +08:00
d1e49bd221
I thought I had confirmed that this still allocated and ignored the flag on older OSs, but I must have not had the PLOG active yet? I'm not sure what I did. (I might try to blame VMware as it has an annoying habit of caching old binaries when you use it's "Shared Folders" feature to point at the dev machine's build dir.) I confirmed that it does work on Win8 and Win10 but doesn't on Win XP and Win 7. R=mark@chromium.org BUG=crashpad:52 Review URL: https://codereview.chromium.org/1405243002 .
139 lines
4.9 KiB
C++
139 lines
4.9 KiB
C++
// Copyright 2015 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.
|
|
|
|
#ifndef CRASHPAD_UTIL_WIN_REGISTRATION_PROTOCOL_WIN_H_
|
|
#define CRASHPAD_UTIL_WIN_REGISTRATION_PROTOCOL_WIN_H_
|
|
|
|
#include <windows.h>
|
|
#include <stdint.h>
|
|
|
|
#include "base/strings/string16.h"
|
|
#include "util/win/address_types.h"
|
|
|
|
namespace crashpad {
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
//! \brief Structure read out of the client process by the crash handler when an
|
|
//! exception occurs.
|
|
struct ExceptionInformation {
|
|
//! \brief The address of an EXCEPTION_POINTERS structure in the client
|
|
//! process that describes the exception.
|
|
WinVMAddress exception_pointers;
|
|
|
|
//! \brief The thread on which the exception happened.
|
|
DWORD thread_id;
|
|
};
|
|
|
|
//! \brief A client registration request.
|
|
struct RegistrationRequest {
|
|
//! \brief The expected value of `version`. This should be changed whenever
|
|
//! the messages or ExceptionInformation are modified incompatibly.
|
|
enum { kMessageVersion = 1 };
|
|
|
|
//! \brief Version field to detect skew between client and server. Should be
|
|
//! set to kMessageVersion.
|
|
int version;
|
|
|
|
//! \brief The PID of the client process.
|
|
DWORD client_process_id;
|
|
|
|
//! \brief The address, in the client process's address space, of an
|
|
//! ExceptionInformation structure, used when handling a crash dump
|
|
//! request.
|
|
WinVMAddress crash_exception_information;
|
|
|
|
//! \brief The address, in the client process's address space, of an
|
|
//! ExceptionInformation structure, used when handling a non-crashing dump
|
|
//! request.
|
|
WinVMAddress non_crash_exception_information;
|
|
|
|
//! \brief The address, in the client process's address space, of a
|
|
//! `CRITICAL_SECTION` allocated with a valid .DebugInfo field. This can
|
|
//! be accomplished by using
|
|
//! InitializeCriticalSectionWithDebugInfoIfPossible() or equivalent. This
|
|
//! value can be `0`, however then limited lock data will be available in
|
|
//! minidumps.
|
|
WinVMAddress critical_section_address;
|
|
};
|
|
|
|
//! \brief A message only sent to the server by itself to trigger shutdown.
|
|
struct ShutdownRequest {
|
|
//! \brief A randomly generated token used to validate the the shutdown
|
|
//! request was not sent from another process.
|
|
uint64_t token;
|
|
};
|
|
|
|
//! \brief The message passed from client to server by
|
|
//! SendToCrashHandlerServer().
|
|
struct ClientToServerMessage {
|
|
//! \brief Indicates which field of the union is in use.
|
|
enum Type : uint32_t {
|
|
//! \brief For RegistrationRequest.
|
|
kRegister,
|
|
//! \brief For ShutdownRequest.
|
|
kShutdown,
|
|
} type;
|
|
|
|
union {
|
|
RegistrationRequest registration;
|
|
ShutdownRequest shutdown;
|
|
};
|
|
};
|
|
|
|
//! \brief A client registration response.
|
|
//!
|
|
//! See <a
|
|
//! href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa384203">Interprocess
|
|
//! Communication Between 32-bit and 64-bit Applications</a> for details on
|
|
//! communicating handle values between processes of varying bitness.
|
|
struct RegistrationResponse {
|
|
//! \brief An event `HANDLE`, valid in the client process, that should be
|
|
//! signaled to request a crash report. 64-bit clients should convert the
|
|
//! value to a `HANDLE` using sign-extension.
|
|
uint32_t request_crash_dump_event;
|
|
|
|
//! \brief An event `HANDLE`, valid in the client process, that should be
|
|
//! signaled to request a non-crashing dump be taken. 64-bit clients
|
|
//! should convert the value to `HANDLEEE` using sign-extension.
|
|
uint32_t request_non_crash_dump_event;
|
|
|
|
//! \brief An event `HANDLE`, valid in the client process, that will be
|
|
//! signaled by the server when the non-crashing dump is complete. 64-bit
|
|
//! clients should convert the value to `HANDLEEE` using sign-extension.
|
|
uint32_t non_crash_dump_completed_event;
|
|
};
|
|
|
|
//! \brief The response sent back to the client via SendToCrashHandlerServer().
|
|
union ServerToClientMessage {
|
|
RegistrationResponse registration;
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
//! \brief Connect over the given \a pipe_name, passing \a message to the
|
|
//! server, storing the server's reply into \a response.
|
|
//!
|
|
//! Typically clients will not use this directly, instead using
|
|
//! CrashpadClient::SetHandler().
|
|
//!
|
|
//! \sa CrashpadClient::SetHandler()
|
|
bool SendToCrashHandlerServer(const base::string16& pipe_name,
|
|
const ClientToServerMessage& message,
|
|
ServerToClientMessage* response);
|
|
|
|
} // namespace crashpad
|
|
|
|
#endif // CRASHPAD_UTIL_WIN_REGISTRATION_PROTOCOL_WIN_H_
|