Add prototype for GetCompressedFileSize. Move some int21 functions to
winedos. Improve file attribute functions.
diff --git a/dlls/winedos/int21.c b/dlls/winedos/int21.c
index 7fc6be5..de9de7f 100644
--- a/dlls/winedos/int21.c
+++ b/dlls/winedos/int21.c
@@ -43,6 +43,11 @@
*/
extern void WINAPI INT_Int21Handler( CONTEXT86 *context );
+/*
+ * Forward declarations.
+ */
+static BOOL INT21_RenameFile( CONTEXT86 *context );
+
WINE_DEFAULT_DEBUG_CHANNEL(int21);
@@ -358,6 +363,49 @@
/***********************************************************************
+ * INT21_CreateDirectory
+ *
+ * Handler for:
+ * - function 0x39
+ * - subfunction 0x39 of function 0x71
+ * - subfunction 0xff of function 0x43 (CL == 0x39)
+ */
+static BOOL INT21_CreateDirectory( CONTEXT86 *context )
+{
+ WCHAR dirW[MAX_PATH];
+ char *dirA = CTX_SEG_OFF_TO_LIN(context,
+ context->SegDs,
+ context->Edx);
+
+ TRACE( "CREATE DIRECTORY %s\n", dirA );
+
+ MultiByteToWideChar(CP_OEMCP, 0, dirA, -1, dirW, MAX_PATH);
+
+ if (CreateDirectoryW(dirW, NULL))
+ return TRUE;
+
+ /*
+ * FIXME: CreateDirectory's LastErrors will clash with the ones
+ * used by DOS. AH=39 only returns 3 (path not found) and
+ * 5 (access denied), while CreateDirectory return several
+ * ones. Remap some of them. -Marcus
+ */
+ switch (GetLastError())
+ {
+ case ERROR_ALREADY_EXISTS:
+ case ERROR_FILENAME_EXCED_RANGE:
+ case ERROR_DISK_FULL:
+ SetLastError(ERROR_ACCESS_DENIED);
+ break;
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+
+/***********************************************************************
* INT21_ExtendedCountryInformation
*
* Handler for function 0x65.
@@ -479,6 +527,257 @@
/***********************************************************************
+ * INT21_FileAttributes
+ *
+ * Handler for:
+ * - function 0x43
+ * - subfunction 0x43 of function 0x71
+ */
+static BOOL INT21_FileAttributes( CONTEXT86 *context,
+ BYTE subfunction,
+ BOOL islong )
+{
+ WCHAR fileW[MAX_PATH];
+ char *fileA = CTX_SEG_OFF_TO_LIN(context,
+ context->SegDs,
+ context->Edx);
+ HANDLE handle;
+ BOOL status;
+ FILETIME filetime;
+ DWORD result;
+ WORD date, time;
+
+ switch (subfunction)
+ {
+ case 0x00: /* GET FILE ATTRIBUTES */
+ TRACE( "GET FILE ATTRIBUTES for %s\n", fileA );
+ MultiByteToWideChar(CP_OEMCP, 0, fileA, -1, fileW, MAX_PATH);
+
+ result = GetFileAttributesW( fileW );
+ if (result == -1)
+ return FALSE;
+ else
+ {
+ SET_CX( context, (WORD)result );
+ if (!islong)
+ SET_AX( context, (WORD)result ); /* DR DOS */
+ }
+ break;
+
+ case 0x01: /* SET FILE ATTRIBUTES */
+ TRACE( "SET FILE ATTRIBUTES 0x%02x for %s\n",
+ CX_reg(context), fileA );
+ MultiByteToWideChar(CP_OEMCP, 0, fileA, -1, fileW, MAX_PATH);
+
+ if (!SetFileAttributesW( fileW, CX_reg(context) ))
+ return FALSE;
+ break;
+
+ case 0x02: /* GET COMPRESSED FILE SIZE */
+ TRACE( "GET COMPRESSED FILE SIZE for %s\n", fileA );
+ MultiByteToWideChar(CP_OEMCP, 0, fileA, -1, fileW, MAX_PATH);
+
+ result = GetCompressedFileSizeW( fileW, NULL );
+ if (result == INVALID_FILE_SIZE)
+ return FALSE;
+ else
+ {
+ SET_AX( context, LOWORD(result) );
+ SET_DX( context, HIWORD(result) );
+ }
+ break;
+
+ case 0x03: /* SET FILE LAST-WRITTEN DATE AND TIME */
+ if (!islong)
+ INT_BARF( context, 0x21 );
+ else
+ {
+ TRACE( "SET FILE LAST-WRITTEN DATE AND TIME, file %s\n", fileA );
+ MultiByteToWideChar(CP_OEMCP, 0, fileA, -1, fileW, MAX_PATH);
+
+ handle = CreateFileW( fileW, GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, 0 );
+ if (handle == INVALID_HANDLE_VALUE)
+ return FALSE;
+
+ DosDateTimeToFileTime( DI_reg(context),
+ CX_reg(context),
+ &filetime );
+ status = SetFileTime( handle, NULL, NULL, &filetime );
+
+ CloseHandle( handle );
+ return status;
+ }
+ break;
+
+ case 0x04: /* GET FILE LAST-WRITTEN DATE AND TIME */
+ if (!islong)
+ INT_BARF( context, 0x21 );
+ else
+ {
+ TRACE( "GET FILE LAST-WRITTEN DATE AND TIME, file %s\n", fileA );
+ MultiByteToWideChar(CP_OEMCP, 0, fileA, -1, fileW, MAX_PATH);
+
+ handle = CreateFileW( fileW, GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, 0 );
+ if (handle == INVALID_HANDLE_VALUE)
+ return FALSE;
+
+ status = GetFileTime( handle, NULL, NULL, &filetime );
+ if (status)
+ {
+ FileTimeToDosDateTime( &filetime, &date, &time );
+ SET_DI( context, date );
+ SET_CX( context, time );
+ }
+
+ CloseHandle( handle );
+ return status;
+ }
+ break;
+
+ case 0x05: /* SET FILE LAST ACCESS DATE */
+ if (!islong)
+ INT_BARF( context, 0x21 );
+ else
+ {
+ TRACE( "SET FILE LAST ACCESS DATE, file %s\n", fileA );
+ MultiByteToWideChar(CP_OEMCP, 0, fileA, -1, fileW, MAX_PATH);
+
+ handle = CreateFileW( fileW, GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, 0 );
+ if (handle == INVALID_HANDLE_VALUE)
+ return FALSE;
+
+ DosDateTimeToFileTime( DI_reg(context),
+ 0,
+ &filetime );
+ status = SetFileTime( handle, NULL, &filetime, NULL );
+
+ CloseHandle( handle );
+ return status;
+ }
+ break;
+
+ case 0x06: /* GET FILE LAST ACCESS DATE */
+ if (!islong)
+ INT_BARF( context, 0x21 );
+ else
+ {
+ TRACE( "GET FILE LAST ACCESS DATE, file %s\n", fileA );
+ MultiByteToWideChar(CP_OEMCP, 0, fileA, -1, fileW, MAX_PATH);
+
+ handle = CreateFileW( fileW, GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, 0 );
+ if (handle == INVALID_HANDLE_VALUE)
+ return FALSE;
+
+ status = GetFileTime( handle, NULL, &filetime, NULL );
+ if (status)
+ {
+ FileTimeToDosDateTime( &filetime, &date, NULL );
+ SET_DI( context, date );
+ }
+
+ CloseHandle( handle );
+ return status;
+ }
+ break;
+
+ case 0x07: /* SET FILE CREATION DATE AND TIME */
+ if (!islong)
+ INT_BARF( context, 0x21 );
+ else
+ {
+ TRACE( "SET FILE CREATION DATE AND TIME, file %s\n", fileA );
+
+ handle = CreateFileW( fileW, GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, 0 );
+ if (handle == INVALID_HANDLE_VALUE)
+ return FALSE;
+
+ /*
+ * FIXME: SI has number of 10-millisecond units past time in CX.
+ */
+ DosDateTimeToFileTime( DI_reg(context),
+ CX_reg(context),
+ &filetime );
+ status = SetFileTime( handle, &filetime, NULL, NULL );
+
+ CloseHandle( handle );
+ return status;
+ }
+ break;
+
+ case 0x08: /* GET FILE CREATION DATE AND TIME */
+ if (!islong)
+ INT_BARF( context, 0x21 );
+ else
+ {
+ TRACE( "GET FILE CREATION DATE AND TIME, handle %d\n",
+ BX_reg(context) );
+
+ handle = CreateFileW( fileW, GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, 0 );
+ if (handle == INVALID_HANDLE_VALUE)
+ return FALSE;
+
+ status = GetFileTime( handle, &filetime, NULL, NULL );
+ if (status)
+ {
+ FileTimeToDosDateTime( &filetime, &date, &time );
+ SET_DI( context, date );
+ SET_CX( context, time );
+ /*
+ * FIXME: SI has number of 10-millisecond units past
+ * time in CX.
+ */
+ SET_SI( context, 0 );
+ }
+
+ CloseHandle(handle);
+ return status;
+ }
+ break;
+
+ case 0xff: /* EXTENDED-LENGTH FILENAME OPERATIONS */
+ if (islong || context->Ebp != 0x5053)
+ INT_BARF( context, 0x21 );
+ else
+ {
+ switch(CL_reg(context))
+ {
+ case 0x39:
+ if (!INT21_CreateDirectory( context ))
+ return FALSE;
+ break;
+
+ case 0x56:
+ if (!INT21_RenameFile( context ))
+ return FALSE;
+ break;
+
+ default:
+ INT_BARF( context, 0x21 );
+ }
+ }
+ break;
+
+ default:
+ INT_BARF( context, 0x21 );
+ }
+
+ return TRUE;
+}
+
+
+/***********************************************************************
* INT21_FileDateTime
*
* Handler for function 0x57.
@@ -751,10 +1050,14 @@
switch (AL_reg(context))
{
case 0x0d: /* RESET DRIVE */
- case 0x39: /* LONG FILENAME - MAKE DIRECTORY */
INT_Int21Handler( context );
break;
+ case 0x39: /* LONG FILENAME - MAKE DIRECTORY */
+ if (!INT21_CreateDirectory( context ))
+ bSetDOSExtendedError = TRUE;
+ break;
+
case 0x3a: /* LONG FILENAME - REMOVE DIRECTORY */
{
WCHAR dirW[MAX_PATH];
@@ -788,6 +1091,10 @@
break;
case 0x43: /* LONG FILENAME - EXTENDED GET/SET FILE ATTRIBUTES */
+ if (!INT21_FileAttributes( context, BL_reg(context), TRUE ))
+ bSetDOSExtendedError = TRUE;
+ break;
+
case 0x47: /* LONG FILENAME - GET CURRENT DIRECTORY */
case 0x4e: /* LONG FILENAME - FIND FIRST MATCHING FILE */
case 0x4f: /* LONG FILENAME - FIND NEXT MATCHING FILE */
@@ -795,21 +1102,8 @@
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;
- }
+ if (!INT21_RenameFile(context))
+ bSetDOSExtendedError = TRUE;
break;
case 0x60: /* LONG FILENAME - CONVERT PATH */
@@ -837,6 +1131,31 @@
/***********************************************************************
+ * INT21_RenameFile
+ *
+ * Handler for:
+ * - function 0x56
+ * - subfunction 0x56 of function 0x71
+ * - subfunction 0xff of function 0x43 (CL == 0x56)
+ */
+static BOOL INT21_RenameFile( CONTEXT86 *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 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);
+
+ return MoveFileW( fromW, toW );
+}
+
+
+/***********************************************************************
* INT21_GetExtendedError
*/
static void INT21_GetExtendedError( CONTEXT86 *context )
@@ -1349,7 +1668,8 @@
break;
case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */
- INT_Int21Handler( context );
+ if (!INT21_CreateDirectory( context ))
+ bSetDOSExtendedError = TRUE;
break;
case 0x3a: /* "RMDIR" - REMOVE DIRECTORY */
@@ -1380,7 +1700,38 @@
break;
case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */
- INT_Int21Handler( context );
+ TRACE( "READ from %d to %04lX:%04X for %d bytes\n",
+ BX_reg(context),
+ context->SegDs,
+ DX_reg(context),
+ CX_reg(context) );
+ {
+ DWORD result;
+ WORD count = CX_reg(context);
+ BYTE *buffer = CTX_SEG_OFF_TO_LIN( context,
+ context->SegDs,
+ context->Edx );
+
+ /* Some programs pass a count larger than the allocated buffer */
+ if (DOSVM_IsWin16())
+ {
+ WORD maxcount = GetSelectorLimit16( context->SegDs )
+ - DX_reg(context) + 1;
+ if (count > maxcount)
+ count = maxcount;
+ }
+
+ /*
+ * FIXME: Reading from console (BX=1) in DOS mode
+ * does not work as it is supposed to work.
+ */
+
+ if (ReadFile( DosFileHandleToWin32Handle(BX_reg(context)),
+ buffer, count, &result, NULL ))
+ SET_AX( context, (WORD)result );
+ else
+ bSetDOSExtendedError = TRUE;
+ }
break;
case 0x40: /* "WRITE" - WRITE TO FILE OR DEVICE */
@@ -1425,8 +1776,30 @@
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) ),
+ (AL_reg(context) == 0) ?
+ "start of file" : ((AL_reg(context) == 1) ?
+ "current file position" : "end of file") );
+ {
+ HANDLE handle = DosFileHandleToWin32Handle(BX_reg(context));
+ LONG offset = MAKELONG( DX_reg(context), CX_reg(context) );
+ DWORD status = SetFilePointer( handle, offset,
+ NULL, AL_reg(context) );
+ if (status == INVALID_SET_FILE_POINTER)
+ bSetDOSExtendedError = TRUE;
+ else
+ {
+ SET_AX( context, LOWORD(status) );
+ SET_DX( context, HIWORD(status) );
+ }
+ }
+ break;
+
case 0x43: /* FILE ATTRIBUTES */
- INT_Int21Handler( context );
+ if (!INT21_FileAttributes( context, AL_reg(context), FALSE ))
+ bSetDOSExtendedError = TRUE;
break;
case 0x44: /* IOCTL */
@@ -1617,21 +1990,8 @@
break;
case 0x56: /* "RENAME" - 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( "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;
- }
+ if (!INT21_RenameFile( context ))
+ bSetDOSExtendedError = TRUE;
break;
case 0x57: /* FILE DATE AND TIME */
diff --git a/include/winbase.h b/include/winbase.h
index 89a1e06..a1893e3 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -1300,6 +1300,9 @@
LPSTR WINAPI GetCommandLineA(void);
LPWSTR WINAPI GetCommandLineW(void);
#define GetCommandLine WINELIB_NAME_AW(GetCommandLine)
+DWORD WINAPI GetCompressedFileSizeA(LPCSTR,LPDWORD);
+DWORD WINAPI GetCompressedFileSizeW(LPCWSTR,LPDWORD);
+#define GetCompressedFileSize WINELIB_NAME_AW(GetCompressedFileSize)
BOOL WINAPI GetComputerNameA(LPSTR,LPDWORD);
BOOL WINAPI GetComputerNameW(LPWSTR,LPDWORD);
#define GetComputerName WINELIB_NAME_AW(GetComputerName)
diff --git a/msdos/int21.c b/msdos/int21.c
index 41914e2..157df72 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -1020,28 +1020,6 @@
if (!INT21_GetFreeDiskSpace(context)) SET_AX( context, 0xffff );
break;
- case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */
- TRACE("MKDIR %s\n",
- (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx));
- bSetDOSExtendedError = (!CreateDirectory16( CTX_SEG_OFF_TO_LIN(context, context->SegDs,
- context->Edx ), NULL));
- /* FIXME: CreateDirectory's LastErrors will clash with the ones
- * used by dos. AH=39 only returns 3 (path not found) and 5 (access
- * denied), while CreateDirectory return several ones. remap some of
- * them. -Marcus
- */
- if (bSetDOSExtendedError) {
- switch (GetLastError()) {
- case ERROR_ALREADY_EXISTS:
- case ERROR_FILENAME_EXCED_RANGE:
- case ERROR_DISK_FULL:
- SetLastError(ERROR_ACCESS_DENIED);
- break;
- default: break;
- }
- }
- break;
-
case 0x3b: /* "CHDIR" - SET CURRENT DIRECTORY */
TRACE("CHDIR %s\n",
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx));
@@ -1060,69 +1038,6 @@
OpenExistingFile(context);
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) );
- {
- LONG result;
- if (ISV86(context))
- result = _hread16( BX_reg(context),
- CTX_SEG_OFF_TO_LIN(context, context->SegDs,
- context->Edx ),
- CX_reg(context) );
- else
- result = WIN16_hread( BX_reg(context),
- MAKESEGPTR( context->SegDs, context->Edx ),
- CX_reg(context) );
- if (result == -1) bSetDOSExtendedError = TRUE;
- else SET_AX( context, (WORD)result );
- }
- 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)),
- (AL_reg(context)==0)?"start of file":(AL_reg(context)==1)?
- "current file position":"end of file");
- {
- LONG status = _llseek16( BX_reg(context),
- MAKELONG(DX_reg(context),CX_reg(context)),
- AL_reg(context) );
- if (status == -1) bSetDOSExtendedError = TRUE;
- else
- {
- SET_AX( context, LOWORD(status) );
- SET_DX( context, HIWORD(status) );
- }
- }
- 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))
{
@@ -1334,55 +1249,6 @@
case 0x71: /* MS-DOS 7 (Windows95) - LONG FILENAME FUNCTIONS */
switch(AL_reg(context))
{
- case 0x39: /* Create directory */
- TRACE("LONG FILENAME - MAKE DIRECTORY %s\n",
- (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx));
- bSetDOSExtendedError = (!CreateDirectoryA(
- CTX_SEG_OFF_TO_LIN(context, context->SegDs,
- context->Edx ), NULL));
- /* FIXME: CreateDirectory's LastErrors will clash with the ones
- * used by dos. AH=39 only returns 3 (path not found) and 5 (access
- * denied), while CreateDirectory return several ones. remap some of
- * them. -Marcus
- */
- if (bSetDOSExtendedError) {
- switch (GetLastError()) {
- case ERROR_ALREADY_EXISTS:
- case ERROR_FILENAME_EXCED_RANGE:
- case ERROR_DISK_FULL:
- SetLastError(ERROR_ACCESS_DENIED);
- break;
- default: break;
- }
- }
- 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));
- switch (BL_reg(context))
- {
- case 0x00: /* Get file attributes */
- TRACE("\tretrieve attributes\n");
- SET_CX( context, GetFileAttributesA( CTX_SEG_OFF_TO_LIN(context, context->SegDs,
- context->Edx)));
- if (CX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE;
- break;
- case 0x01:
- TRACE("\tset attributes 0x%04x\n",CX_reg(context));
- bSetDOSExtendedError = (!SetFileAttributesA(
- CTX_SEG_OFF_TO_LIN(context, context->SegDs,
- context->Edx),
- CX_reg(context) ) );
- break;
- default:
- FIXME("Unimplemented long file name function:\n");
- INT_BARF( context, 0x21 );
- SET_CFLAG(context);
- SET_AL( context, 0 );
- break;
- }
- break;
case 0x47: /* Get current directory */
TRACE(" LONG FILENAME - GET CURRENT DIRECTORY for drive %s\n",
INT21_DriveName(DL_reg(context)));