From 84e51e73b4c02a966ad268885c0f5abad3d3e49e Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 28 Dec 2009 17:37:44 +0100 Subject: [PATCH] kernel32: Link directly to the thunk functions instead of looking up their entry point. --- dlls/kernel32/thunk.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/dlls/kernel32/thunk.c b/dlls/kernel32/thunk.c index 78ba2f73805..e03d858f493 100644 --- a/dlls/kernel32/thunk.c +++ b/dlls/kernel32/thunk.c @@ -151,6 +151,10 @@ SEGPTR CALL32_CBClientEx_RetAddr = 0; extern int call_entry_point( void *func, int nb_args, const DWORD *args ); extern void __wine_call_from_16_thunk(void); +extern void FT_Prolog(void); +extern void FT_PrologPrime(void); +extern void QT_Thunk(void); +extern void QT_ThunkPrime(void); /* Push a DWORD on the 32-bit stack */ static inline void stack32_push( CONTEXT86 *context, DWORD val ) @@ -229,7 +233,7 @@ static void _write_ftprolog(LPBYTE relayCode ,DWORD *targetTable) { *x++ = 0x0f;*x++=0xb6;*x++=0xd1; /* movzbl edx,cl */ *x++ = 0x8B;*x++=0x14;*x++=0x95;*(DWORD**)x= targetTable; x+=4; /* mov edx, [4*edx + targetTable] */ - *x++ = 0x68; *(DWORD*)x = (DWORD)GetProcAddress(kernel32_handle,"FT_Prolog"); + *x++ = 0x68; *(void **)x = FT_Prolog; x+=4; /* push FT_Prolog */ *x++ = 0xC3; /* lret */ /* fill rest with 0xCC / int 3 */ @@ -256,7 +260,7 @@ static void _write_qtthunk( *x++ = 0x8A;*x++=0x4D;*x++=0xFC; /* movb cl,[ebp-04] */ *x++ = 0x8B;*x++=0x14;*x++=0x8D;*(DWORD**)x= targetTable; x+=4; /* mov edx, [4*ecx + targetTable */ - *x++ = 0xB8; *(DWORD*)x = (DWORD)GetProcAddress(kernel32_handle,"QT_Thunk"); + *x++ = 0xB8; *(void **)x = QT_Thunk; x+=4; /* mov eax , QT_Thunk */ *x++ = 0xFF; *x++ = 0xE0; /* jmp eax */ /* should fill the rest of the 32 bytes with 0xCC */ @@ -867,9 +871,8 @@ LPVOID WINAPI ThunkInitLSF( /* FIXME: add checks for valid code ... */ /* write pointers to kernel32.89 and kernel32.90 (+ordinal base of 1) */ - *(DWORD*)(thunk+0x35) = (DWORD)GetProcAddress(kernel32_handle,(LPSTR)90); - *(DWORD*)(thunk+0x6D) = (DWORD)GetProcAddress(kernel32_handle,(LPSTR)89); - + *(void **)(thunk+0x35) = QT_ThunkPrime; + *(void **)(thunk+0x6D) = FT_PrologPrime; if (!(addr = _loadthunk( dll16, thkbuf, dll32, NULL, len ))) return 0; @@ -1645,7 +1648,7 @@ static BOOL THUNK_Init(void) { LPBYTE thunk; - ThunkletHeap = HeapCreate( 0, 0x10000, 0x10000 ); + ThunkletHeap = HeapCreate( HEAP_CREATE_ENABLE_EXECUTE, 0x10000, 0x10000 ); if (!ThunkletHeap) return FALSE; ThunkletCodeSel = SELECTOR_AllocBlock( ThunkletHeap, 0x10000, WINE_LDT_FLAGS_CODE ); @@ -2095,7 +2098,7 @@ SEGPTR WINAPI Get16DLLAddress(HMODULE16 handle, LPSTR func_name) /* jmpl QT_Thunk */ *thunk++ = 0xea; - *(FARPROC *)thunk = GetProcAddress(kernel32_handle,"QT_Thunk"); + *(void **)thunk = QT_Thunk; thunk += sizeof(FARPROC16); *(WORD *)thunk = wine_get_cs();