Move decoding of long file name functions to winedos.

Move some int21 functions to winedos.
This commit is contained in:
Jukka Heinonen 2003-03-04 02:15:56 +00:00 committed by Alexandre Julliard
parent 75d7b15236
commit 2918ee6b0d
3 changed files with 171 additions and 74 deletions

View File

@ -1070,6 +1070,7 @@
################################################################
# Wine extensions: Win16 functions that are needed by other dlls
#
@ stdcall _lclose16(long) _lclose16
@ stdcall AllocCStoDSAlias16(long) AllocCStoDSAlias16
@ stdcall AllocSelectorArray16(long) AllocSelectorArray16
@ stdcall ConvertDialog32To16(ptr long ptr) ConvertDialog32To16
@ -1144,6 +1145,7 @@
@ cdecl DOSMEM_Init(long) DOSMEM_Init
@ cdecl DOSMEM_ResizeBlock(ptr long long) DOSMEM_ResizeBlock
@ cdecl DRIVE_OpenDevice(long long) DRIVE_OpenDevice
@ cdecl FILE_Dup2(long long) FILE_Dup2
@ stdcall INT_Int21Handler(ptr) INT_Int21Handler
@ cdecl LOCAL_Alloc(long long long) LOCAL_Alloc
@ cdecl LOCAL_Compact(long long long) LOCAL_Compact

View File

