ChangeLog: * dlls/winedos/int21.c * dlls/winedos/dosconf.c * dlls/winedos/winedos.spec * msdos/dpmi.c * msdos/int21.c * include/callback.h * dlls/kernel/kernel32.spec Move all of the simple functions of int 21 to winedos. nog.
--- include/callback.h.a1 2002-11-09 06:28:59.000000000 +0200 +++ include/callback.h 2002-11-09 06:29:09.000000000 +0200 @@ -23,7 +23,6 @@ #include "windef.h" #include "winnt.h" -#include "msdos.h" typedef struct { void (WINAPI *LoadDosExe)( LPCSTR filename, HANDLE hFile ); @@ -42,7 +41,6 @@ BOOL (WINAPI *inport)( int port, int size, DWORD *res ); BOOL (WINAPI *outport)( int port, int size, DWORD val ); void (WINAPI *ASPIHandler)( CONTEXT86 *context ); - DOSCONF *(WINAPI *GetConfig)( void ); } DOSVM_TABLE; extern DOSVM_TABLE Dosvm; --- msdos/int21.c.a1 2002-11-09 06:01:38.000000000 +0200 +++ msdos/int21.c 2002-11-09 07:27:03.000000000 +0200 @@ -461,23 +461,6 @@ SET_SI( context, context->Esi + (int)s - (int)filename ); } -static void INT21_GetSystemDate( CONTEXT86 *context ) -{ - SYSTEMTIME systime; - GetLocalTime( &systime ); - SET_CX( context, systime.wYear ); - SET_DX( context, (systime.wMonth << 8) | systime.wDay ); - SET_AX( context, systime.wDayOfWeek ); -} - -static void INT21_GetSystemTime( CONTEXT86 *context ) -{ - SYSTEMTIME systime; - GetLocalTime( &systime ); - SET_CX( context, (systime.wHour << 8) | systime.wMinute ); - SET_DX( context, (systime.wSecond << 8) | (systime.wMilliseconds / 10) ); -} - /* Many calls translate a drive argument like this: drive number (00h = default, 01h = A:, etc) */ @@ -1205,28 +1188,10 @@ break; } - case 0x2e: /* SET VERIFY FLAG */ - TRACE("SET VERIFY FLAG ignored\n"); - /* we cannot change the behaviour anyway, so just ignore it */ - break; - - case 0x18: /* NULL FUNCTIONS FOR CP/M COMPATIBILITY */ - case 0x1d: - case 0x1e: - case 0x20: - case 0x6b: /* NULL FUNCTION */ - SET_AL( context, 0 ); - break; - case 0x5c: /* "FLOCK" - RECORD LOCKING */ fLock(context); break; - case 0x0d: /* DISK BUFFER FLUSH */ - TRACE("DISK BUFFER FLUSH ignored\n"); - RESET_CFLAG(context); /* dos 6+ only */ - break; - case 0x0e: /* SELECT DEFAULT DRIVE */ TRACE("SELECT DEFAULT DRIVE %d\n", DL_reg(context)); DRIVE_SetCurrentDrive( DL_reg(context) ); @@ -1288,27 +1253,6 @@ INT21_ParseFileNameIntoFCB(context); break; - case 0x2a: /* GET SYSTEM DATE */ - INT21_GetSystemDate(context); - break; - - case 0x2b: /* SET SYSTEM DATE */ - FIXME("SetSystemDate(%02d/%02d/%04d): not allowed\n", - DL_reg(context), DH_reg(context), CX_reg(context) ); - SET_AL( context, 0 ); /* Let's pretend we succeeded */ - break; - - case 0x2c: /* GET SYSTEM TIME */ - INT21_GetSystemTime(context); - break; - - case 0x2d: /* SET SYSTEM TIME */ - FIXME("SetSystemTime(%02d:%02d:%02d.%02d): not allowed\n", - CH_reg(context), CL_reg(context), - DH_reg(context), DL_reg(context) ); - SET_AL( context, 0 ); /* Let's pretend we succeeded */ - break; - case 0x2f: /* GET DISK TRANSFER AREA ADDRESS */ TRACE("GET DISK TRANSFER AREA ADDRESS\n"); { @@ -1331,68 +1275,12 @@ SET_CX( context, 0x0000 ); break; - case 0x31: /* TERMINATE AND STAY RESIDENT */ - FIXME("TERMINATE AND STAY RESIDENT stub\n"); - break; - case 0x32: /* GET DOS DRIVE PARAMETER BLOCK FOR SPECIFIC DRIVE */ TRACE("GET DOS DRIVE PARAMETER BLOCK FOR DRIVE %s\n", INT21_DriveName( DL_reg(context))); GetDrivePB(context, DOS_GET_DRIVE( DL_reg(context) ) ); break; - case 0x33: /* MULTIPLEXED */ - switch (AL_reg(context)) - { - case 0x00: /* GET CURRENT EXTENDED BREAK STATE */ - TRACE("GET CURRENT EXTENDED BREAK STATE\n"); - if(!DPMI_LoadDosSystem()) - break; - SET_DL( context, Dosvm.GetConfig()->brk_flag ); - break; - - case 0x01: /* SET EXTENDED BREAK STATE */ - TRACE("SET CURRENT EXTENDED BREAK STATE\n"); - if(!DPMI_LoadDosSystem()) - break; - Dosvm.GetConfig()->brk_flag = (DL_reg(context) > 0); - break; - - case 0x02: /* GET AND SET EXTENDED CONTROL-BREAK CHECKING STATE*/ - TRACE("GET AND SET EXTENDED CONTROL-BREAK CHECKING STATE\n"); - if(!DPMI_LoadDosSystem()) - break; - /* ugly coding in order to stay reentrant */ - if (DL_reg(context)) - { - SET_DL( context, Dosvm.GetConfig()->brk_flag ); - Dosvm.GetConfig()->brk_flag = 1; - } - else - { - SET_DL( context, Dosvm.GetConfig()->brk_flag ); - Dosvm.GetConfig()->brk_flag = 0; - } - break; - - case 0x05: /* GET BOOT DRIVE */ - TRACE("GET BOOT DRIVE\n"); - SET_DL( context, 3 ); - /* c: is Wine's bootdrive (a: is 1)*/ - break; - - case 0x06: /* GET TRUE VERSION NUMBER */ - TRACE("GET TRUE VERSION NUMBER\n"); - SET_BX( context, (HIWORD(GetVersion16() >> 8)) | (HIWORD(GetVersion16() << 8)) ); - SET_DX( context, 0x00 ); - break; - - default: - INT_BARF( context, 0x21 ); - break; - } - break; - case 0x34: /* GET ADDRESS OF INDOS FLAG */ TRACE("GET ADDRESS OF INDOS FLAG\n"); if (!heap) INT21_CreateHeap(); @@ -1553,32 +1441,6 @@ } break; - case 0x43: /* FILE ATTRIBUTES */ - switch (AL_reg(context)) - { - case 0x00: - TRACE("GET FILE ATTRIBUTES for %s\n", - (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); - SET_AX( context, GetFileAttributesA( CTX_SEG_OFF_TO_LIN(context, context->SegDs, - context->Edx))); - if (AX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE; - else SET_CX( context, AX_reg(context) ); - break; - - case 0x01: - TRACE("SET FILE ATTRIBUTES 0x%02x for %s\n", CX_reg(context), - (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); - bSetDOSExtendedError = - (!SetFileAttributesA( CTX_SEG_OFF_TO_LIN(context, context->SegDs, - context->Edx), - CX_reg(context) )); - break; - case 0x02: - FIXME("GET COMPRESSED FILE SIZE for %s stub\n", - (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); - } - break; - case 0x44: /* IOCTL */ switch (AL_reg(context)) { @@ -1701,20 +1563,6 @@ } break; - case 0x45: /* "DUP" - DUPLICATE FILE HANDLE */ - { - HANDLE handle; - TRACE("DUP - DUPLICATE FILE HANDLE %d\n",BX_reg(context)); - if ((bSetDOSExtendedError = !DuplicateHandle( GetCurrentProcess(), - DosFileHandleToWin32Handle(BX_reg(context)), - GetCurrentProcess(), &handle, - 0, TRUE, DUPLICATE_SAME_ACCESS ))) - SET_AX( context, HFILE_ERROR16 ); - else - SET_AX( context, Win32HandleToDosFileHandle(handle) ); - break; - } - case 0x46: /* "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE */ TRACE("FORCEDUP - FORCE DUPLICATE FILE HANDLE %d to %d\n", BX_reg(context),CX_reg(context)); @@ -1843,73 +1691,6 @@ SET_BX( context, 0 ); break; - case 0x54: /* Get Verify Flag */ - TRACE("Get Verify Flag - Not Supported\n"); - SET_AL( context, 0x00 ); /* pretend we can tell. 00h = off 01h = on */ - break; - - case 0x56: /* "RENAME" - RENAME FILE */ - TRACE("RENAME %s to %s\n", - (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx), - (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegEs,context->Edi)); - bSetDOSExtendedError = - (!MoveFileA( CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx), - CTX_SEG_OFF_TO_LIN(context, context->SegEs,context->Edi))); - break; - - case 0x57: /* FILE DATE AND TIME */ - switch (AL_reg(context)) - { - case 0x00: /* Get */ - { - FILETIME filetime; - TRACE("GET FILE DATE AND TIME for handle %d\n", - BX_reg(context)); - if (!GetFileTime( DosFileHandleToWin32Handle(BX_reg(context)), NULL, NULL, &filetime )) - bSetDOSExtendedError = TRUE; - else - { - WORD date, time; - FileTimeToDosDateTime( &filetime, &date, &time ); - SET_DX( context, date ); - SET_CX( context, time ); - } - } - break; - - case 0x01: /* Set */ - { - FILETIME filetime; - TRACE("SET FILE DATE AND TIME for handle %d\n", - BX_reg(context)); - DosDateTimeToFileTime( DX_reg(context), CX_reg(context), - &filetime ); - bSetDOSExtendedError = - (!SetFileTime( DosFileHandleToWin32Handle(BX_reg(context)), - NULL, NULL, &filetime )); - } - break; - } - break; - - case 0x58: /* GET OR SET MEMORY/UMB ALLOCATION STRATEGY */ - TRACE("GET OR SET MEMORY/UMB ALLOCATION STRATEGY subfunction %d\n", - AL_reg(context)); - switch (AL_reg(context)) - { - case 0x00: - SET_AX( context, 1 ); - break; - case 0x02: - SET_AX( context, 0 ); - break; - case 0x01: - case 0x03: - break; - } - RESET_CFLAG(context); - break; - case 0x5a: /* CREATE TEMPORARY FILE */ TRACE("CREATE TEMPORARY FILE\n"); bSetDOSExtendedError = !INT21_CreateTempFile(context); @@ -1923,13 +1704,6 @@ CX_reg(context) ))) == (WORD)HFILE_ERROR16); break; - case 0x5d: /* NETWORK */ - FIXME("Function 0x%04x not implemented.\n", AX_reg (context)); - /* Fix the following while you're at it. */ - SetLastError( ER_NoNetwork ); - bSetDOSExtendedError = TRUE; - break; - case 0x5e: bSetDOSExtendedError = INT21_networkfunc (context); break; @@ -1964,19 +1738,6 @@ } break; - case 0x60: /* "TRUENAME" - CANONICALIZE FILENAME OR PATH */ - TRACE("TRUENAME %s\n", - (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Esi)); - { - if (!GetFullPathNameA( CTX_SEG_OFF_TO_LIN(context, context->SegDs, - context->Esi), 128, - CTX_SEG_OFF_TO_LIN(context, context->SegEs, - context->Edi),NULL)) - bSetDOSExtendedError = TRUE; - else SET_AX( context, 0 ); - } - break; - case 0x61: /* UNUSED */ case 0x63: /* misc. language support */ switch (AL_reg(context)) { @@ -1985,10 +1746,6 @@ break; } break; - case 0x64: /* OS/2 DOS BOX */ - INT_BARF( context, 0x21 ); - SET_CFLAG(context); - break; case 0x65:{/* GET EXTENDED COUNTRY INFORMATION */ BYTE *dataptr=CTX_SEG_OFF_TO_LIN(context, context->SegEs,context->Edi); @@ -2057,12 +1814,6 @@ if (GetLastError()) bSetDOSExtendedError = TRUE; break; - case 0x68: /* "FFLUSH" - COMMIT FILE */ - case 0x6a: /* COMMIT FILE */ - TRACE("FFLUSH/COMMIT handle %d\n",BX_reg(context)); - bSetDOSExtendedError = (!FlushFileBuffers( DosFileHandleToWin32Handle(BX_reg(context)) )); - break; - case 0x69: /* DISK SERIAL NUMBER */ switch (AL_reg(context)) { @@ -2370,11 +2121,6 @@ break; - - case 0xdc: /* CONNECTION SERVICES - GET CONNECTION NUMBER */ - case 0xea: /* NOVELL NETWARE - RETURN SHELL VERSION */ - break; - default: INT_BARF( context, 0x21 ); break; --- dlls/winedos/dosconf.c.a1 2002-11-09 06:36:21.000000000 +0200 +++ dlls/winedos/dosconf.c 2002-11-09 06:36:55.000000000 +0200 @@ -117,14 +117,6 @@ static int menu_in_listing = 0; /* we are in the [menu] section */ static int menu_skip = 0; /* the current menu gets skipped */ -DOSCONF *DOSCONF_GetConfig() -{ - static int done = 0; - if(!done) - DOSCONF_ReadConfig(); - return &DOSCONF_config; -} - static void DOSCONF_skip(char **pconfline) { char *p; --- dlls/winedos/int21.c.a1 2002-11-09 05:51:14.000000000 +0200 +++ dlls/winedos/int21.c 2002-11-09 07:28:42.000000000 +0200 @@ -77,6 +77,7 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context ) { BYTE ascii; + BOOL bSetDOSExtendedError = FALSE; RESET_CFLAG(context); /* Not sure if this is a good idea */ @@ -172,6 +173,24 @@ } break; + case 0x0d: /* DISK BUFFER FLUSH */ + TRACE("DISK BUFFER FLUSH ignored\n"); + RESET_CFLAG(context); /* dos 6+ only */ + break; + + case 0x18: /* NULL FUNCTION FOR CP/M COMPATIBILITY */ + SET_AL( context, 0 ); + break; + + case 0x1d: /* NULL FUNCTIONS FOR CP/M COMPATIBILITY */ + case 0x1e: + SET_AL( context, 0 ); + break; + + case 0x20: /* NULL FUNCTION FOR CP/M COMPATIBILITY */ + SET_AL( context, 0 ); + break; + case 0x25: /* SET INTERRUPT VECTOR */ if(DOSVM_IsWin16()) DOS3Call(context); else @@ -180,6 +199,95 @@ DX_reg(context))); break; + case 0x2a: /* GET SYSTEM DATE */ + { + SYSTEMTIME systime; + GetLocalTime( &systime ); + SET_CX( context, systime.wYear ); + SET_DX( context, (systime.wMonth << 8) | systime.wDay ); + SET_AX( context, systime.wDayOfWeek ); + } + break; + + case 0x2b: /* SET SYSTEM DATE */ + FIXME("SetSystemDate(%02d/%02d/%04d): not allowed\n", + DL_reg(context), DH_reg(context), CX_reg(context) ); + SET_AL( context, 0 ); /* Let's pretend we succeeded */ + break; + + case 0x2c: /* GET SYSTEM TIME */ + { + SYSTEMTIME systime; + GetLocalTime( &systime ); + SET_CX( context, (systime.wHour << 8) | systime.wMinute ); + SET_DX( context, (systime.wSecond << 8) | + (systime.wMilliseconds / 10) ); + } + break; + + case 0x2d: /* SET SYSTEM TIME */ + FIXME("SetSystemTime(%02d:%02d:%02d.%02d): not allowed\n", + CH_reg(context), CL_reg(context), + DH_reg(context), DL_reg(context) ); + SET_AL( context, 0 ); /* Let's pretend we succeeded */ + break; + + case 0x2e: /* SET VERIFY FLAG */ + TRACE("SET VERIFY FLAG ignored\n"); + /* we cannot change the behaviour anyway, so just ignore it */ + break; + + case 0x31: /* TERMINATE AND STAY RESIDENT */ + FIXME("TERMINATE AND STAY RESIDENT stub\n"); + break; + + case 0x33: /* MULTIPLEXED */ + switch (AL_reg(context)) + { + case 0x00: /* GET CURRENT EXTENDED BREAK STATE */ + TRACE("GET CURRENT EXTENDED BREAK STATE\n"); + SET_DL( context, DOSCONF_config.brk_flag ); + break; + + case 0x01: /* SET EXTENDED BREAK STATE */ + TRACE("SET CURRENT EXTENDED BREAK STATE\n"); + DOSCONF_config.brk_flag = (DL_reg(context) > 0); + break; + + case 0x02: /* GET AND SET EXTENDED CONTROL-BREAK CHECKING STATE */ + TRACE("GET AND SET EXTENDED CONTROL-BREAK CHECKING STATE\n"); + /* ugly coding in order to stay reentrant */ + if (DL_reg(context)) + { + SET_DL( context, DOSCONF_config.brk_flag ); + DOSCONF_config.brk_flag = 1; + } + else + { + SET_DL( context, DOSCONF_config.brk_flag ); + DOSCONF_config.brk_flag = 0; + } + break; + + case 0x05: /* GET BOOT DRIVE */ + TRACE("GET BOOT DRIVE\n"); + SET_DL( context, 3 ); + /* c: is Wine's bootdrive (a: is 1)*/ + break; + + case 0x06: /* GET TRUE VERSION NUMBER */ + TRACE("GET TRUE VERSION NUMBER\n"); + SET_BX( context, (HIWORD(GetVersion16() >> 8)) | + (HIWORD(GetVersion16() << 8)) ); + SET_DX( context, 0x00 ); + break; + + default: + INT_BARF( context, 0x21 ); + break; + } + break; + case 0x35: /* GET INTERRUPT VECTOR */ TRACE("GET INTERRUPT VECTOR 0x%02x\n",AL_reg(context)); if(DOSVM_IsWin16()) DOS3Call(context); @@ -190,6 +298,13 @@ } break; + case 0x38: /* GET COUNTRY-SPECIFIC INFORMATION */ + TRACE("GET COUNTRY-SPECIFIC INFORMATION for country 0x%02x\n", + AL_reg(context)); + SET_AX( context, 0x02 ); /* no country support available */ + SET_CFLAG(context); + break; + case 0x40: /* WRITE TO FILE OR DEVICE */ /* Writes to stdout are handled here. */ if (BX_reg(context) == 1) { @@ -204,10 +319,54 @@ DOS3Call( context ); break; + case 0x43: /* FILE ATTRIBUTES */ + switch (AL_reg(context)) + { + case 0x00: + TRACE("GET FILE ATTRIBUTES for %s\n", + (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx)); + SET_AX(context, GetFileAttributesA(CTX_SEG_OFF_TO_LIN(context, + context->SegDs, context->Edx))); + if (AX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE; + else SET_CX( context, AX_reg(context) ); + break; + + case 0x01: + TRACE("SET FILE ATTRIBUTES 0x%02x for %s\n", CX_reg(context), + (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx)); + bSetDOSExtendedError = + (!SetFileAttributesA(CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx), + CX_reg(context) )); + break; + case 0x02: + FIXME("GET COMPRESSED FILE SIZE for %s stub\n", + (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx)); + } + break; + case 0x44: /* IOCTL */ DOSVM_Int21Handler_Ioctl( context ); break; + case 0x45: /* "DUP" - DUPLICATE FILE HANDLE */ + { + HANDLE handle; + TRACE("DUP - DUPLICATE FILE HANDLE %d\n", BX_reg(context)); + if((bSetDOSExtendedError = + !DuplicateHandle(GetCurrentProcess(), + DosFileHandleToWin32Handle(BX_reg(context)), + GetCurrentProcess(), &handle, 0, TRUE, + DUPLICATE_SAME_ACCESS))) + SET_AX(context, HFILE_ERROR16); + else + SET_AX(context, Win32HandleToDosFileHandle(handle)); + break; + } + case 0x4b: /* "EXEC" - LOAD AND/OR EXECUTE PROGRAM */ TRACE("EXEC %s\n", (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx )); if(DOSVM_IsWin16()) DOS3Call(context); @@ -257,6 +416,95 @@ } break; + case 0x54: /* Get Verify Flag */ + TRACE("Get Verify Flag - Not Supported\n"); + SET_AL( context, 0x00 ); /* pretend we can tell. 00h = off 01h = on */ + break; + + case 0x56: /* "RENAME" - RENAME FILE */ + TRACE("RENAME %s to %s\n", + (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx), + (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegEs,context->Edi)); + bSetDOSExtendedError = + (!MoveFileA(CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx), + CTX_SEG_OFF_TO_LIN(context, context->SegEs, + context->Edi))); + break; + + case 0x57: /* FILE DATE AND TIME */ + switch (AL_reg(context)) + { + case 0x00: /* Get */ + { + FILETIME filetime; + TRACE("GET FILE DATE AND TIME for handle %d\n", + BX_reg(context)); + if(!GetFileTime(DosFileHandleToWin32Handle(BX_reg(context)), + NULL, NULL, + &filetime )) + bSetDOSExtendedError = TRUE; + else + { + WORD date, time; + FileTimeToDosDateTime(&filetime, &date, &time); + SET_DX(context, date); + SET_CX(context, time); + } + } + break; + + case 0x01: /* Set */ + { + FILETIME filetime; + TRACE("SET FILE DATE AND TIME for handle %d\n", + BX_reg(context)); + DosDateTimeToFileTime( DX_reg(context), CX_reg(context), + &filetime ); + bSetDOSExtendedError = + (!SetFileTime(DosFileHandleToWin32Handle(BX_reg(context)), + NULL, NULL, &filetime )); + } + break; + } + break; + + case 0x58: /* GET OR SET MEMORY/UMB ALLOCATION STRATEGY */ + TRACE("GET OR SET MEMORY/UMB ALLOCATION STRATEGY subfunction %d\n", + AL_reg(context)); + switch (AL_reg(context)) + { + case 0x00: + SET_AX( context, 1 ); + break; + case 0x02: + SET_AX( context, 0 ); + break; + case 0x01: + case 0x03: + break; + } + RESET_CFLAG(context); + break; + + case 0x5d: /* NETWORK */ + FIXME("Function 0x%04x not implemented.\n", AX_reg (context)); + /* Fix the following while you're at it. */ + SetLastError(ER_NoNetwork); + bSetDOSExtendedError = TRUE; + break; + + case 0x60: /* "TRUENAME" - CANONICALIZE FILENAME OR PATH */ + TRACE("TRUENAME %s\n", + (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Esi)); { + if (!GetFullPathNameA( CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Esi), 128, + CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Edi),NULL)) + bSetDOSExtendedError = TRUE; + else SET_AX( context, 0 ); + } + break; + case 0x62: /* GET PSP ADDRESS */ TRACE("GET CURRENT PSP ADDRESS\n"); /* FIXME: should we return the original DOS PSP upon */ @@ -265,6 +513,31 @@ else SET_BX( context, DOSVM_psp ); break; + case 0x64: /* OS/2 DOS BOX */ + INT_BARF( context, 0x21 ); + SET_CFLAG(context); + break; + + case 0x68: /* "FFLUSH" - COMMIT FILE */ + case 0x6a: /* COMMIT FILE */ + TRACE("FFLUSH/COMMIT handle %d\n",BX_reg(context)); + bSetDOSExtendedError = (!FlushFileBuffers(DosFileHandleToWin32Handle( + BX_reg(context)))); + break; + + case 0x6b: /* NULL FUNCTION FOR CP/M COMPATIBILITY */ + SET_AL( context, 0 ); + break; + + case 0x70: /* MS-DOS 7 (Windows95) - ??? (country-specific?)*/ + case 0x72: /* MS-DOS 7 (Windows95) - ??? */ + TRACE("windows95 function AX %04x\n", + AX_reg(context)); + WARN(" returning unimplemented\n"); + SET_CFLAG(context); + SET_AL( context, 0 ); + break; + default: DOS3Call( context ); } Index: dlls/kernel/kernel32.spec =================================================================== RCS file: /home/wine/wine/dlls/kernel/kernel32.spec,v retrieving revision 1.68 diff -u -r1.68 kernel32.spec --- dlls/kernel/kernel32.spec 6 Nov 2002 20:03:00 -0000 1.68 +++ dlls/kernel/kernel32.spec 9 Nov 2002 11:33:16 -0000 @@ -994,6 +994,7 @@ @ stdcall GetModuleUsage16(long) GetModuleUsage16 @ stdcall GetSelectorLimit16(long) GetSelectorLimit16 @ stdcall GetThreadQueue16(long) GetThreadQueue16 +@ stdcall GetVersion16() GetVersion16 @ stdcall GlobalDOSAlloc16(long) GlobalDOSAlloc16 @ stdcall GlobalFlags16(long) GlobalFlags16 @ stdcall GlobalReAlloc16(long long long) GlobalReAlloc16 --- msdos/dpmi.c.a1 2002-11-09 07:33:37.000000000 +0200 +++ msdos/dpmi.c 2002-11-09 07:33:47.000000000 +0200 @@ -75,7 +75,6 @@ GET_ADDR(outport); GET_ADDR(ASPIHandler); GET_ADDR(EmulateInterruptPM); - GET_ADDR(GetConfig); #undef GET_ADDR return TRUE; } --- dlls/winedos/winedos.spec.a1 2002-11-09 08:03:15.000000000 +0200 +++ dlls/winedos/winedos.spec 2002-11-09 08:03:29.000000000 +0200 @@ -14,5 +14,3 @@ @ stdcall inport(long long ptr) DOSVM_inport @ stdcall outport(long long long) DOSVM_outport @ stdcall ASPIHandler(ptr) DOSVM_ASPIHandler - -@ stdcall GetConfig() DOSCONF_GetConfig