crashpad/handler/win/wer/crashpad_wer_main.cc
Alan Zhao 54da37c2d2 Remove std::vector from crashpad_wer
When assertions were enabled in Chrome in https://crrev.com/c/3833545,
crashpad_wer now requires libc++ to be explicitly included if compiled
with -std=c++20 because <vector> would now reference symbols defined
outside the libc++ headers. We attempted to add libc++ as a dependency
in https://crrev.com/c/3862974; however, that was deemed unacceptable
because the library needs to be kept small in order for Windows to load
it to handle crashes. Therefore, the only alternative is to update the
library to remove std::vector

Bug: chromium:1357827
Change-Id: I1494204a7bd679fa1632a0f08597cb7e93267196
Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/3864248
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
Commit-Queue: Alan Zhao <ayzhao@google.com>
2022-08-30 20:51:37 +00:00

87 lines
2.8 KiB
C++

// Copyright 2022 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.
// See:
// https://docs.microsoft.com/en-us/windows/win32/api/werapi/nf-werapi-werregisterruntimeexceptionmodule
#include "handler/win/wer/crashpad_wer.h"
#include <Windows.h>
#include <werapi.h>
// Functions that will be exported from the DLL.
extern "C" {
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) {
return true;
}
// PFN_WER_RUNTIME_EXCEPTION_EVENT
// pContext is the address of a crashpad::internal::WerRegistration in the
// target process.
HRESULT OutOfProcessExceptionEventCallback(
PVOID pContext,
const PWER_RUNTIME_EXCEPTION_INFORMATION pExceptionInformation,
BOOL* pbOwnershipClaimed,
PWSTR pwszEventName,
PDWORD pchSize,
PDWORD pdwSignatureCount) {
DWORD wanted_exceptions[] = {
0xC0000602, // STATUS_FAIL_FAST_EXCEPTION
0xC0000409, // STATUS_STACK_BUFFER_OVERRUN
};
// Default to not-claiming as bailing out is easier.
*pbOwnershipClaimed = FALSE;
bool result =
crashpad::wer::ExceptionEvent(wanted_exceptions,
sizeof(wanted_exceptions) / sizeof(DWORD),
pContext,
pExceptionInformation);
if (result) {
*pbOwnershipClaimed = TRUE;
// Technically we failed as we terminated the process.
return E_FAIL;
}
// Pass.
return S_OK;
}
// PFN_WER_RUNTIME_EXCEPTION_EVENT_SIGNATURE
HRESULT OutOfProcessExceptionEventSignatureCallback(
PVOID pContext,
const PWER_RUNTIME_EXCEPTION_INFORMATION pExceptionInformation,
DWORD dwIndex,
PWSTR pwszName,
PDWORD pchName,
PWSTR pwszValue,
PDWORD pchValue) {
// We handle everything in the call to OutOfProcessExceptionEventCallback.
// This function should never be called.
return E_FAIL;
}
// PFN_WER_RUNTIME_EXCEPTION_DEBUGGER_LAUNCH
HRESULT OutOfProcessExceptionEventDebuggerLaunchCallback(
PVOID pContext,
const PWER_RUNTIME_EXCEPTION_INFORMATION pExceptionInformation,
PBOOL pbIsCustomDebugger,
PWSTR pwszDebuggerLaunch,
PDWORD pchDebuggerLaunch,
PBOOL pbIsDebuggerAutolaunch) {
// We handle everything in the call to OutOfProcessExceptionEventCallback.
// This function should never be called.
return E_FAIL;
}
} // extern "C"