admin
2023-03-07 8b06b1cbf112d55307ea8a6efe711db4e7506d89
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
; 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