Skip to content
Snippets Groups Projects
Commit f0052479 authored by Ulrich Weigand's avatar Ulrich Weigand Committed by Alexandre Julliard
Browse files

Allow for buggy apps that call the wrong VxDCall routine.

parent f90b60e2
No related branches found
No related tags found
No related merge requests found
......@@ -15,15 +15,15 @@ import ntdll.dll
# - code generated by the MS Thunk Compiler
# - symbols exported by the Oct 94 beta version of kernel32.dll
1 stdcall VxDCall0(long ) VxDCall0
2 stdcall VxDCall1(long long) VxDCall1
3 stdcall VxDCall2(long long long) VxDCall2
4 stdcall VxDCall3(long long long long) VxDCall3
5 stdcall VxDCall4(long long long long long) VxDCall4
6 stdcall VxDCall5(long long long long long long) VxDCall5
7 stdcall VxDCall6(long long long long long long long) VxDCall6
8 stdcall VxDCall7(long long long long long long long long) VxDCall7
9 stdcall VxDCall8(long long long long long long long long long) VxDCall8
1 register VxDCall0(long) VxDCall0
2 register VxDCall1(long) VxDCall1
3 register VxDCall2(long) VxDCall2
4 register VxDCall3(long) VxDCall3
5 register VxDCall4(long) VxDCall4
6 register VxDCall5(long) VxDCall5
7 register VxDCall6(long) VxDCall6
8 register VxDCall7(long) VxDCall7
9 register VxDCall8(long) VxDCall8
10 stdcall k32CharToOemA(str str) CharToOemA
11 stdcall k32CharToOemBuffA(str str long) CharToOemBuffA
12 stdcall k32OemToCharA(ptr ptr) OemToCharA
......
......@@ -33,6 +33,7 @@
#include "winnt.h"
#include "msdos.h"
#include "miscemu.h"
#include "stackframe.h"
#include "server.h"
#include "debugtools.h"
......@@ -55,7 +56,7 @@ static BOOL DeviceIo_MMDEVLDR(DWORD dwIoControlCode,
LPDWORD lpcbBytesReturned,
LPOVERLAPPED lpOverlapped);
static DWORD VxDCall_VMM( DWORD service, va_list args );
static DWORD VxDCall_VMM( DWORD service, CONTEXT *context );
static BOOL DeviceIo_IFSMgr(DWORD dwIoControlCode,
LPVOID lpvInBuffer, DWORD cbInBuffer,
......@@ -82,7 +83,7 @@ struct VxDInfo
{
LPCSTR name;
WORD id;
DWORD (*vxdcall)(DWORD, va_list);
DWORD (*vxdcall)(DWORD, PCONTEXT);
BOOL (*deviceio)(DWORD, LPVOID, DWORD,
LPVOID, DWORD, LPDWORD, LPOVERLAPPED);
};
......@@ -434,7 +435,7 @@ static BOOL DeviceIo_VTDAPI(DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbI
/***********************************************************************
* VxDCall (KERNEL32.[1-9])
*/
static DWORD VxDCall( DWORD service, ... )
static void VxDCall( DWORD service, CONTEXT *context )
{
DWORD ret = 0xffffffff; /* FIXME */
int i;
......@@ -450,176 +451,136 @@ static DWORD VxDCall( DWORD service, ... )
else if (!VxDList[i].vxdcall)
FIXME( "Unimplemented VxD (%08lx)\n", service);
else
{
va_list args;
va_start( args, service );
ret = VxDList[i].vxdcall( service, args );
va_end( args );
}
return ret;
}
DWORD WINAPI VxDCall0( DWORD service )
{
return VxDCall( service );
}
DWORD WINAPI VxDCall1( DWORD service, DWORD arg1 )
{
return VxDCall( service, arg1 );
}
ret = VxDList[i].vxdcall( service, context );
DWORD WINAPI VxDCall2( DWORD service, DWORD arg1, DWORD arg2 )
{
return VxDCall( service, arg1, arg2 );
}
DWORD WINAPI VxDCall3( DWORD service, DWORD arg1, DWORD arg2, DWORD arg3 )
{
return VxDCall( service, arg1, arg2, arg3 );
}
DWORD WINAPI VxDCall4( DWORD service, DWORD arg1, DWORD arg2, DWORD arg3, DWORD arg4 )
{
return VxDCall( service, arg1, arg2, arg3, arg4 );
}
DWORD WINAPI VxDCall5( DWORD service, DWORD arg1, DWORD arg2, DWORD arg3,
DWORD arg4, DWORD arg5 )
{
return VxDCall( service, arg1, arg2, arg3, arg4, arg5 );
}
DWORD WINAPI VxDCall6( DWORD service, DWORD arg1, DWORD arg2, DWORD arg3,
DWORD arg4, DWORD arg5, DWORD arg6 )
{
return VxDCall( service, arg1, arg2, arg3, arg4, arg5, arg6 );
#ifdef __i386__
EAX_reg( context ) = ret;
#endif
}
DWORD WINAPI VxDCall7( DWORD service, DWORD arg1, DWORD arg2, DWORD arg3,
DWORD arg4, DWORD arg5, DWORD arg6, DWORD arg7 )
{
return VxDCall( service, arg1, arg2, arg3, arg4, arg5, arg6, arg7 );
}
void WINAPI REGS_FUNC(VxDCall0)( DWORD service, CONTEXT *context ) { VxDCall( service, context ); }
void WINAPI REGS_FUNC(VxDCall1)( DWORD service, CONTEXT *context ) { VxDCall( service, context ); }
void WINAPI REGS_FUNC(VxDCall2)( DWORD service, CONTEXT *context ) { VxDCall( service, context ); }
void WINAPI REGS_FUNC(VxDCall3)( DWORD service, CONTEXT *context ) { VxDCall( service, context ); }
void WINAPI REGS_FUNC(VxDCall4)( DWORD service, CONTEXT *context ) { VxDCall( service, context ); }
void WINAPI REGS_FUNC(VxDCall5)( DWORD service, CONTEXT *context ) { VxDCall( service, context ); }
void WINAPI REGS_FUNC(VxDCall6)( DWORD service, CONTEXT *context ) { VxDCall( service, context ); }
void WINAPI REGS_FUNC(VxDCall7)( DWORD service, CONTEXT *context ) { VxDCall( service, context ); }
void WINAPI REGS_FUNC(VxDCall8)( DWORD service, CONTEXT *context ) { VxDCall( service, context ); }
DWORD WINAPI VxDCall8( DWORD service, DWORD arg1, DWORD arg2, DWORD arg3,
DWORD arg4, DWORD arg5, DWORD arg6, DWORD arg7, DWORD arg8 )
{
return VxDCall( service, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 );
}
/***********************************************************************
* VxDCall_VMM
*/
static DWORD VxDCall_VMM( DWORD service, va_list args )
static DWORD VxDCall_VMM( DWORD service, CONTEXT *context )
{
switch ( LOWORD(service) )
{
case 0x0011: /* RegOpenKey */
{
HKEY hkey = va_arg( args, HKEY );
LPCSTR lpszSubKey = va_arg( args, LPCSTR );
LPHKEY retkey = va_arg( args, LPHKEY );
HKEY hkey = (HKEY) stack32_pop( context );
LPCSTR lpszSubKey = (LPCSTR)stack32_pop( context );
LPHKEY retkey = (LPHKEY)stack32_pop( context );
return RegOpenKeyA( hkey, lpszSubKey, retkey );
}
case 0x0012: /* RegCreateKey */
{
HKEY hkey = va_arg( args, HKEY );
LPCSTR lpszSubKey = va_arg( args, LPCSTR );
LPHKEY retkey = va_arg( args, LPHKEY );
HKEY hkey = (HKEY) stack32_pop( context );
LPCSTR lpszSubKey = (LPCSTR)stack32_pop( context );
LPHKEY retkey = (LPHKEY)stack32_pop( context );
return RegCreateKeyA( hkey, lpszSubKey, retkey );
}
case 0x0013: /* RegCloseKey */
{
HKEY hkey = va_arg( args, HKEY );
HKEY hkey = (HKEY)stack32_pop( context );
return RegCloseKey( hkey );
}
case 0x0014: /* RegDeleteKey */
{
HKEY hkey = va_arg( args, HKEY );
LPCSTR lpszSubKey = va_arg( args, LPCSTR );
HKEY hkey = (HKEY) stack32_pop( context );
LPCSTR lpszSubKey = (LPCSTR)stack32_pop( context );
return RegDeleteKeyA( hkey, lpszSubKey );
}
case 0x0015: /* RegSetValue */
{
HKEY hkey = va_arg( args, HKEY );
LPCSTR lpszSubKey = va_arg( args, LPCSTR );
DWORD dwType = va_arg( args, DWORD );
LPCSTR lpszData = va_arg( args, LPCSTR );
DWORD cbData = va_arg( args, DWORD );
HKEY hkey = (HKEY) stack32_pop( context );
LPCSTR lpszSubKey = (LPCSTR)stack32_pop( context );
DWORD dwType = (DWORD) stack32_pop( context );
LPCSTR lpszData = (LPCSTR)stack32_pop( context );
DWORD cbData = (DWORD) stack32_pop( context );
return RegSetValueA( hkey, lpszSubKey, dwType, lpszData, cbData );
}
case 0x0016: /* RegDeleteValue */
{
HKEY hkey = va_arg( args, HKEY );
LPSTR lpszValue = va_arg( args, LPSTR );
HKEY hkey = (HKEY) stack32_pop( context );
LPSTR lpszValue = (LPSTR)stack32_pop( context );
return RegDeleteValueA( hkey, lpszValue );
}
case 0x0017: /* RegQueryValue */
{
HKEY hkey = va_arg( args, HKEY );
LPSTR lpszSubKey = va_arg( args, LPSTR );
LPSTR lpszData = va_arg( args, LPSTR );
LPDWORD lpcbData = va_arg( args, LPDWORD );
HKEY hkey = (HKEY) stack32_pop( context );
LPSTR lpszSubKey = (LPSTR) stack32_pop( context );
LPSTR lpszData = (LPSTR) stack32_pop( context );
LPDWORD lpcbData = (LPDWORD)stack32_pop( context );
return RegQueryValueA( hkey, lpszSubKey, lpszData, lpcbData );
}
case 0x0018: /* RegEnumKey */
{
HKEY hkey = va_arg( args, HKEY );
DWORD iSubkey = va_arg( args, DWORD );
LPSTR lpszName = va_arg( args, LPSTR );
DWORD lpcchName = va_arg( args, DWORD );
HKEY hkey = (HKEY) stack32_pop( context );
DWORD iSubkey = (DWORD)stack32_pop( context );
LPSTR lpszName = (LPSTR)stack32_pop( context );
DWORD lpcchName = (DWORD)stack32_pop( context );
return RegEnumKeyA( hkey, iSubkey, lpszName, lpcchName );
}
case 0x0019: /* RegEnumValue */
{
HKEY hkey = va_arg( args, HKEY );
DWORD iValue = va_arg( args, DWORD );
LPSTR lpszValue = va_arg( args, LPSTR );
LPDWORD lpcchValue = va_arg( args, LPDWORD );
LPDWORD lpReserved = va_arg( args, LPDWORD );
LPDWORD lpdwType = va_arg( args, LPDWORD );
LPBYTE lpbData = va_arg( args, LPBYTE );
LPDWORD lpcbData = va_arg( args, LPDWORD );
HKEY hkey = (HKEY) stack32_pop( context );
DWORD iValue = (DWORD) stack32_pop( context );
LPSTR lpszValue = (LPSTR) stack32_pop( context );
LPDWORD lpcchValue = (LPDWORD)stack32_pop( context );
LPDWORD lpReserved = (LPDWORD)stack32_pop( context );
LPDWORD lpdwType = (LPDWORD)stack32_pop( context );
LPBYTE lpbData = (LPBYTE) stack32_pop( context );
LPDWORD lpcbData = (LPDWORD)stack32_pop( context );
return RegEnumValueA( hkey, iValue, lpszValue, lpcchValue,
lpReserved, lpdwType, lpbData, lpcbData );
}
case 0x001A: /* RegQueryValueEx */
{
HKEY hkey = va_arg( args, HKEY );
LPSTR lpszValue = va_arg( args, LPSTR );
LPDWORD lpReserved = va_arg( args, LPDWORD );
LPDWORD lpdwType = va_arg( args, LPDWORD );
LPBYTE lpbData = va_arg( args, LPBYTE );
LPDWORD lpcbData = va_arg( args, LPDWORD );
HKEY hkey = (HKEY) stack32_pop( context );
LPSTR lpszValue = (LPSTR) stack32_pop( context );
LPDWORD lpReserved = (LPDWORD)stack32_pop( context );
LPDWORD lpdwType = (LPDWORD)stack32_pop( context );
LPBYTE lpbData = (LPBYTE) stack32_pop( context );
LPDWORD lpcbData = (LPDWORD)stack32_pop( context );
return RegQueryValueExA( hkey, lpszValue, lpReserved,
lpdwType, lpbData, lpcbData );
}
case 0x001B: /* RegSetValueEx */
{
HKEY hkey = va_arg( args, HKEY );
LPSTR lpszValue = va_arg( args, LPSTR );
DWORD dwReserved = va_arg( args, DWORD );
DWORD dwType = va_arg( args, DWORD );
LPBYTE lpbData = va_arg( args, LPBYTE );
DWORD cbData = va_arg( args, DWORD );
HKEY hkey = (HKEY) stack32_pop( context );
LPSTR lpszValue = (LPSTR) stack32_pop( context );
DWORD dwReserved = (DWORD) stack32_pop( context );
DWORD dwType = (DWORD) stack32_pop( context );
LPBYTE lpbData = (LPBYTE)stack32_pop( context );
DWORD cbData = (DWORD) stack32_pop( context );
return RegSetValueExA( hkey, lpszValue, dwReserved,
dwType, lpbData, cbData );
}
case 0x001C: /* RegFlushKey */
{
HKEY hkey = va_arg( args, HKEY );
HKEY hkey = (HKEY)stack32_pop( context );
return RegFlushKey( hkey );
}
......@@ -629,12 +590,12 @@ static DWORD VxDCall_VMM( DWORD service, va_list args )
corresponding Win32 API call does. The implementation in Win95
ADVAPI32 sets all output parameters not mentioned here to zero. */
HKEY hkey = va_arg( args, HKEY );
LPDWORD lpcSubKeys = va_arg( args, LPDWORD );
LPDWORD lpcchMaxSubKey = va_arg( args, LPDWORD );
LPDWORD lpcValues = va_arg( args, LPDWORD );
LPDWORD lpcchMaxValueName = va_arg( args, LPDWORD );
LPDWORD lpcchMaxValueData = va_arg( args, LPDWORD );
HKEY hkey = (HKEY) stack32_pop( context );
LPDWORD lpcSubKeys = (LPDWORD)stack32_pop( context );
LPDWORD lpcchMaxSubKey = (LPDWORD)stack32_pop( context );
LPDWORD lpcValues = (LPDWORD)stack32_pop( context );
LPDWORD lpcchMaxValueName = (LPDWORD)stack32_pop( context );
LPDWORD lpcchMaxValueData = (LPDWORD)stack32_pop( context );
return RegQueryInfoKeyA( hkey, NULL, NULL, NULL, lpcSubKeys, lpcchMaxSubKey,
NULL, lpcValues, lpcchMaxValueName, lpcchMaxValueData,
NULL, NULL );
......@@ -642,24 +603,24 @@ static DWORD VxDCall_VMM( DWORD service, va_list args )
case 0x0021: /* RegLoadKey */
{
HKEY hkey = va_arg( args, HKEY );
LPCSTR lpszSubKey = va_arg( args, LPCSTR );
LPCSTR lpszFile = va_arg( args, LPCSTR );
HKEY hkey = (HKEY) stack32_pop( context );
LPCSTR lpszSubKey = (LPCSTR)stack32_pop( context );
LPCSTR lpszFile = (LPCSTR)stack32_pop( context );
return RegLoadKeyA( hkey, lpszSubKey, lpszFile );
}
case 0x0022: /* RegUnLoadKey */
{
HKEY hkey = va_arg( args, HKEY );
LPCSTR lpszSubKey = va_arg( args, LPCSTR );
HKEY hkey = (HKEY) stack32_pop( context );
LPCSTR lpszSubKey = (LPCSTR)stack32_pop( context );
return RegUnLoadKeyA( hkey, lpszSubKey );
}
case 0x0023: /* RegSaveKey */
{
HKEY hkey = va_arg( args, HKEY );
LPCSTR lpszFile = va_arg( args, LPCSTR );
LPSECURITY_ATTRIBUTES sa = va_arg( args, LPSECURITY_ATTRIBUTES );
HKEY hkey = (HKEY) stack32_pop( context );
LPCSTR lpszFile = (LPCSTR)stack32_pop( context );
LPSECURITY_ATTRIBUTES sa = (LPSECURITY_ATTRIBUTES)stack32_pop( context );
return RegSaveKeyA( hkey, lpszFile, sa );
}
......@@ -670,10 +631,10 @@ static DWORD VxDCall_VMM( DWORD service, va_list args )
case 0x0027: /* RegReplaceKey */
{
HKEY hkey = va_arg( args, HKEY );
LPCSTR lpszSubKey = va_arg( args, LPCSTR );
LPCSTR lpszNewFile= va_arg( args, LPCSTR );
LPCSTR lpszOldFile= va_arg( args, LPCSTR );
HKEY hkey = (HKEY) stack32_pop( context );
LPCSTR lpszSubKey = (LPCSTR)stack32_pop( context );
LPCSTR lpszNewFile= (LPCSTR)stack32_pop( context );
LPCSTR lpszOldFile= (LPCSTR)stack32_pop( context );
return RegReplaceKeyA( hkey, lpszSubKey, lpszNewFile, lpszOldFile );
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment