krnl386: Use RtlCaptureContext and NtSetContextThread to implement register functions.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2017-07-25 12:04:28 +02:00
parent c5a35d898f
commit 1b85b6cab7
5 changed files with 74 additions and 62 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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()

View File

@ -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]

View File

@ -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 )
/***********************************************************************