VxDCall service id 0x0010 provides int24 dispatch functionality and VxDCall service id 0x002a provides int41 dispatch functionality.
All of these services together with existing service id 0x0029 (for int31/dpmi functionality) have same API, first VxDCall() argument is value for EAX register and second argument is value for ECX register.
From: Pali Rohár pali@kernel.org
VxDCall service id 0x0010 provides int24 dispatch functionality and VxDCall service id 0x002a provides int41 dispatch functionality.
All of these services together with existing service id 0x0029 (for int31/dpmi functionality) have same API, first VxDCall() argument is value for EAX register and second argument is value for ECX register.
Signed-off-by: Pali Rohár pali@kernel.org --- dlls/vwin32.vxd/vwin32.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-)
diff --git a/dlls/vwin32.vxd/vwin32.c b/dlls/vwin32.vxd/vwin32.c index 63c440fdbe4..843aad69ce1 100644 --- a/dlls/vwin32.vxd/vwin32.c +++ b/dlls/vwin32.vxd/vwin32.c @@ -199,23 +199,38 @@ DWORD WINAPI VWIN32_VxDCall( DWORD service, CONTEXT *context ) */ return 0x0405; } + case 0x0010: /* Int24 dispatch */ case 0x0029: /* Int31/DPMI dispatch */ + case 0x002a: /* Int41 dispatch */ { - DWORD callnum = stack32_pop(context); - DWORD parm = stack32_pop(context); + BYTE intnum = 0;
- TRACE("Int31/DPMI dispatch(%08lx)\n", callnum); + context->Eax = stack32_pop( context ); + context->Ecx = stack32_pop( context );
- context->Eax = callnum; - context->Ecx = parm; - __wine_call_int_handler16( 0x31, context ); + switch ( LOWORD( service ) ) + { + case 0x0010: /* Int24 dispatch */ + intnum = 0x24; + break; + case 0x0029: /* Int31/DPMI dispatch */ + intnum = 0x31; + break; + case 0x002a: /* Int41 dispatch */ + intnum = 0x41; + break; + } + + TRACE( "Int%x dispatch: " + "eax=0x%08lx, ebx=0x%08lx, ecx=0x%08lx, " + "edx=0x%08lx, esi=0x%08lx, edi=0x%08lx\n", + intnum, + context->Eax, context->Ebx, context->Ecx, + context->Edx, context->Esi, context->Edi ); + + __wine_call_int_handler16( intnum, context ); return LOWORD(context->Eax); } - case 0x002a: /* Int41 dispatch - parm = int41 service number */ - { - DWORD callnum = stack32_pop(context); - return callnum; /* FIXME: should really call INT_Int41Handler() */ - } default: FIXME("Unknown service %08lx\n", service); return 0xffffffff;
Again, for this and the other changes, please always explain what application is fixed by the change.
If it doesn't fix any known application, please don't touch the code at all. This is old and mostly bitrotten code that we don't want to have to spend more time on.