Alexandre Julliard : kernel32: Use call_entry_point to call functions with variable number of arguments.
Alexandre Julliard
julliard at winehq.org
Tue Oct 6 10:35:50 CDT 2009
Module: wine
Branch: master
Commit: 26aea12cce43df4caaa005c2ef923f9ffa25d93f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=26aea12cce43df4caaa005c2ef923f9ffa25d93f
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Oct 6 12:05:36 2009 +0200
kernel32: Use call_entry_point to call functions with variable number of arguments.
---
dlls/kernel32/thunk.c | 89 +++----------------------------------------------
1 files changed, 5 insertions(+), 84 deletions(-)
diff --git a/dlls/kernel32/thunk.c b/dlls/kernel32/thunk.c
index be098b5..5befee5 100644
--- a/dlls/kernel32/thunk.c
+++ b/dlls/kernel32/thunk.c
@@ -149,7 +149,8 @@ struct SLApiDB
SEGPTR CALL32_CBClient_RetAddr = 0;
SEGPTR CALL32_CBClientEx_RetAddr = 0;
-extern void __wine_call_from_16_thunk();
+extern int call_entry_point( void *func, int nb_args, const DWORD *args );
+extern void __wine_call_from_16_thunk(void);
/* Push a DWORD on the 32-bit stack */
static inline void stack32_push( CONTEXT86 *context, DWORD val )
@@ -1036,39 +1037,7 @@ DWORD WINAPIV SSCall(
DPRINTF("0x%08x,",args[i]);
DPRINTF("])\n");
}
- switch (nr) {
- case 0: ret = fun();
- break;
- case 4: ret = fun(args[0]);
- break;
- case 8: ret = fun(args[0],args[1]);
- break;
- case 12: ret = fun(args[0],args[1],args[2]);
- break;
- case 16: ret = fun(args[0],args[1],args[2],args[3]);
- break;
- case 20: ret = fun(args[0],args[1],args[2],args[3],args[4]);
- break;
- case 24: ret = fun(args[0],args[1],args[2],args[3],args[4],args[5]);
- break;
- case 28: ret = fun(args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
- break;
- case 32: ret = fun(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
- break;
- case 36: ret = fun(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);
- break;
- case 40: ret = fun(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9]);
- break;
- case 44: ret = fun(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10]);
- break;
- case 48: ret = fun(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11]);
- break;
- default:
- WARN("Unsupported nr of arguments, %d\n",nr);
- ret = 0;
- break;
-
- }
+ ret = call_entry_point( fun, nr / sizeof(DWORD), args );
TRACE(" returning %d ...\n",ret);
return ret;
}
@@ -1081,9 +1050,7 @@ void WINAPI __regs_W32S_BackTo32( CONTEXT86 *context )
LPDWORD stack = (LPDWORD)context->Esp;
FARPROC proc = (FARPROC)context->Eip;
- context->Eax = proc( stack[1], stack[2], stack[3], stack[4], stack[5],
- stack[6], stack[7], stack[8], stack[9], stack[10] );
-
+ context->Eax = call_entry_point( proc, 10, stack + 1 );
context->Eip = stack32_pop(context);
}
DEFINE_REGS_ENTRYPOINT( W32S_BackTo32, 0 )
@@ -2378,54 +2345,8 @@ static DWORD WOW_CallProc32W16( FARPROC proc32, DWORD nrofargs, DWORD *args )
DWORD mutex_count;
ReleaseThunkLock( &mutex_count );
-
- /*
- * FIXME: If ( nrofargs & CPEX_DEST_CDECL ) != 0, we should call a
- * 32-bit CDECL routine ...
- */
-
if (!proc32) ret = 0;
- else switch (nrofargs)
- {
- case 0: ret = proc32();
- break;
- case 1: ret = proc32(args[0]);
- break;
- case 2: ret = proc32(args[0],args[1]);
- break;
- case 3: ret = proc32(args[0],args[1],args[2]);
- break;
- case 4: ret = proc32(args[0],args[1],args[2],args[3]);
- break;
- case 5: ret = proc32(args[0],args[1],args[2],args[3],args[4]);
- break;
- case 6: ret = proc32(args[0],args[1],args[2],args[3],args[4],args[5]);
- break;
- case 7: ret = proc32(args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
- break;
- case 8: ret = proc32(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
- break;
- case 9: ret = proc32(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);
- break;
- case 10:ret = proc32(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9]);
- break;
- case 11:ret = proc32(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10]);
- break;
- case 12:ret = proc32(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11]);
- break;
- case 13:ret = proc32(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12]);
- break;
- case 14:ret = proc32(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13]);
- break;
- case 15:ret = proc32(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13],args[14]);
- break;
- default:
- /* FIXME: should go up to 32 arguments */
- ERR("Unsupported number of arguments %d, please report.\n",nrofargs);
- ret = 0;
- break;
- }
-
+ else ret = call_entry_point( proc32, nrofargs & ~CPEX_DEST_CDECL, args );
RestoreThunkLock( mutex_count );
TRACE("returns %08x\n",ret);
More information about the wine-cvs
mailing list