mirror of
https://github.com/chromium/crashpad.git
synced 2025-03-09 22:26:06 +00:00
win: Use inline asm instead of ml.exe for SafeTerminateProcess()
This upstreams
912c9907d5
(slightly modified).
Bug: chromium:762167
Change-Id: I69c605f693da8691d32222b5617f62637c1c2dcd
Reviewed-on: https://chromium-review.googlesource.com/734100
Reviewed-by: Mark Mentovai <mark@chromium.org>
Commit-Queue: Mark Mentovai <mark@chromium.org>
This commit is contained in:
parent
ce084d37c8
commit
55133d332b
@ -245,7 +245,7 @@
|
||||
'win/process_structs.h',
|
||||
'win/registration_protocol_win.cc',
|
||||
'win/registration_protocol_win.h',
|
||||
'win/safe_terminate_process.asm',
|
||||
'win/safe_terminate_process.cc',
|
||||
'win/safe_terminate_process.h',
|
||||
'win/scoped_handle.cc',
|
||||
'win/scoped_handle.h',
|
||||
@ -355,7 +355,6 @@
|
||||
}, { # else: OS!="win"
|
||||
'sources!': [
|
||||
'win/capture_context.asm',
|
||||
'win/safe_terminate_process.asm',
|
||||
],
|
||||
}],
|
||||
['OS=="linux"', {
|
||||
|
@ -1,74 +0,0 @@
|
||||
; Copyright 2017 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.
|
||||
|
||||
; Detect ml64 assembling for x86_64 by checking for rax.
|
||||
ifdef rax
|
||||
_M_X64 equ 1
|
||||
else
|
||||
_M_IX86 equ 1
|
||||
endif
|
||||
|
||||
ifdef _M_IX86
|
||||
.586
|
||||
.xmm
|
||||
.model flat
|
||||
|
||||
includelib kernel32.lib
|
||||
|
||||
extern __imp__TerminateProcess@8:proc
|
||||
|
||||
; namespace crashpad {
|
||||
; bool SafeTerminateProcess(HANDLE process, UINT exit_code);
|
||||
; } // namespace crashpad
|
||||
SAFETERMINATEPROCESS_SYMBOL equ ?SafeTerminateProcess@crashpad@@YA_NPAXI@Z
|
||||
|
||||
_TEXT segment
|
||||
public SAFETERMINATEPROCESS_SYMBOL
|
||||
|
||||
SAFETERMINATEPROCESS_SYMBOL proc
|
||||
|
||||
; This function is written in assembler source because it’s important for it
|
||||
; to not be inlined, for it to allocate a stack frame, and most critically,
|
||||
; for it to not trust esp on return from TerminateProcess().
|
||||
; __declspec(noinline) can prevent inlining and #pragma optimize("y", off) can
|
||||
; disable frame pointer omission, but there’s no way to force a C compiler to
|
||||
; distrust esp, and even if there was a way, it’d probably be fragile.
|
||||
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
|
||||
push [ebp+12]
|
||||
push [ebp+8]
|
||||
call dword ptr [__imp__TerminateProcess@8]
|
||||
|
||||
; Convert from BOOL to bool.
|
||||
test eax, eax
|
||||
setne al
|
||||
|
||||
; TerminateProcess() is supposed to be stdcall (callee clean-up), and esp and
|
||||
; ebp are expected to already be equal. But if it’s been patched badly by
|
||||
; something that’s cdecl (caller clean-up), this next move will get things
|
||||
; back on track.
|
||||
mov esp, ebp
|
||||
pop ebp
|
||||
|
||||
ret
|
||||
|
||||
SAFETERMINATEPROCESS_SYMBOL endp
|
||||
|
||||
_TEXT ends
|
||||
|
||||
endif
|
||||
|
||||
end
|
51
util/win/safe_terminate_process.cc
Normal file
51
util/win/safe_terminate_process.cc
Normal file
@ -0,0 +1,51 @@
|
||||
// Copyright 2017 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/safe_terminate_process.h"
|
||||
|
||||
#if defined(ARCH_CPU_X86)
|
||||
|
||||
namespace crashpad {
|
||||
|
||||
// This function is written in assembler source because it’s important for it to
|
||||
// not be inlined, for it to allocate a stack frame, and most critically, for it
|
||||
// to not trust esp on return from TerminateProcess(). __declspec(naked)
|
||||
// conveniently prevents inlining and allows control of stack layout.
|
||||
__declspec(naked) bool SafeTerminateProcess(HANDLE process, UINT exit_code) {
|
||||
__asm {
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
|
||||
push [ebp+12]
|
||||
push [ebp+8]
|
||||
call TerminateProcess
|
||||
|
||||
// Convert from BOOL to bool.
|
||||
test eax, eax
|
||||
setne al
|
||||
|
||||
// TerminateProcess() is supposed to be stdcall (callee clean-up), and esp
|
||||
// and ebp are expected to already be equal. But if it’s been patched badly
|
||||
// by something that’s cdecl (caller clean-up), this next move will get
|
||||
// things back on track.
|
||||
mov esp, ebp
|
||||
pop ebp
|
||||
|
||||
ret
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace crashpad
|
||||
|
||||
#endif // defined(ARCH_CPU_X86)
|
Loading…
x
Reference in New Issue
Block a user