From 69507b24075eb0882d48aeb93c588da6151ddb1d Mon Sep 17 00:00:00 2001 From: Joachim Henze Date: Fri, 2 Dec 2022 23:51:30 +0100 Subject: [PATCH] [0.4.13][RPCRT4] Sync msvc.S with WINE's inline assembly, as suggested by Thomas It fixes CORE-18505 '[MSVC only] VBox 2.0.0 is not able to open, but on GCC it can' It regressed by: 0.4.12-dev-555-g b6fdb56b9adf780902cc9cf65af1f76365a96ce4 and 0.4.12-dev-544-g 5db885cae7050f46999387ffd88ea6b8a1d512be Fix picked from 0.4.15-dev-5461-g 062a8f20a9fae1f4962886b582d77c04943dc0c4 The fix works also for MSVC2010SP1 dbg builds in the older branches. I will not create a new GCC iso for that revision, because this commit does not affect GCC at all. --- dll/win32/rpcrt4/msvc.S | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/dll/win32/rpcrt4/msvc.S b/dll/win32/rpcrt4/msvc.S index c45ccc68853..41494e6b848 100644 --- a/dll/win32/rpcrt4/msvc.S +++ b/dll/win32/rpcrt4/msvc.S @@ -9,24 +9,25 @@ EXTERN _ndr_client_call:PROC PUBLIC _call_stubless_func _call_stubless_func: - mov ecx,[esp+4] /* This Pointer */ - mov ecx,[ecx] /* This->lpVtbl */ - mov ecx,[ecx-8] /* MIDL_STUBLESS_PROXY_INFO */ - mov edx,[ecx+8] /* Info->FormatStringOffset */ - mov edx,[edx+eax*2] /* FormatStringOffset[index] */ - and edx, 0000FFFFh - add edx,[ecx+4] /* info->ProcFormatString + offset */ - mov eax, [edx+8] /* arguments size */ - and eax, 0000FFFFh + mov ecx, [esp+4] /* This Pointer */ + mov ecx, [ecx] /* This->lpVtbl */ + mov ecx, [ecx-8] /* MIDL_STUBLESS_PROXY_INFO */ + mov edx, [ecx+8] /* Info->FormatStringOffset */ + movzx edx, word ptr [edx+eax*2] /* FormatStringOffset[index] */ + add edx, [ecx+4] /* info->ProcFormatString + offset */ + movzx eax, byte ptr [edx+1] /* Oi_flags */ + and eax, 8 /* Oi_HAS_RPCFLAGS */ + shr eax, 1 + movzx eax, word ptr [edx+eax+4] /* arguments size */ push eax - lea eax, [esp+8] /* &This */ + lea eax, [esp+8] /* &This */ push eax - push edx /* format string */ - push [ecx] /* info->pstubdesc */ + push edx /* format string */ + push [ecx] /* info->pstubdesc */ call _ndr_client_call lea esp, [esp+12] - pop edx /* arguments size */ - mov ecx, [esp] /* return address */ + pop edx /* arguments size */ + mov ecx, [esp] /* return address */ add esp, edx jmp ecx #else