SUPDrvA-win.asm revision 68e7d9bfd20097a7a9a84f305c78f4e312bbc34d
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; VirtualBox Support Driver - Windows NT specific assembly parts.
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; Copyright (C) 2006-2007 Sun Microsystems, Inc.
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; 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; 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; 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.
5a5b5956f8b592c807c94785d58c25e717d430c4vboxsync;*******************************************************************************
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;* Header Files *
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync;*******************************************************************************
5a5b5956f8b592c807c94785d58c25e717d430c4vboxsync%ifdef RT_ARCH_AMD64
e4bf6817370e1a71833a02285515694afcda7599vboxsync%define _DbgPrint DbgPrint
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncextern _DbgPrint
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync; Kind of alias for DbgPrint
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsyncBEGINPROC AssertMsg2
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync jmp _DbgPrint
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncENDPROC AssertMsg2
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync; Kind of alias for DbgPrint
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsyncBEGINPROC SUPR0Printf
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jmp _DbgPrint
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncENDPROC SUPR0Printf
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%ifdef SUPDRV_WITH_UNWIND_HACK
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync %ifdef RT_ARCH_AMD64
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Common prolog, take the proc name as argument.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; This creates a 0x80 byte stack frame.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%macro NtWrapProlog 1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync[proc_frame %1]
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync [pushreg rbp]
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync mov rbp, rsp
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync [setframe rbp, 0]
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync sub rsp, 0x80
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync [allocstack 0x80]
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ; save rdi and load rbp into it
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov [rbp - 8h], rdi
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync [savereg rdi, 0x78]
71e045383a3316b27563b2f44b0e0e1231968bdcvboxsync mov rdi, rbp
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[endproc_frame %1]
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; 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; Destroys the stack marker.
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; Find the stack marker with the rbp of the entry frame.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Search the current stack page inline, call a helper function
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; which does a safe search of any further stack pages.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Trashes rax, r10 and r11.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync; Modifies rbp
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync%macro NtWrapLocateMarker 0
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov rax, rbp
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync and rax, ~1fh ; 32-byte align it.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ; Calc remainig space in the current page. If we're on a
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ; page boundrary, we'll search the entire previous page.
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync mov r10, rax
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync and r10, 0fffh
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync shr r10, 5 ; /= 32 bytes
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync jz %%not_found ; If zero, take the slow path
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync ; The search loop.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync lea rax, [rax + 20h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jz %%not_found
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync cmp dword [rax ], 0x20080901
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync je %%candidate
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync jmp %%again
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync%%not_found:
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync call NAME(NtWrapLocateMarkerHelper)
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 ; found it, change rbp.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov rbp, r11
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 call NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapEpilog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncENDPROC supdrvNtWrap%1
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 mov r11, [rdi + 30h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov [rsp + 20h], r11
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync call NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapEpilog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncENDPROC supdrvNtWrap%1
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 mov r11, [rdi + 30h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov [rsp + 20h], r11
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov r10, [rdi + 38h]
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync mov [rsp + 28h], r10
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync call NAME(%1)
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync NtWrapEpilog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncENDPROC supdrvNtWrap%1
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 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 NtWrapEpilog supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncENDPROC supdrvNtWrap%1
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncextern IoGetStackLimits
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; Helper that cautiously continues the stack marker search
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; NtWrapLocateMarker started.
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; thru unused.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; rbp-88h our return address.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; thru callee register dump zone.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; @param rax Current stack location.
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync; @param rdi Parent stack frame pointer. (This should equal rbp on entry.)
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; Modifies: rbp
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsyncBEGINPROC NtWrapLocateMarkerHelper
1025ef7261a6961d07d390e85a095d806ccb88d9vboxsync ; Prolog. Save volatile regs and reserve callee space.
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 ; Call VOID IoGetStackLimits(OUT PULONG_PTR LowLimit, OUT PULONG_PTR HighLimit);
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync ; Use rdi-40h for the high limit and rdi-50h for the low one, we're only
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync ; interested in the high one.
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 ; Move the top address into r10, restore rax and continue
e4bf6817370e1a71833a02285515694afcda7599vboxsync ; the search. Check that r10 is less than 3 pages from rax.
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 ; The loop body.
5b0a093ca572a855886faa6747ad46df859dd041vboxsync.search_loop:
5b0a093ca572a855886faa6747ad46df859dd041vboxsync cmp dword [rax ], 0x20080901
5b0a093ca572a855886faa6747ad46df859dd041vboxsync je .candidate
5b0a093ca572a855886faa6747ad46df859dd041vboxsync.continue_searching:
5b0a093ca572a855886faa6747ad46df859dd041vboxsync jz .not_found
5b0a093ca572a855886faa6747ad46df859dd041vboxsync lea rax, [rax + 20h]
5b0a093ca572a855886faa6747ad46df859dd041vboxsync jmp .search_loop
5b0a093ca572a855886faa6747ad46df859dd041vboxsync ; Found the first marker, check for the rest.
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 ; found it, change rbp.
ad66a27959d7085aa31760f63ce082943be60e89vboxsync mov rbp, r11
c553cea6bfe2ce63ff5517ca4ec288502a890e99vboxsync ; Restore registers and pop the stack frame.
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
5b0a093ca572a855886faa6747ad46df859dd041vboxsync ; Needless to say, this isn't supposed to happen. Thus the int3.
ad66a27959d7085aa31760f63ce082943be60e89vboxsync ; Note down r10 and rax.
ad66a27959d7085aa31760f63ce082943be60e89vboxsync.out_of_bounds:
c58c758d3642ac45d3f12356c406c631fcd8f538vboxsync%ifdef DEBUG
5b0a093ca572a855886faa6747ad46df859dd041vboxsync%ifdef DEBUG
ad66a27959d7085aa31760f63ce082943be60e89vboxsync jmp .epilog
5b0a093ca572a855886faa6747ad46df859dd041vboxsyncENDPROC NtWrapLocateMarkerHelper
ad66a27959d7085aa31760f63ce082943be60e89vboxsync; This has the same order as the list in SUPDrv.c
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;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; @cproto DECLASM(int) supdrvNtWrapVMMR0EntryEx(PFNRT pfnVMMR0EntryEx, PVM pVM, unsigned uOperation, PSUPVMMR0REQHDR pReq, uint64_t u64Arg, PSUPDRVSESSION pSession);
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]
e4bf6817370e1a71833a02285515694afcda7599vboxsyncBEGINPROC supdrvNtWrapVMMR0EntryEx
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapProlog supdrvNtWrapVMMR0EntryEx
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapCreateMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rax, rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rcx, rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rdx, r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov r9, [rbp + 30h]
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov r11, [rbp + 38h]
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov [rsp + 20h], r11
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapDestroyMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapEpilog supdrvNtWrapVMMR0EntryEx
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapVMMR0EntryEx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @cproto DECLASM(int) supdrvNtWrapVMMR0EntryFast(PFNRT pfnVMMR0EntryFast, PVM pVM, unsigned uOperation);
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnVMMR0EntryFast rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pVM rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param uOperation r8
e4bf6817370e1a71833a02285515694afcda7599vboxsyncBEGINPROC supdrvNtWrapVMMR0EntryFast
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapProlog supdrvNtWrapVMMR0EntryFast
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync NtWrapCreateMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rax, rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rcx, rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rdx, r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapDestroyMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapEpilog supdrvNtWrapVMMR0EntryFast
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapVMMR0EntryFast
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync; @cproto DECLASM(void) supdrvNtWrapObjDestructor(PFNRT pfnDestruction, void *pvObj, void *pvUser1, void *pvUser2);
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnDestruction rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pvObj rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pvUser1 r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pvUser2 r9
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsyncBEGINPROC supdrvNtWrapObjDestructor
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync NtWrapProlog supdrvNtWrapObjDestructor
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapCreateMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rax, rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rcx, rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rdx, r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapDestroyMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapEpilog supdrvNtWrapObjDestructor
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapObjDestructor
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @cproto DECLASM(void *) supdrvNtWrapQueryFactoryInterface(PFNRT pfnQueryFactoryInterface, struct SUPDRVFACTORY const *pSupDrvFactory,
e4bf6817370e1a71833a02285515694afcda7599vboxsync; PSUPDRVSESSION pSession, const char *pszInterfaceUuid);
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnQueryFactoryInterface rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pSupDrvFactory rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pSession r8
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pszInterfaceUuid r9
e4bf6817370e1a71833a02285515694afcda7599vboxsyncBEGINPROC supdrvNtWrapQueryFactoryInterface
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapProlog supdrvNtWrapQueryFactoryInterface
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapCreateMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rax, rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rcx, rdx
e4bf6817370e1a71833a02285515694afcda7599vboxsync mov rdx, r8
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync NtWrapDestroyMarker
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync NtWrapEpilog supdrvNtWrapQueryFactoryInterface
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapQueryFactoryInterface
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @cproto DECLASM(int) supdrvNtWrapModuleInit(PFNRT pfnModuleInit);
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnModuleInit rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsyncBEGINPROC supdrvNtWrapModuleInit
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapProlog supdrvNtWrapModuleInit
725fba5c64717677ac66072bae37e5b3686f3e6dvboxsync NtWrapCreateMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapDestroyMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapEpilog supdrvNtWrapModuleInit
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapModuleInit
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @cproto DECLASM(void) supdrvNtWrapModuleTerm(PFNRT pfnModuleTerm);
e4bf6817370e1a71833a02285515694afcda7599vboxsync; @param pfnModuleInit rcx
e4bf6817370e1a71833a02285515694afcda7599vboxsyncBEGINPROC supdrvNtWrapModuleTerm
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapProlog supdrvNtWrapModuleTerm
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapCreateMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapDestroyMarker
e4bf6817370e1a71833a02285515694afcda7599vboxsync NtWrapEpilog supdrvNtWrapModuleTerm
e4bf6817370e1a71833a02285515694afcda7599vboxsyncENDPROC supdrvNtWrapModuleTerm
e4bf6817370e1a71833a02285515694afcda7599vboxsync %endif ; RT_ARCH_AMD64
e4bf6817370e1a71833a02285515694afcda7599vboxsync%endif ; SUPDRV_WITH_UNWIND_HACK