From 1b85b6cab7372c05fec841a578a9882ef47028f5 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 25 Jul 2017 12:04:28 +0200 Subject: [PATCH] krnl386: Use RtlCaptureContext and NtSetContextThread to implement register functions. Signed-off-by: Alexandre Julliard --- dlls/kernel32/kernel32.spec | 42 +++++++++++++++++------------------ dlls/krnl386.exe16/kernel16_private.h | 26 ++++++++++++++++------ dlls/krnl386.exe16/krnl386.exe16.spec | 42 +++++++++++++++++------------------ dlls/krnl386.exe16/thunk.c | 24 ++++++++++---------- dlls/krnl386.exe16/vxd.c | 2 +- 5 files changed, 74 insertions(+), 62 deletions(-) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 36a98bd2248..28d47426e37 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -8,15 +8,15 @@ # - code generated by the MS Thunk Compiler # - symbols exported by the Oct 94 beta version of kernel32.dll - 1 stdcall -noname -i386 -private -register VxDCall0() krnl386.exe16.VxDCall0 - 2 stdcall -noname -i386 -private -register VxDCall1() krnl386.exe16.VxDCall1 - 3 stdcall -noname -i386 -private -register VxDCall2() krnl386.exe16.VxDCall2 - 4 stdcall -noname -i386 -private -register VxDCall3() krnl386.exe16.VxDCall3 - 5 stdcall -noname -i386 -private -register VxDCall4() krnl386.exe16.VxDCall4 - 6 stdcall -noname -i386 -private -register VxDCall5() krnl386.exe16.VxDCall5 - 7 stdcall -noname -i386 -private -register VxDCall6() krnl386.exe16.VxDCall6 - 8 stdcall -noname -i386 -private -register VxDCall7() krnl386.exe16.VxDCall7 - 9 stdcall -noname -i386 -private -register VxDCall8() krnl386.exe16.VxDCall8 + 1 stdcall -noname -i386 -private -norelay VxDCall0() krnl386.exe16.VxDCall0 + 2 stdcall -noname -i386 -private -norelay VxDCall1() krnl386.exe16.VxDCall1 + 3 stdcall -noname -i386 -private -norelay VxDCall2() krnl386.exe16.VxDCall2 + 4 stdcall -noname -i386 -private -norelay VxDCall3() krnl386.exe16.VxDCall3 + 5 stdcall -noname -i386 -private -norelay VxDCall4() krnl386.exe16.VxDCall4 + 6 stdcall -noname -i386 -private -norelay VxDCall5() krnl386.exe16.VxDCall5 + 7 stdcall -noname -i386 -private -norelay VxDCall6() krnl386.exe16.VxDCall6 + 8 stdcall -noname -i386 -private -norelay VxDCall7() krnl386.exe16.VxDCall7 + 9 stdcall -noname -i386 -private -norelay VxDCall8() krnl386.exe16.VxDCall8 10 stdcall -noname -i386 -private k32CharToOemA(str ptr) krnl386.exe16.k32CharToOemA 11 stdcall -noname -i386 -private k32CharToOemBuffA(str ptr long) krnl386.exe16.k32CharToOemBuffA 12 stdcall -noname -i386 -private k32OemToCharA(ptr ptr) krnl386.exe16.k32OemToCharA @@ -45,20 +45,20 @@ 35 stdcall -noname -i386 -private LoadLibrary16(str) krnl386.exe16.LoadLibrary16 36 stdcall -noname -i386 -private FreeLibrary16(long) krnl386.exe16.FreeLibrary16 37 stdcall -noname -i386 -private GetProcAddress16(long str) krnl386.exe16.GetProcAddress16 - 38 stdcall -noname -i386 -private -register AllocMappedBuffer() krnl386.exe16.AllocMappedBuffer - 39 stdcall -noname -i386 -private -register FreeMappedBuffer() krnl386.exe16.FreeMappedBuffer - 40 stdcall -noname -i386 -private -register OT_32ThkLSF() krnl386.exe16.OT_32ThkLSF + 38 stdcall -noname -i386 -private -norelay AllocMappedBuffer() krnl386.exe16.AllocMappedBuffer + 39 stdcall -noname -i386 -private -norelay FreeMappedBuffer() krnl386.exe16.FreeMappedBuffer + 40 stdcall -noname -i386 -private -norelay OT_32ThkLSF() krnl386.exe16.OT_32ThkLSF 41 stdcall -noname -i386 -private ThunkInitLSF(long str long str str) krnl386.exe16.ThunkInitLSF 42 stdcall -noname -i386 -private -norelay LogApiThkLSF(str) krnl386.exe16.LogApiThkLSF 43 stdcall -noname -i386 -private ThunkInitLS(long str long str str) krnl386.exe16.ThunkInitLS 44 stdcall -noname -i386 -private -norelay LogApiThkSL(str) krnl386.exe16.LogApiThkSL - 45 stdcall -noname -i386 -private -register Common32ThkLS() krnl386.exe16.Common32ThkLS + 45 stdcall -noname -i386 -private -norelay Common32ThkLS() krnl386.exe16.Common32ThkLS 46 stdcall -noname -i386 -private ThunkInitSL(long str long str str) krnl386.exe16.ThunkInitSL 47 stdcall -noname -i386 -private -norelay LogCBThkSL(str) krnl386.exe16.LogCBThkSL 48 stdcall -noname -i386 -private ReleaseThunkLock(ptr) krnl386.exe16.ReleaseThunkLock 49 stdcall -noname -i386 -private RestoreThunkLock(long) krnl386.exe16.RestoreThunkLock - 51 stdcall -noname -i386 -private -register W32S_BackTo32() krnl386.exe16.W32S_BackTo32 + 51 stdcall -noname -i386 -private -norelay W32S_BackTo32() krnl386.exe16.W32S_BackTo32 52 stdcall -noname -i386 -private GetThunkBuff() krnl386.exe16.GetThunkBuff 53 stdcall -noname -i386 -private GetThunkStuff(str str) krnl386.exe16.GetThunkStuff 54 stdcall -noname -i386 -private K32WOWCallback16(long long) krnl386.exe16.K32WOWCallback16 @@ -96,8 +96,8 @@ 86 stdcall -i386 -private @(ptr) krnl386.exe16._KERNEL32_86 87 stdcall -noname -i386 -private SSOnBigStack() krnl386.exe16.SSOnBigStack 88 varargs -noname -i386 -private SSCall(long long ptr) krnl386.exe16.SSCall - 89 stdcall -noname -i386 -private -register FT_PrologPrime() krnl386.exe16.FT_PrologPrime - 90 stdcall -noname -i386 -private -register QT_ThunkPrime() krnl386.exe16.QT_ThunkPrime + 89 stdcall -noname -i386 -private -norelay FT_PrologPrime() krnl386.exe16.FT_PrologPrime + 90 stdcall -noname -i386 -private -norelay QT_ThunkPrime() krnl386.exe16.QT_ThunkPrime 91 stdcall -noname -i386 -private PK16FNF(ptr) krnl386.exe16.PK16FNF 92 stdcall -noname -i386 -private GetPK16SysVar() krnl386.exe16.GetPK16SysVar 93 stdcall -noname -i386 -private GetpWin16Lock(ptr) krnl386.exe16.GetpWin16Lock @@ -461,8 +461,8 @@ @ stdcall -i386 -private -norelay FT_Exit52() krnl386.exe16.FT_Exit52 @ stdcall -i386 -private -norelay FT_Exit56() krnl386.exe16.FT_Exit56 @ stdcall -i386 -private -norelay FT_Exit8() krnl386.exe16.FT_Exit8 -@ stdcall -i386 -private -register FT_Prolog() krnl386.exe16.FT_Prolog -@ stdcall -i386 -private -register FT_Thunk() krnl386.exe16.FT_Thunk +@ stdcall -i386 -private -norelay FT_Prolog() krnl386.exe16.FT_Prolog +@ stdcall -i386 -private -norelay FT_Thunk() krnl386.exe16.FT_Thunk @ stdcall FatalAppExitA(long str) @ stdcall FatalAppExitW(long wstr) @ stdcall FatalExit(long) @@ -1021,8 +1021,8 @@ @ stdcall K32InitializeProcessForWsWatch(long) @ stdcall K32QueryWorkingSet(long ptr long) @ stdcall K32QueryWorkingSetEx(long ptr long) -@ stdcall -i386 -private -register K32Thk1632Epilog() krnl386.exe16.K32Thk1632Epilog -@ stdcall -i386 -private -register K32Thk1632Prolog() krnl386.exe16.K32Thk1632Prolog +@ stdcall -i386 -private -norelay K32Thk1632Epilog() krnl386.exe16.K32Thk1632Epilog +@ stdcall -i386 -private -norelay K32Thk1632Prolog() krnl386.exe16.K32Thk1632Prolog @ stdcall LCIDToLocaleName(long ptr long long) @ stdcall LCMapStringA(long long str long ptr long) @ stdcall LCMapStringEx(wstr long wstr long ptr long ptr ptr long) @@ -1154,7 +1154,7 @@ @ stdcall ProcessIdToSessionId(long ptr) @ stdcall PulseEvent(long) @ stdcall PurgeComm(long long) -@ stdcall -i386 -private -register QT_Thunk() krnl386.exe16.QT_Thunk +@ stdcall -i386 -private -norelay QT_Thunk() krnl386.exe16.QT_Thunk # @ stub QueryActCtxSettingsW @ stdcall QueryActCtxW(long ptr ptr long ptr long ptr) @ stdcall QueryDepthSList(ptr) ntdll.RtlQueryDepthSList diff --git a/dlls/krnl386.exe16/kernel16_private.h b/dlls/krnl386.exe16/kernel16_private.h index 2c860df2a66..1f8f730916d 100644 --- a/dlls/krnl386.exe16/kernel16_private.h +++ b/dlls/krnl386.exe16/kernel16_private.h @@ -298,12 +298,24 @@ static inline DWORD stack32_pop( CONTEXT *context ) return ret; } -#define DEFINE_REGS_ENTRYPOINT( name, args ) \ - __ASM_GLOBAL_FUNC( name, \ - ".byte 0x68\n\t" /* pushl $__regs_func */ \ - ".long " __ASM_NAME("__regs_") #name "-.-11\n\t" \ - ".byte 0x6a," #args "\n\t" /* pushl $args */ \ - "call " __ASM_NAME("__wine_call_from_regs") "\n\t" \ - "ret $(4*" #args ")" ) /* fake ret to make copy protections happy */ +#define DEFINE_REGS_ENTRYPOINT(name) \ + __ASM_STDCALL_FUNC( name, 0, \ + "pushl %ebp\n\t" \ + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") \ + __ASM_CFI(".cfi_rel_offset %ebp,0\n\t") \ + "movl %esp,%ebp\n\t" \ + __ASM_CFI(".cfi_def_cfa_register %ebp\n\t") \ + "leal -(0x2cc+4)(%esp),%esp\n\t" /* sizeof(CONTEXT) + space for %eax */ \ + "movl %eax,-4(%ebp)\n\t" \ + "pushl %esp\n\t" /* context */ \ + "call " __ASM_NAME("RtlCaptureContext") __ASM_STDCALL(4) "\n\t" \ + "movl -4(%ebp),%eax\n\t" \ + "movl %eax,0xb0(%esp)\n\t" /* context->Eax */ \ + "pushl %esp\n\t" /* context */ \ + "call " __ASM_NAME("__regs_") #name __ASM_STDCALL(4) "\n\t" \ + "pushl %esp\n\t" /* context */ \ + "pushl $-2\n\t" /* GetCurrentThread() */ \ + "call " __ASM_NAME("NtSetContextThread") __ASM_STDCALL(8) "\n\t" \ + "ret" ) /* fake ret to make copy protections happy */ #endif /* __WINE_KERNEL16_PRIVATE_H */ diff --git a/dlls/krnl386.exe16/krnl386.exe16.spec b/dlls/krnl386.exe16/krnl386.exe16.spec index 0f2007b61af..62d37e5e4fd 100644 --- a/dlls/krnl386.exe16/krnl386.exe16.spec +++ b/dlls/krnl386.exe16/krnl386.exe16.spec @@ -549,15 +549,15 @@ ################################################################ # 32-bit version of the various 16-bit functions exported by kernel32 # -@ stdcall -arch=win32 -register VxDCall0() VxDCall -@ stdcall -arch=win32 -register VxDCall1() VxDCall -@ stdcall -arch=win32 -register VxDCall2() VxDCall -@ stdcall -arch=win32 -register VxDCall3() VxDCall -@ stdcall -arch=win32 -register VxDCall4() VxDCall -@ stdcall -arch=win32 -register VxDCall5() VxDCall -@ stdcall -arch=win32 -register VxDCall6() VxDCall -@ stdcall -arch=win32 -register VxDCall7() VxDCall -@ stdcall -arch=win32 -register VxDCall8() VxDCall +@ stdcall -arch=win32 -norelay VxDCall0() VxDCall +@ stdcall -arch=win32 -norelay VxDCall1() VxDCall +@ stdcall -arch=win32 -norelay VxDCall2() VxDCall +@ stdcall -arch=win32 -norelay VxDCall3() VxDCall +@ stdcall -arch=win32 -norelay VxDCall4() VxDCall +@ stdcall -arch=win32 -norelay VxDCall5() VxDCall +@ stdcall -arch=win32 -norelay VxDCall6() VxDCall +@ stdcall -arch=win32 -norelay VxDCall7() VxDCall +@ stdcall -arch=win32 -norelay VxDCall8() VxDCall @ stdcall -arch=win32 k32CharToOemA(str ptr) @ stdcall -arch=win32 k32CharToOemBuffA(str ptr long) @ stdcall -arch=win32 k32OemToCharA(ptr ptr) @@ -584,19 +584,19 @@ @ stdcall -arch=win32 LoadLibrary16(str) @ stdcall -arch=win32 FreeLibrary16(long) @ stdcall -arch=win32 GetProcAddress16(long str) WIN32_GetProcAddress16 -@ stdcall -arch=win32 -register AllocMappedBuffer() -@ stdcall -arch=win32 -register FreeMappedBuffer() -@ stdcall -arch=win32 -register OT_32ThkLSF() +@ stdcall -arch=win32 -norelay AllocMappedBuffer() +@ stdcall -arch=win32 -norelay FreeMappedBuffer() +@ stdcall -arch=win32 -norelay OT_32ThkLSF() @ stdcall -arch=win32 ThunkInitLSF(ptr str long str str) @ stdcall -arch=win32 -norelay LogApiThkLSF(str) @ stdcall -arch=win32 ThunkInitLS(ptr str long str str) @ stdcall -arch=win32 -norelay LogApiThkSL(str) -@ stdcall -arch=win32 -register Common32ThkLS() +@ stdcall -arch=win32 -norelay Common32ThkLS() @ stdcall -arch=win32 ThunkInitSL(ptr str long str str) @ stdcall -arch=win32 -norelay LogCBThkSL(str) @ stdcall -arch=win32 ReleaseThunkLock(ptr) @ stdcall -arch=win32 RestoreThunkLock(long) -@ stdcall -arch=win32 -register W32S_BackTo32() +@ stdcall -arch=win32 -norelay W32S_BackTo32() @ stdcall -arch=win32 GetThunkBuff() @ stdcall -arch=win32 GetThunkStuff(str str) @ stdcall -arch=win32 K32WOWCallback16(long long) @@ -619,8 +619,8 @@ @ stdcall -arch=win32 _KERNEL32_86(ptr) @ stdcall -arch=win32 SSOnBigStack() @ varargs -arch=win32 SSCall(long long ptr) -@ stdcall -arch=win32 -register FT_PrologPrime() -@ stdcall -arch=win32 -register QT_ThunkPrime() +@ stdcall -arch=win32 -norelay FT_PrologPrime() +@ stdcall -arch=win32 -norelay QT_ThunkPrime() @ stdcall -arch=win32 PK16FNF(ptr) @ stdcall -arch=win32 GetPK16SysVar() @ stdcall -arch=win32 GetpWin16Lock(ptr) @@ -648,12 +648,12 @@ @ stdcall -arch=win32 -norelay FT_Exit52() @ stdcall -arch=win32 -norelay FT_Exit56() @ stdcall -arch=win32 -norelay FT_Exit8() -@ stdcall -arch=win32 -register FT_Prolog() -@ stdcall -arch=win32 -register FT_Thunk() +@ stdcall -arch=win32 -norelay FT_Prolog() +@ stdcall -arch=win32 -norelay FT_Thunk() @ stdcall -arch=win32 FreeSLCallback(long) @ stdcall -arch=win32 Get16DLLAddress(long str) -@ stdcall -arch=win32 -register K32Thk1632Epilog() -@ stdcall -arch=win32 -register K32Thk1632Prolog() +@ stdcall -arch=win32 -norelay K32Thk1632Epilog() +@ stdcall -arch=win32 -norelay K32Thk1632Prolog() @ stdcall -arch=win32 -norelay MapHInstLS() @ stdcall -arch=win32 -norelay MapHInstLS_PN() @ stdcall -arch=win32 -norelay MapHInstSL() @@ -665,7 +665,7 @@ @ stdcall -arch=win32 MapSLFix(long) @ stdcall -arch=win32 PrivateFreeLibrary(long) @ stdcall -arch=win32 PrivateLoadLibrary(str) -@ stdcall -arch=win32 -register QT_Thunk() +@ stdcall -arch=win32 -norelay QT_Thunk() @ stdcall -arch=win32 -norelay SMapLS() @ stdcall -arch=win32 -norelay SMapLS_IP_EBP_12() @ stdcall -arch=win32 -norelay SMapLS_IP_EBP_16() diff --git a/dlls/krnl386.exe16/thunk.c b/dlls/krnl386.exe16/thunk.c index 64287c36339..737f6a80574 100644 --- a/dlls/krnl386.exe16/thunk.c +++ b/dlls/krnl386.exe16/thunk.c @@ -461,7 +461,7 @@ void WINAPI __regs_QT_Thunk( CONTEXT *context ) context->Esp += LOWORD(context16.Esp) - ( OFFSETOF(NtCurrentTeb()->WOW32Reserved) - argsize ); } -DEFINE_REGS_ENTRYPOINT( QT_Thunk, 0 ) +DEFINE_REGS_ENTRYPOINT( QT_Thunk ) /********************************************************************** @@ -527,7 +527,7 @@ void WINAPI __regs_FT_Prolog( CONTEXT *context ) *(DWORD *)(context->Ebp - 48) = context->Eax; *(DWORD *)(context->Ebp - 52) = context->Edx; } -DEFINE_REGS_ENTRYPOINT( FT_Prolog, 0 ) +DEFINE_REGS_ENTRYPOINT( FT_Prolog ) /********************************************************************** * FT_Thunk (KERNEL32.@) @@ -593,7 +593,7 @@ void WINAPI __regs_FT_Thunk( CONTEXT *context ) /* Copy modified buffers back to 32-bit stack */ memcpy( oldstack, newstack, argsize ); } -DEFINE_REGS_ENTRYPOINT( FT_Thunk, 0 ) +DEFINE_REGS_ENTRYPOINT( FT_Thunk ) /*********************************************************************** * FT_Exit0 (KERNEL32.@) @@ -743,7 +743,7 @@ void WINAPI __regs_Common32ThkLS( CONTEXT *context ) /* Clean up caller's stack frame */ context->Esp += LOBYTE(context16.Ebx); } -DEFINE_REGS_ENTRYPOINT( Common32ThkLS, 0 ) +DEFINE_REGS_ENTRYPOINT( Common32ThkLS ) /*********************************************************************** * OT_32ThkLSF (KERNEL32.40) @@ -798,7 +798,7 @@ void WINAPI __regs_OT_32ThkLSF( CONTEXT *context ) context->Esp += LOWORD(context16.Esp) - ( OFFSETOF(NtCurrentTeb()->WOW32Reserved) - argsize ); } -DEFINE_REGS_ENTRYPOINT( OT_32ThkLSF, 0 ) +DEFINE_REGS_ENTRYPOINT( OT_32ThkLSF ) /*********************************************************************** * ThunkInitLSF (KERNEL32.41) @@ -897,7 +897,7 @@ void WINAPI __regs_FT_PrologPrime( CONTEXT *context ) /* Jump to the call stub just created */ context->Eip = (DWORD)relayCode; } -DEFINE_REGS_ENTRYPOINT( FT_PrologPrime, 0 ) +DEFINE_REGS_ENTRYPOINT( FT_PrologPrime ) /*********************************************************************** * QT_ThunkPrime (KERNEL32.90) @@ -927,7 +927,7 @@ void WINAPI __regs_QT_ThunkPrime( CONTEXT *context ) /* Jump to the call stub just created */ context->Eip = (DWORD)relayCode; } -DEFINE_REGS_ENTRYPOINT( QT_ThunkPrime, 0 ) +DEFINE_REGS_ENTRYPOINT( QT_ThunkPrime ) /*********************************************************************** * ThunkInitSL (KERNEL32.46) @@ -1034,7 +1034,7 @@ void WINAPI __regs_W32S_BackTo32( CONTEXT *context ) context->Eax = call_entry_point( proc, 10, stack + 1 ); context->Eip = stack32_pop(context); } -DEFINE_REGS_ENTRYPOINT( W32S_BackTo32, 0 ) +DEFINE_REGS_ENTRYPOINT( W32S_BackTo32 ) /********************************************************************** * AllocSLCallback (KERNEL32.@) @@ -1149,7 +1149,7 @@ void WINAPI __regs_AllocMappedBuffer( context->Edi = (DWORD)(buffer + 2); } } -DEFINE_REGS_ENTRYPOINT( AllocMappedBuffer, 0 ) +DEFINE_REGS_ENTRYPOINT( AllocMappedBuffer ) /********************************************************************** * FreeMappedBuffer (KERNEL32.39) @@ -1172,7 +1172,7 @@ void WINAPI __regs_FreeMappedBuffer( GlobalFree((HGLOBAL)buffer[0]); } } -DEFINE_REGS_ENTRYPOINT( FreeMappedBuffer, 0 ) +DEFINE_REGS_ENTRYPOINT( FreeMappedBuffer ) /********************************************************************** * GetTEBSelectorFS (KERNEL.475) @@ -1278,7 +1278,7 @@ void WINAPI __regs_K32Thk1632Prolog( CONTEXT *context ) been called. Thus we re-use it to hold the Win16Lock count */ ReleaseThunkLock(&CURRENT_STACK16->entry_point); } -DEFINE_REGS_ENTRYPOINT( K32Thk1632Prolog, 0 ) +DEFINE_REGS_ENTRYPOINT( K32Thk1632Prolog ) /*********************************************************************** * K32Thk1632Epilog (KERNEL32.@) @@ -1313,7 +1313,7 @@ void WINAPI __regs_K32Thk1632Epilog( CONTEXT *context ) context->Ebp, context->Esp, NtCurrentTeb()->WOW32Reserved); } } -DEFINE_REGS_ENTRYPOINT( K32Thk1632Epilog, 0 ) +DEFINE_REGS_ENTRYPOINT( K32Thk1632Epilog ) /********************************************************************* * PK16FNF [KERNEL32.91] diff --git a/dlls/krnl386.exe16/vxd.c b/dlls/krnl386.exe16/vxd.c index 4cd4f052847..7be5f63b5e0 100644 --- a/dlls/krnl386.exe16/vxd.c +++ b/dlls/krnl386.exe16/vxd.c @@ -313,7 +313,7 @@ void WINAPI DECLSPEC_HIDDEN __regs_VxDCall( CONTEXT *context ) context->Eax = 0xffffffff; /* FIXME */ } } -DEFINE_REGS_ENTRYPOINT( VxDCall, 0 ) +DEFINE_REGS_ENTRYPOINT( VxDCall ) /*********************************************************************** -- 2.11.4.GIT