kernel32: Use call_entry_point to call functions with variable number of arguments.
This commit is contained in:
parent
e6cd096d65
commit
26aea12cce
|
@ -149,7 +149,8 @@ struct SLApiDB
|
||||||
SEGPTR CALL32_CBClient_RetAddr = 0;
|
SEGPTR CALL32_CBClient_RetAddr = 0;
|
||||||
SEGPTR CALL32_CBClientEx_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 */
|
/* Push a DWORD on the 32-bit stack */
|
||||||
static inline void stack32_push( CONTEXT86 *context, DWORD val )
|
static inline void stack32_push( CONTEXT86 *context, DWORD val )
|
||||||
|
@ -1036,39 +1037,7 @@ DWORD WINAPIV SSCall(
|
||||||
DPRINTF("0x%08x,",args[i]);
|
DPRINTF("0x%08x,",args[i]);
|
||||||
DPRINTF("])\n");
|
DPRINTF("])\n");
|
||||||
}
|
}
|
||||||
switch (nr) {
|
ret = call_entry_point( fun, nr / sizeof(DWORD), args );
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
TRACE(" returning %d ...\n",ret);
|
TRACE(" returning %d ...\n",ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1081,9 +1050,7 @@ void WINAPI __regs_W32S_BackTo32( CONTEXT86 *context )
|
||||||
LPDWORD stack = (LPDWORD)context->Esp;
|
LPDWORD stack = (LPDWORD)context->Esp;
|
||||||
FARPROC proc = (FARPROC)context->Eip;
|
FARPROC proc = (FARPROC)context->Eip;
|
||||||
|
|
||||||
context->Eax = proc( stack[1], stack[2], stack[3], stack[4], stack[5],
|
context->Eax = call_entry_point( proc, 10, stack + 1 );
|
||||||
stack[6], stack[7], stack[8], stack[9], stack[10] );
|
|
||||||
|
|
||||||
context->Eip = stack32_pop(context);
|
context->Eip = stack32_pop(context);
|
||||||
}
|
}
|
||||||
DEFINE_REGS_ENTRYPOINT( W32S_BackTo32, 0 )
|
DEFINE_REGS_ENTRYPOINT( W32S_BackTo32, 0 )
|
||||||
|
@ -2378,54 +2345,8 @@ static DWORD WOW_CallProc32W16( FARPROC proc32, DWORD nrofargs, DWORD *args )
|
||||||
DWORD mutex_count;
|
DWORD mutex_count;
|
||||||
|
|
||||||
ReleaseThunkLock( &mutex_count );
|
ReleaseThunkLock( &mutex_count );
|
||||||
|
|
||||||
/*
|
|
||||||
* FIXME: If ( nrofargs & CPEX_DEST_CDECL ) != 0, we should call a
|
|
||||||
* 32-bit CDECL routine ...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!proc32) ret = 0;
|
if (!proc32) ret = 0;
|
||||||
else switch (nrofargs)
|
else ret = call_entry_point( proc32, nrofargs & ~CPEX_DEST_CDECL, args );
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
RestoreThunkLock( mutex_count );
|
RestoreThunkLock( mutex_count );
|
||||||
|
|
||||||
TRACE("returns %08x\n",ret);
|
TRACE("returns %08x\n",ret);
|
||||||
|
|
Loading…
Reference in New Issue