SUPDrvA-win.asm revision 68e7d9bfd20097a7a9a84f305c78f4e312bbc34d
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; $Id$
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;; @file
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; VirtualBox Support Driver - Windows NT specific assembly parts.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; Copyright (C) 2006-2007 Sun Microsystems, Inc.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; available from http://www.virtualbox.org. This file is free software;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; you can redistribute it and/or modify it under the terms of the GNU
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; General Public License (GPL) as published by the Free Software
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; The contents of this file may alternatively be used under the terms
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; of the Common Development and Distribution License Version 1.0
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; VirtualBox OSE distribution, in which case the provisions of the
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; CDDL are applicable instead of those of the GPL.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; You may elect to license modified versions of this file under the
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; terms and conditions of either the GPL or the CDDL or both.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; Clara, CA 95054 USA or visit http://www.sun.com if you need
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; additional information or have any questions.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync
5a5b5956f8b592c807c94785d58c25e717d430c4vboxsync;*******************************************************************************
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;* Header Files *
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;*******************************************************************************
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync%include "iprt/asmdefs.mac"
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsync
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncBEGINCODE
5a5b5956f8b592c807c94785d58c25e717d430c4vboxsync%ifdef RT_ARCH_AMD64
e4bf6817370e1a71833a02285515694afcda7599vboxsync%define _DbgPrint DbgPrint
5a5b5956f8b592c807c94785d58c25e717d430c4vboxsync%endif
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncextern _DbgPrint
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; Kind of alias for DbgPrint
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncBEGINPROC AssertMsg2
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync jmp _DbgPrint
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncENDPROC AssertMsg2
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync;;
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync; Kind of alias for DbgPrint
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncBEGINPROC SUPR0Printf
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jmp _DbgPrint
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncENDPROC SUPR0Printf
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%ifdef SUPDRV_WITH_UNWIND_HACK
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync %ifdef RT_ARCH_AMD64
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Common prolog, take the proc name as argument.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; This creates a 0x80 byte stack frame.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%macro NtWrapProlog 1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync[proc_frame %1]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync push rbp
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync [pushreg rbp]
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync mov rbp, rsp
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync [setframe rbp, 0]
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync sub rsp, 0x80
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync [allocstack 0x80]
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ; save rdi and load rbp into it
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov [rbp - 8h], rdi
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync [savereg rdi, 0x78]
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync mov rdi, rbp
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync[endprolog]
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync%endmacro
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync;;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Common epilog, take the proc name as argument.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync%macro NtWrapEpilog 1
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ; restore rbp and rdi then return.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov rbp, rdi
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov rdi, [rdi - 8h]
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync leave
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ret
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync[endproc_frame %1]
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync%endmacro
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync;;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Create a stack marker with the rbp. The marker is 32 byte big.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; This is 32-byte aligned and 32 byte in size.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Trashes r10
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync%macro NtWrapCreateMarker 0
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync lea r10, [rbp - 30h]
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync and r10, ~1fh ; 32-byte align it.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov dword [r10 ], 0x20080901
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov dword [r10 + 04h], 0x20080902
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov qword [r10 + 08h], rbp
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov dword [r10 + 10h], 0x20080903
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov dword [r10 + 14h], 0x20080904
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov qword [r10 + 18h], rbp
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync%endmacro
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync;;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Destroys the stack marker.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Trashes r10
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync%macro NtWrapDestroyMarker 0
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync lea r10, [rbp - 30h]
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync and r10, ~1fh ; 32-byte align it.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov [r10 ], rbp
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov [r10 + 08h], rbp
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov [r10 + 10h], rbp
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov [r10 + 18h], rbp
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync%endmacro
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync;;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Find the stack marker with the rbp of the entry frame.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Search the current stack page inline, call a helper function
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; which does a safe search of any further stack pages.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Trashes rax, r10 and r11.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Modifies rbp
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync%macro NtWrapLocateMarker 0
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov rax, rbp
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync and rax, ~1fh ; 32-byte align it.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ; Calc remainig space in the current page. If we're on a
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ; page boundrary, we'll search the entire previous page.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov r10, rax
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync neg r10
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync and r10, 0fffh
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync inc r10
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync shr r10, 5 ; /= 32 bytes
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync jz %%not_found ; If zero, take the slow path
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync ;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync ; The search loop.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync ;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%%again:
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync dec r10
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync lea rax, [rax + 20h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jz %%not_found
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync cmp dword [rax ], 0x20080901
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync je %%candidate
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jmp %%again
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%%not_found:
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync call NAME(NtWrapLocateMarkerHelper)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jmp %%done
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%%candidate:
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync cmp dword [rax + 04h], 0x20080902
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jne %%again
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync cmp dword [rax + 10h], 0x20080903
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jne %%again
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync cmp dword [rax + 14h], 0x20080904
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jne %%again
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov r11, [rax + 08h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync cmp r11, [rax + 18h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jne %%again
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync ; found it, change rbp.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov rbp, r11
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%%done:
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%endmacro
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Wraps a function with 4 or less argument that will go into registers.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%macro NtWrapFunctionWithAllRegParams 1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncextern NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncBEGINPROC supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapProlog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapLocateMarker
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync call NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapEpilog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncENDPROC supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%endmacro
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Wraps a function with 5 argument, where the first 4 goes into registers.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%macro NtWrapFunctionWith5Params 1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncextern NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncBEGINPROC supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapProlog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapLocateMarker
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov r11, [rdi + 30h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov [rsp + 20h], r11
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync call NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapEpilog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncENDPROC supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%endmacro
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Wraps a function with 6 argument, where the first 4 goes into registers.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%macro NtWrapFunctionWith6Params 1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncextern NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncBEGINPROC supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapProlog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapLocateMarker
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov r11, [rdi + 30h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov [rsp + 20h], r11
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov r10, [rdi + 38h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov [rsp + 28h], r10
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync call NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapEpilog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncENDPROC supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%endmacro
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Wraps a function with 7 argument, where the first 4 goes into registers.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%macro NtWrapFunctionWith7Params 1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncextern NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncBEGINPROC supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapProlog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapLocateMarker
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov r11, [rdi + 30h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov [rsp + 20h], r11
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov r10, [rdi + 38h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov [rsp + 28h], r10
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov rax, [rdi + 40h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov [rsp + 30h], rax
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync call NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapEpilog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncENDPROC supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%endmacro
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncextern IoGetStackLimits
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Helper that cautiously continues the stack marker search
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; NtWrapLocateMarker started.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; The stack layout at the time is something like this.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; rbp+08h callers return address.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; rbp-00h saved rbp
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; rbp-08h saved rdi
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; rbp-09h
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; thru unused.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; rbp-80h
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; rbp-88h our return address.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; rbp-89h
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; thru callee register dump zone.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; rbp-a0h
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; @param rax Current stack location.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; @param rdi Parent stack frame pointer. (This should equal rbp on entry.)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Trashes: rax, r10, r11.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Will use the callers stack frame for register saving ASSUMING that
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; rbp-80h thru rbp-09h is unused.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Modifies: rbp
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncBEGINPROC NtWrapLocateMarkerHelper
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync ;
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync ; Prolog. Save volatile regs and reserve callee space.
e4bf6817370e1a71833a02285515694afcda7599vboxsync ;
e4bf6817370e1a71833a02285515694afcda7599vboxsync sub rsp, 20h ; For IoGetStackLimits().
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov [rdi - 80h], rax
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov [rdi - 78h], rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov [rdi - 70h], rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov [rdi - 68h], r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov [rdi - 60h], r9
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync ;
e4bf6817370e1a71833a02285515694afcda7599vboxsync ; Call VOID IoGetStackLimits(OUT PULONG_PTR LowLimit, OUT PULONG_PTR HighLimit);
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync ;
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync ; Use rdi-40h for the high limit and rdi-50h for the low one, we're only
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync ; interested in the high one.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync ;
e4bf6817370e1a71833a02285515694afcda7599vboxsync lea rcx, [rdi - 40h] ; arg #1 LowLimit
e4bf6817370e1a71833a02285515694afcda7599vboxsync lea rdx, [rdi - 50h] ; arg #2 HighLimit
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov [rdx], eax ; paranoia - init to end of current search.
e4bf6817370e1a71833a02285515694afcda7599vboxsync call IoGetStackLimits
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync ;
e4bf6817370e1a71833a02285515694afcda7599vboxsync ; Move the top address into r10, restore rax and continue
e4bf6817370e1a71833a02285515694afcda7599vboxsync ; the search. Check that r10 is less than 3 pages from rax.
e4bf6817370e1a71833a02285515694afcda7599vboxsync ;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync mov rax, [rdi - 80h] ; Restore eax (see prolog)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync mov r10, [rdi - 50h] ; HighLimit
5b0a093ca572a855886faa6747ad46df859dd041vboxsync and r10, ~1fh ; 32-byte align it (downwards)
5b0a093ca572a855886faa6747ad46df859dd041vboxsync sub r10, rax
5b0a093ca572a855886faa6747ad46df859dd041vboxsync jz .not_found ; If already at the top of the stack.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync cmp r10, 3000h
5b0a093ca572a855886faa6747ad46df859dd041vboxsync jae .out_of_bounds ; If too far away, something is busted.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync shr r10, 5 ; /= 32.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync ; The loop body.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync.search_loop:
5b0a093ca572a855886faa6747ad46df859dd041vboxsync cmp dword [rax ], 0x20080901
5b0a093ca572a855886faa6747ad46df859dd041vboxsync je .candidate
5b0a093ca572a855886faa6747ad46df859dd041vboxsync.continue_searching:
5b0a093ca572a855886faa6747ad46df859dd041vboxsync dec r10
5b0a093ca572a855886faa6747ad46df859dd041vboxsync jz .not_found
5b0a093ca572a855886faa6747ad46df859dd041vboxsync lea rax, [rax + 20h]
5b0a093ca572a855886faa6747ad46df859dd041vboxsync jmp .search_loop
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync ; Found the first marker, check for the rest.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync.candidate:
5b0a093ca572a855886faa6747ad46df859dd041vboxsync cmp dword [rax + 04h], 0x20080902
ad66a27959d7085aa31760f63ce082943be60e89vboxsync jne .continue_searching
ad66a27959d7085aa31760f63ce082943be60e89vboxsync cmp dword [rax + 10h], 0x20080903
ad66a27959d7085aa31760f63ce082943be60e89vboxsync jne .continue_searching
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync cmp dword [rax + 14h], 0x20080904
ad66a27959d7085aa31760f63ce082943be60e89vboxsync jne .continue_searching
ad66a27959d7085aa31760f63ce082943be60e89vboxsync mov r11, [rax + 08h]
ad66a27959d7085aa31760f63ce082943be60e89vboxsync cmp r11, [rax + 18h]
ad66a27959d7085aa31760f63ce082943be60e89vboxsync jne .continue_searching
ad66a27959d7085aa31760f63ce082943be60e89vboxsync
ad66a27959d7085aa31760f63ce082943be60e89vboxsync ; found it, change rbp.
ad66a27959d7085aa31760f63ce082943be60e89vboxsync mov rbp, r11
ad66a27959d7085aa31760f63ce082943be60e89vboxsync
ad66a27959d7085aa31760f63ce082943be60e89vboxsync ;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ; Restore registers and pop the stack frame.
ad66a27959d7085aa31760f63ce082943be60e89vboxsync ;
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync.epilog:
ad66a27959d7085aa31760f63ce082943be60e89vboxsync mov r9, [rdi - 60h]
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov r8, [rdi - 68h]
ad66a27959d7085aa31760f63ce082943be60e89vboxsync mov rdx, [rdi - 70h]
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync mov rcx, [rdi - 78h]
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync ; mov rax, [rdi - 80h]
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync add rsp, 20h
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync ret
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync ;
5b0a093ca572a855886faa6747ad46df859dd041vboxsync ; Needless to say, this isn't supposed to happen. Thus the int3.
ad66a27959d7085aa31760f63ce082943be60e89vboxsync ; Note down r10 and rax.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync ;
ad66a27959d7085aa31760f63ce082943be60e89vboxsync.out_of_bounds:
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync%ifdef DEBUG
5b0a093ca572a855886faa6747ad46df859dd041vboxsync int3
5b0a093ca572a855886faa6747ad46df859dd041vboxsync%endif
5b0a093ca572a855886faa6747ad46df859dd041vboxsync.not_found:
5b0a093ca572a855886faa6747ad46df859dd041vboxsync%ifdef DEBUG
ad66a27959d7085aa31760f63ce082943be60e89vboxsync int3
5b0a093ca572a855886faa6747ad46df859dd041vboxsync%endif
ad66a27959d7085aa31760f63ce082943be60e89vboxsync jmp .epilog
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncENDPROC NtWrapLocateMarkerHelper
ad66a27959d7085aa31760f63ce082943be60e89vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync
ad66a27959d7085aa31760f63ce082943be60e89vboxsync
5b0a093ca572a855886faa6747ad46df859dd041vboxsync;
ad66a27959d7085aa31760f63ce082943be60e89vboxsync; This has the same order as the list in SUPDrv.c
ad66a27959d7085aa31760f63ce082943be60e89vboxsync;
ad66a27959d7085aa31760f63ce082943be60e89vboxsyncNtWrapFunctionWithAllRegParams SUPR0ComponentRegisterFactory
ad66a27959d7085aa31760f63ce082943be60e89vboxsyncNtWrapFunctionWithAllRegParams SUPR0ComponentDeregisterFactory
ad66a27959d7085aa31760f63ce082943be60e89vboxsyncNtWrapFunctionWithAllRegParams SUPR0ComponentQueryFactory
ad66a27959d7085aa31760f63ce082943be60e89vboxsyncNtWrapFunctionWith5Params SUPR0ObjRegister
ad66a27959d7085aa31760f63ce082943be60e89vboxsyncNtWrapFunctionWithAllRegParams SUPR0ObjAddRef
ad66a27959d7085aa31760f63ce082943be60e89vboxsyncNtWrapFunctionWithAllRegParams SUPR0ObjRelease
e4bf6817370e1a71833a02285515694afcda7599vboxsyncNtWrapFunctionWithAllRegParams SUPR0ObjVerifyAccess
ad66a27959d7085aa31760f63ce082943be60e89vboxsyncNtWrapFunctionWithAllRegParams SUPR0LockMem
e4bf6817370e1a71833a02285515694afcda7599vboxsyncNtWrapFunctionWithAllRegParams SUPR0UnlockMem
e4bf6817370e1a71833a02285515694afcda7599vboxsyncNtWrapFunctionWith5Params SUPR0ContAlloc
e4bf6817370e1a71833a02285515694afcda7599vboxsyncNtWrapFunctionWithAllRegParams SUPR0ContFree
e4bf6817370e1a71833a02285515694afcda7599vboxsyncNtWrapFunctionWith5Params SUPR0LowAlloc
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncNtWrapFunctionWithAllRegParams SUPR0LowFree
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncNtWrapFunctionWithAllRegParams SUPR0MemAlloc
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncNtWrapFunctionWithAllRegParams SUPR0MemGetPhys
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncNtWrapFunctionWithAllRegParams SUPR0MemFree
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWithAllRegParams SUPR0PageAlloc
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams SUPR0PageFree
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsync;NtWrapFunctionWithAllRegParams SUPR0Printf - cannot wrap this buster.
e4bf6817370e1a71833a02285515694afcda7599vboxsyncNtWrapFunctionWithAllRegParams RTMemAlloc
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWithAllRegParams RTMemAllocZ
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWithAllRegParams RTMemFree
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWithAllRegParams RTMemDup
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWithAllRegParams RTMemDupEx
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWithAllRegParams RTMemRealloc
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjAllocLow
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjAllocPage
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjAllocPhys
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjAllocPhysNC
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjAllocCont
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjLockUser
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWith5Params RTR0MemObjMapKernel
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWith6Params RTR0MemObjMapUser
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjAddress
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjAddressR3
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjSize
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjIsMapping
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjGetPagePhysAddr
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTR0MemObjFree
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTProcSelf - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTR0ProcHandleSelf - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSemFastMutexCreate
ad66a27959d7085aa31760f63ce082943be60e89vboxsyncNtWrapFunctionWithAllRegParams RTSemFastMutexDestroy
ad66a27959d7085aa31760f63ce082943be60e89vboxsyncNtWrapFunctionWithAllRegParams RTSemFastMutexRequest
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTSemFastMutexRelease
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncNtWrapFunctionWithAllRegParams RTSemEventCreate
b26e5b503baa3dffc58048982eaf17ad1b53f207vboxsyncNtWrapFunctionWithAllRegParams RTSemEventSignal
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSemEventWait
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSemEventWaitNoResume
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSemEventDestroy
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSemEventMultiCreate
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSemEventMultiSignal
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSemEventMultiReset
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSemEventMultiWait
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSemEventMultiWaitNoResume
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSemEventMultiDestroy
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSpinlockCreate
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSpinlockDestroy
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSpinlockAcquire
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSpinlockRelease
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSpinlockAcquireNoInts
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTSpinlockReleaseNoInts
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTTimeNanoTS - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTTimeMilliTS - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTTimeSystemNanoTS - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTTimeSystemMilliTS - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTThreadNativeSelf - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadSleep
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadYield
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync%if 0 ; Thread APIs, Part 2
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTThreadSelf
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWith7Params RTThreadCreate
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadGetNative
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadWait
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadWaitNoResume
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadGetName
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadSelfName
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadGetType
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadUserSignal
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadUserReset
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadUserWait
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTThreadUserWaitNoResume
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync%endif
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTLogDefaultInstance - a bit of a gamble, but we do not want the overhead!
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTMpCpuId - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTMpCpuIdFromSetIndex - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTMpCpuIdToSetIndex - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTMpIsCpuPossible - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTMpGetCount - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTMpGetMaxCpuId - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTMpGetOnlineCount - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTMpGetOnlineSet - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTMpGetSet - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTMpIsCpuOnline - not necessary
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTMpOnAll
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTMpOnOthers
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTMpOnSpecific
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTLogRelDefaultInstance - not necessary.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTLogSetDefaultInstanceThread
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTLogLogger - can't wrap this buster.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTLogLoggerEx - can't wrap this buster.
4bf996d915405be92dc4394b2db1395e00e14d58vboxsyncNtWrapFunctionWithAllRegParams RTLogLoggerExV
4bf996d915405be92dc4394b2db1395e00e14d58vboxsync;NtWrapFunctionWithAllRegParams RTLogPrintf - can't wrap this buster. ;; @todo provide va_list log wrappers in RuntimeR0.
e4bf6817370e1a71833a02285515694afcda7599vboxsyncNtWrapFunctionWithAllRegParams RTLogPrintfV
e4bf6817370e1a71833a02285515694afcda7599vboxsyncNtWrapFunctionWithAllRegParams AssertMsg1
e4bf6817370e1a71833a02285515694afcda7599vboxsync;NtWrapFunctionWithAllRegParams AssertMsg2 - can't wrap this buster.
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync;;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @cproto DECLASM(int) supdrvNtWrapVMMR0EntryEx(PFNRT pfnVMMR0EntryEx, PVM pVM, unsigned uOperation, PSUPVMMR0REQHDR pReq, uint64_t u64Arg, PSUPDRVSESSION pSession);
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnVMMR0EntryEx rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pVM rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param uOperation r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pReq r9
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param u64Arg [rsp + 28h] / [rbp + 30h]
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pSession [rsp + 30h] / [rbp + 38h]
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsyncBEGINPROC supdrvNtWrapVMMR0EntryEx
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapProlog supdrvNtWrapVMMR0EntryEx
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapCreateMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rax, rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rcx, rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rdx, r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov r8, r9
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov r9, [rbp + 30h]
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov r11, [rbp + 38h]
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov [rsp + 20h], r11
e4bf6817370e1a71833a02285515694afcda7599vboxsync call rax
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapDestroyMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapEpilog supdrvNtWrapVMMR0EntryEx
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapVMMR0EntryEx
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync;;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @cproto DECLASM(int) supdrvNtWrapVMMR0EntryFast(PFNRT pfnVMMR0EntryFast, PVM pVM, unsigned uOperation);
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnVMMR0EntryFast rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pVM rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param uOperation r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsyncBEGINPROC supdrvNtWrapVMMR0EntryFast
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapProlog supdrvNtWrapVMMR0EntryFast
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync NtWrapCreateMarker
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rax, rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rcx, rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rdx, r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync call rax
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapDestroyMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapEpilog supdrvNtWrapVMMR0EntryFast
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapVMMR0EntryFast
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync;;
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync; @cproto DECLASM(void) supdrvNtWrapObjDestructor(PFNRT pfnDestruction, void *pvObj, void *pvUser1, void *pvUser2);
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnDestruction rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pvObj rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pvUser1 r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pvUser2 r9
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsyncBEGINPROC supdrvNtWrapObjDestructor
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync NtWrapProlog supdrvNtWrapObjDestructor
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapCreateMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rax, rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rcx, rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rdx, r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov r8, r9
e4bf6817370e1a71833a02285515694afcda7599vboxsync call rax
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapDestroyMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapEpilog supdrvNtWrapObjDestructor
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapObjDestructor
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync;;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @cproto DECLASM(void *) supdrvNtWrapQueryFactoryInterface(PFNRT pfnQueryFactoryInterface, struct SUPDRVFACTORY const *pSupDrvFactory,
e4bf6817370e1a71833a02285515694afcda7599vboxsync; PSUPDRVSESSION pSession, const char *pszInterfaceUuid);
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnQueryFactoryInterface rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pSupDrvFactory rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pSession r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pszInterfaceUuid r9
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsyncBEGINPROC supdrvNtWrapQueryFactoryInterface
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapProlog supdrvNtWrapQueryFactoryInterface
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapCreateMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rax, rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rcx, rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rdx, r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov r8, r9
e4bf6817370e1a71833a02285515694afcda7599vboxsync call rax
e4bf6817370e1a71833a02285515694afcda7599vboxsync
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync NtWrapDestroyMarker
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync NtWrapEpilog supdrvNtWrapQueryFactoryInterface
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapQueryFactoryInterface
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync;;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @cproto DECLASM(int) supdrvNtWrapModuleInit(PFNRT pfnModuleInit);
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnModuleInit rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsyncBEGINPROC supdrvNtWrapModuleInit
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapProlog supdrvNtWrapModuleInit
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync NtWrapCreateMarker
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync call rcx
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapDestroyMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapEpilog supdrvNtWrapModuleInit
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapModuleInit
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync;;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @cproto DECLASM(void) supdrvNtWrapModuleTerm(PFNRT pfnModuleTerm);
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnModuleInit rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync;
e4bf6817370e1a71833a02285515694afcda7599vboxsyncBEGINPROC supdrvNtWrapModuleTerm
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapProlog supdrvNtWrapModuleTerm
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapCreateMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync call rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapDestroyMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapEpilog supdrvNtWrapModuleTerm
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapModuleTerm
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync %endif ; RT_ARCH_AMD64
e4bf6817370e1a71833a02285515694afcda7599vboxsync%endif ; SUPDRV_WITH_UNWIND_HACK
e4bf6817370e1a71833a02285515694afcda7599vboxsync
e4bf6817370e1a71833a02285515694afcda7599vboxsync