@ -731,6 +731,111 @@ static void INT21_Ioctl( CONTEXT86 *context )
}
/***********************************************************************
* INT21_LongFilename
*
* Handler for function 0x71.
*/
static void INT21_LongFilename( CONTEXT86 *context )
{
BOOL bSetDOSExtendedError = FALSE;
if (HIBYTE(HIWORD(GetVersion16())) < 0x07)
{
TRACE( "LONG FILENAME - functions supported only under DOS7\n" );
SET_CFLAG( context );
SET_AL( context, 0 );
return;
}
switch (AL_reg(context))
{
case 0x0d: /* RESET DRIVE */
case 0x39: /* LONG FILENAME - MAKE DIRECTORY */
INT_Int21Handler( context );
break;
case 0x3a: /* LONG FILENAME - REMOVE DIRECTORY */
{
WCHAR dirW[MAX_PATH];
char *dirA = CTX_SEG_OFF_TO_LIN(context,
context->SegDs, context->Edx);
TRACE( "LONG FILENAME - REMOVE DIRECTORY %s\n", dirA );
MultiByteToWideChar(CP_OEMCP, 0, dirA, -1, dirW, MAX_PATH);
if (!RemoveDirectoryW( dirW ))
bSetDOSExtendedError = TRUE;
}
break;
case 0x3b: /* LONG FILENAME - CHANGE DIRECTORY */
INT_Int21Handler( context );
break;
case 0x41: /* LONG FILENAME - DELETE FILE */
{
WCHAR fileW[MAX_PATH];
char *fileA = CTX_SEG_OFF_TO_LIN(context,
context->SegDs, context->Edx);
TRACE( "LONG FILENAME - DELETE FILE %s\n", fileA );
MultiByteToWideChar(CP_OEMCP, 0, fileA, -1, fileW, MAX_PATH);
if (!DeleteFileW( fileW ))
bSetDOSExtendedError = TRUE;
}
break;
case 0x43: /* LONG FILENAME - EXTENDED GET/SET FILE ATTRIBUTES */
case 0x47: /* LONG FILENAME - GET CURRENT DIRECTORY */
case 0x4e: /* LONG FILENAME - FIND FIRST MATCHING FILE */
case 0x4f: /* LONG FILENAME - FIND NEXT MATCHING FILE */
INT_Int21Handler( context );
break;
case 0x56: /* LONG FILENAME - RENAME FILE */
{
WCHAR fromW[MAX_PATH];
WCHAR toW[MAX_PATH];
char *fromA = CTX_SEG_OFF_TO_LIN(context,
context->SegDs,context->Edx);
char *toA = CTX_SEG_OFF_TO_LIN(context,
context->SegEs,context->Edi);
TRACE( "LONG FILENAME - RENAME FILE %s to %s\n", fromA, toA );
MultiByteToWideChar(CP_OEMCP, 0, fromA, -1, fromW, MAX_PATH);
MultiByteToWideChar(CP_OEMCP, 0, toA, -1, toW, MAX_PATH);
if (!MoveFileW( fromW, toW ))
bSetDOSExtendedError = TRUE;
}
break;
case 0x60: /* LONG FILENAME - CONVERT PATH */
case 0x6c: /* LONG FILENAME - CREATE OR OPEN FILE */
case 0xa0: /* LONG FILENAME - GET VOLUME INFORMATION */
case 0xa1: /* LONG FILENAME - "FindClose" - TERMINATE DIRECTORY SEARCH */
case 0xa6: /* LONG FILENAME - GET FILE INFO BY HANDLE */
case 0xa7: /* LONG FILENAME - CONVERT TIME */
case 0xa8: /* LONG FILENAME - GENERATE SHORT FILENAME */
case 0xa9: /* LONG FILENAME - SERVER CREATE OR OPEN FILE */
case 0xaa: /* LONG FILENAME - SUBST */
INT_Int21Handler( context );
break;
default:
INT_BARF( context, 0x21 );
}
if (bSetDOSExtendedError)
{
SET_AX( context, GetLastError() );
SET_CFLAG( context );
}
}
/***********************************************************************
* INT21_GetExtendedError
*/
@ -1244,11 +1349,36 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
break;
case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */
case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */
INT_Int21Handler( context );
break;
case 0x3a: /* "RMDIR" - REMOVE DIRECTORY */
{
WCHAR dirW[MAX_PATH];
char *dirA = CTX_SEG_OFF_TO_LIN(context,
context->SegDs, context->Edx);
TRACE( "REMOVE DIRECTORY %s\n", dirA );
MultiByteToWideChar(CP_OEMCP, 0, dirA, -1, dirW, MAX_PATH);
if (!RemoveDirectoryW( dirW ))
bSetDOSExtendedError = TRUE;
}
break;
case 0x3b: /* "CHDIR" - SET CURRENT DIRECTORY */
case 0x3c: /* "CREAT" - CREATE OR TRUNCATE FILE */
case 0x3d: /* "OPEN" - OPEN EXISTING FILE */
INT_Int21Handler( context );
break;
case 0x3e: /* "CLOSE" - CLOSE FILE */
TRACE( "CLOSE handle %d\n", BX_reg(context) );
if (_lclose16( BX_reg(context) ) == HFILE_ERROR16)
bSetDOSExtendedError = TRUE;
break;
case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */
INT_Int21Handler( context );
break;
@ -1280,6 +1410,20 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
break;
case 0x41: /* "UNLINK" - DELETE FILE */
{
WCHAR fileW[MAX_PATH];
char *fileA = CTX_SEG_OFF_TO_LIN(context,
context->SegDs,
context->Edx);
TRACE( "UNLINK %s\n", fileA );
MultiByteToWideChar(CP_OEMCP, 0, fileA, -1, fileW, MAX_PATH);
if (!DeleteFileW( fileW ))
bSetDOSExtendedError = TRUE;
}
break;
case 0x42: /* "LSEEK" - SET CURRENT FILE POSITION */
case 0x43: /* FILE ATTRIBUTES */
INT_Int21Handler( context );
@ -1310,6 +1454,12 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
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) );
if (FILE_Dup2( BX_reg(context), CX_reg(context) ) == HFILE_ERROR16)
bSetDOSExtendedError = TRUE;
break;
case 0x47: /* "CWD" - GET CURRENT DIRECTORY */
INT_Int21Handler( context );
break;
@ -1467,7 +1617,21 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
break;
case 0x56: /* "RENAME" - RENAME FILE */
INT_Int21Handler( context );
{
WCHAR fromW[MAX_PATH];
WCHAR toW[MAX_PATH];
char *fromA = CTX_SEG_OFF_TO_LIN(context,
context->SegDs,context->Edx);
char *toA = CTX_SEG_OFF_TO_LIN(context,
context->SegEs,context->Edi);
TRACE( "RENAME %s to %s\n", fromA, toA );
MultiByteToWideChar(CP_OEMCP, 0, fromA, -1, fromW, MAX_PATH);
MultiByteToWideChar(CP_OEMCP, 0, toA, -1, toW, MAX_PATH);
if (!MoveFileW( fromW, toW ))
bSetDOSExtendedError = TRUE;
}
break;
case 0x57: /* FILE DATE AND TIME */
@ -1632,7 +1796,7 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
break;
case 0x71: /* MSDOS 7 - LONG FILENAME FUNCTIONS */
INT_Int21Handler( context );
INT21_LongFilename( context );
break;
case 0x73: /* MSDOS7 - FAT32 */

View File

@ -1041,13 +1041,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
}
break;
case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */
TRACE("RMDIR %s\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx));
bSetDOSExtendedError = (!RemoveDirectory16( CTX_SEG_OFF_TO_LIN(context, context->SegDs,
context->Edx )));
break;
case 0x3b: /* "CHDIR" - SET CURRENT DIRECTORY */
TRACE("CHDIR %s\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx));
@ -1066,12 +1059,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
OpenExistingFile(context);
break;
case 0x3e: /* "CLOSE" - CLOSE FILE */
TRACE("CLOSE handle %d\n",BX_reg(context));
SET_AX( context, _lclose16( BX_reg(context) ));
bSetDOSExtendedError = (AX_reg(context) != 0);
break;
case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */
TRACE("READ from %d to %04lX:%04X for %d byte\n",BX_reg(context),
context->SegDs,DX_reg(context),CX_reg(context) );
@ -1091,13 +1078,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
}
break;
case 0x41: /* "UNLINK" - DELETE FILE */
TRACE("UNLINK %s\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx));
bSetDOSExtendedError = (!DeleteFileA( CTX_SEG_OFF_TO_LIN(context, context->SegDs,
context->Edx )));
break;
case 0x42: /* "LSEEK" - SET CURRENT FILE POSITION */
TRACE("LSEEK handle %d offset %ld from %s\n",
BX_reg(context), MAKELONG(DX_reg(context),CX_reg(context)),
@ -1241,12 +1221,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
}
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));
bSetDOSExtendedError = (FILE_Dup2( BX_reg(context), CX_reg(context) ) == HFILE_ERROR16);
break;
case 0x47: /* "CWD" - GET CURRENT DIRECTORY */
TRACE("CWD - GET CURRENT DIRECTORY for drive %s\n",
INT21_DriveName( DL_reg(context)));
@ -1270,15 +1244,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
else SET_AX( context, 0 ); /* OK */
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 0x5a: /* CREATE TEMPORARY FILE */
TRACE("CREATE TEMPORARY FILE\n");
bSetDOSExtendedError = !INT21_CreateTempFile(context);
@ -1366,12 +1331,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
break;
case 0x71: /* MS-DOS 7 (Windows95) - LONG FILENAME FUNCTIONS */
if ((GetVersion()&0xC0000004)!=0xC0000004) {
/* not supported on anything but Win95 */
TRACE("LONG FILENAME functions supported only by win95\n");
SET_CFLAG(context);
SET_AL( context, 0 );
} else
switch(AL_reg(context))
{
case 0x39: /* Create directory */
@ -1396,13 +1355,7 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
}
}
break;
case 0x3a: /* Remove directory */
TRACE("LONG FILENAME - REMOVE DIRECTORY %s\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx));
bSetDOSExtendedError = (!RemoveDirectoryA(
CTX_SEG_OFF_TO_LIN(context, context->SegDs,
context->Edx )));
break;
case 0x43: /* Get/Set file attributes */
TRACE("LONG FILENAME -EXTENDED GET/SET FILE ATTRIBUTES %s\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx));
@ -1527,29 +1480,7 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
SET_AL( context, GetLastError() );
}
break;
case 0x41: /* Delete file */
TRACE("LONG FILENAME - DELETE FILE %s\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx));
if (!DeleteFileA(CTX_SEG_OFF_TO_LIN(context,
context->SegDs,
context->Edx)
)) {
SET_CFLAG(context);
SET_AL( context, GetLastError() );
}
break;
case 0x56: /* Move (rename) file */
{
LPCSTR fn1 = (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx);
LPCSTR fn2 = (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Edi);
TRACE("LONG FILENAME - RENAME FILE %s to %s\n", fn1, fn2);
if (!MoveFileA(fn1, fn2))
{
SET_CFLAG(context);
SET_AL( context, GetLastError() );
}
}
break;
default:
FIXME("Unimplemented long file name function:\n");
INT_BARF( context, 0x21 );