VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMainA-win.asm@ 69500

Last change on this file since 69500 was 69500, checked in by vboxsync, 7 years ago

*: scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.5 KB
Line 
1; $Id: SUPR3HardenedMainA-win.asm 69500 2017-10-28 15:14:05Z vboxsync $
2;; @file
3; VirtualBox Support Library - Hardened main(), Windows assembly bits.
4;
5
6;
7; Copyright (C) 2012-2017 Oracle Corporation
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17; The contents of this file may alternatively be used under the terms
18; of the Common Development and Distribution License Version 1.0
19; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20; VirtualBox OSE distribution, in which case the provisions of the
21; CDDL are applicable instead of those of the GPL.
22;
23; You may elect to license modified versions of this file under the
24; terms and conditions of either the GPL or the CDDL or both.
25;
26
27;*******************************************************************************
28;* Header Files *
29;*******************************************************************************
30%define RT_ASM_WITH_SEH64
31%include "iprt/asmdefs.mac"
32
33
34; External code.
35extern NAME(supR3HardenedEarlyProcessInit)
36
37
38BEGINCODE
39
40
41;;
42; Alternative code for LdrInitializeThunk that performs the early process startup
43; for the Stub and VM processes.
44;
45; This does not concern itself with any arguments on stack or in registers that
46; may be passed to the LdrIntializeThunk routine as we just save and restore
47; them all before we restart the restored LdrInitializeThunk routine.
48;
49; @sa supR3HardenedEarlyProcessInit
50;
51BEGINPROC supR3HardenedEarlyProcessInitThunk
52 ;
53 ; Prologue.
54 ;
55
56 ; Reserve space for the "return" address.
57 push 0
58
59 ; Create a stack frame, saving xBP.
60 push xBP
61 SEH64_PUSH_xBP
62 mov xBP, xSP
63 SEH64_SET_FRAME_xBP 0 ; probably wrong...
64
65 ; Save all volatile registers.
66 push xAX
67 push xCX
68 push xDX
69%ifdef RT_ARCH_AMD64
70 push r8
71 push r9
72 push r10
73 push r11
74%endif
75
76 ; Reserve spill space and align the stack.
77 sub xSP, 20h
78 and xSP, ~0fh
79 SEH64_END_PROLOGUE
80
81 ;
82 ; Call the C/C++ code that does the actual work. This returns the
83 ; resume address in xAX, which we put in the "return" stack position.
84 ;
85 call NAME(supR3HardenedEarlyProcessInit)
86 mov [xBP + xCB], xAX
87
88 ;
89 ; Restore volatile registers.
90 ;
91 mov xAX, [xBP - xCB*1]
92 mov xCX, [xBP - xCB*2]
93 mov xDX, [xBP - xCB*3]
94%ifdef RT_ARCH_AMD64
95 mov r8, [xBP - xCB*4]
96 mov r9, [xBP - xCB*5]
97 mov r10, [xBP - xCB*6]
98 mov r11, [xBP - xCB*7]
99%endif
100 ;
101 ; Use the leave instruction to restore xBP and set up xSP to point at
102 ; the resume address. Then use the 'ret' instruction to resume process
103 ; initializaton.
104 ;
105 leave
106 ret
107ENDPROC supR3HardenedEarlyProcessInitThunk
108
109
110
111;;
112; Composes a standard call name.
113%ifdef RT_ARCH_X86
114 %define SUPHNTIMP_STDCALL_NAME(a,b) _ %+ a %+ @ %+ b
115%else
116 %define SUPHNTIMP_STDCALL_NAME(a,b) NAME(a)
117%endif
118
119;; Concats two litterals.
120%define SUPHNTIMP_CONCAT(a,b) a %+ b
121
122
123;;
124; Import data and code for an API call.
125;
126; @param 1 The plain API name.
127; @param 2 The parameter frame size on x86. Multiple of dword.
128; @param 3 Non-zero expression if system call.
129; @param 4 Non-zero expression if early available call
130;
131%define SUPHNTIMP_SYSCALL 1
132%macro SupHardNtImport 4
133 ;
134 ; The data.
135 ;
136BEGINDATA
137global __imp_ %+ SUPHNTIMP_STDCALL_NAME(%1,%2) ; The import name used via dllimport.
138__imp_ %+ SUPHNTIMP_STDCALL_NAME(%1,%2):
139GLOBALNAME g_pfn %+ %1 ; The name we like to refer to.
140 RTCCPTR_DEF 0
141%if %3
142GLOBALNAME g_uApiNo %+ %1
143 RTCCPTR_DEF 0
144%endif
145
146 ;
147 ; The code: First a call stub.
148 ;
149BEGINCODE
150global SUPHNTIMP_STDCALL_NAME(%1, %2)
151SUPHNTIMP_STDCALL_NAME(%1, %2):
152 jmp RTCCPTR_PRE [NAME(g_pfn %+ %1) xWrtRIP]
153
154%if %3
155 ;
156 ; Make system calls.
157 ;
158 %ifdef RT_ARCH_AMD64
159BEGINPROC %1 %+ _SyscallType1
160 SEH64_END_PROLOGUE
161 mov eax, [NAME(g_uApiNo %+ %1) xWrtRIP]
162 mov r10, rcx
163 syscall
164 ret
165ENDPROC %1 %+ _SyscallType1
166BEGINPROC %1 %+ _SyscallType2 ; Introduced with build 10525
167 SEH64_END_PROLOGUE
168 mov eax, [NAME(g_uApiNo %+ %1) xWrtRIP]
169 test byte [07ffe0308h], 1 ; SharedUserData!Something
170 mov r10, rcx
171 jnz .int_alternative
172 syscall
173 ret
174.int_alternative:
175 int 2eh
176 ret
177ENDPROC %1 %+ _SyscallType2
178 %else
179BEGINPROC %1 %+ _SyscallType1
180 mov edx, 07ffe0300h ; SharedUserData!SystemCallStub
181 mov eax, [NAME(g_uApiNo %+ %1) xWrtRIP]
182 call dword [edx]
183 ret %2
184ENDPROC %1 %+ _SyscallType1
185BEGINPROC %1 %+ _SyscallType2
186 push .return
187 mov edx, esp
188 mov eax, [NAME(g_uApiNo %+ %1) xWrtRIP]
189 sysenter
190 add esp, 4
191.return:
192 ret %2
193ENDPROC %1 %+ _SyscallType2
194 %endif
195%endif
196
197%if %4 == 0
198global NAME(SUPHNTIMP_CONCAT(%1,_Early))
199NAME(SUPHNTIMP_CONCAT(%1,_Early)):
200 int3
201 %ifdef RT_ARCH_AMD64
202 ret
203 %else
204 ret %2
205 %endif
206%endif
207%endmacro
208
209%define SUPHARNT_COMMENT(a_Comment)
210%define SUPHARNT_IMPORT_SYSCALL(a_Name, a_cbParamsX86) SupHardNtImport a_Name, a_cbParamsX86, SUPHNTIMP_SYSCALL, 1
211%define SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86) SupHardNtImport a_Name, a_cbParamsX86, 0, 0
212%define SUPHARNT_IMPORT_STDCALL_OPTIONAL(a_Name, a_cbParamsX86) SUPHARNT_IMPORT_STDCALL(a_Name, a_cbParamsX86)
213%define SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86) SupHardNtImport a_Name, a_cbParamsX86, 0, 1
214%define SUPHARNT_IMPORT_STDCALL_EARLY_OPTIONAL(a_Name, a_cbParamsX86) SUPHARNT_IMPORT_STDCALL_EARLY(a_Name, a_cbParamsX86)
215%include "import-template-ntdll.h"
216%include "import-template-kernel32.h"
217
218
219;
220; For simplified LdrLoadDll patching we define a special writable, readable and
221; exectuable section of 4KB where we can put jump back code.
222;
223section .rwxpg bss execute read write align=4096
224GLOBALNAME g_abSupHardReadWriteExecPage
225 resb 4096
226
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette