ChangeLog: * dlls/winedos/int21.c * msdos/int21.c - Move the file handle functions to winedos. - Move Select defalut drive to winedos.
--- msdos/int21.c.a7 2002-11-09 11:43:23.000000000 +0200 +++ msdos/int21.c 2002-11-09 13:26:09.000000000 +0200 @@ -742,12 +742,6 @@ break; } - case 0x0e: /* SELECT DEFAULT DRIVE */ - TRACE("SELECT DEFAULT DRIVE %d\n", DL_reg(context)); - DRIVE_SetCurrentDrive( DL_reg(context) ); - SET_AL( context, MAX_DOS_DRIVES ); - break; - case 0x11: /* FIND FIRST MATCHING FILE USING FCB */ TRACE("FIND FIRST MATCHING FILE USING FCB %p\n", CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); @@ -836,73 +830,6 @@ bSetDOSExtendedError = !INT21_ChangeDir(context); break; - case 0x3c: /* "CREAT" - CREATE OR TRUNCATE FILE */ - TRACE("CREAT flag 0x%02x %s\n",CX_reg(context), - (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); - bSetDOSExtendedError = INT21_CreateFile( context ); - break; - - case 0x3d: /* "OPEN" - OPEN EXISTING FILE */ - TRACE("OPEN mode 0x%02x %s\n",AL_reg(context), - (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); - OpenExistingFile(context); - break; - - case 0x3e: /* "CLOSE" - CLOSE FILE */ - TRACE("CLOSE handle %d\n",BX_reg(context)); - bSetDOSExtendedError = ((SET_AX( context, _lclose16( BX_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) ); - { - 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 0x40: /* "WRITE" - WRITE TO FILE OR DEVICE */ - TRACE("WRITE from %04lX:%04X to handle %d for %d byte\n", - context->SegDs,DX_reg(context),BX_reg(context),CX_reg(context) ); - { - LONG result = _hwrite16( BX_reg(context), - CTX_SEG_OFF_TO_LIN(context, 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 0x44: /* IOCTL */ switch (AL_reg(context)) { --- dlls/winedos/int21.c.a7 2002-11-09 11:44:55.000000000 +0200 +++ dlls/winedos/int21.c 2002-11-09 13:26:10.000000000 +0200 @@ -619,6 +619,18 @@ RESET_CFLAG(context); /* dos 6+ only */ break; + case 0x0e: /* SELECT DEFAULT DRIVE */ + { + char driveA[] = "a:"; + + *driveA += DL_reg(context); + + TRACE("SELECT DEFAULT DRIVE %d\n", DL_reg(context)); + SetCurrentDirectoryA(driveA); + SET_AL(context, MAX_DOS_DRIVES); + } + break; + case 0x13: /* DELETE FILE USING FCB */ FIXME("Delete file using FCB: stub\n"); break; @@ -818,18 +830,76 @@ SET_CFLAG(context); break; + case 0x3c: /* "CREAT" - CREATE OR TRUNCATE FILE */ + TRACE("CREAT flag 0x%02x %s\n",CX_reg(context), + (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); + { + HANDLE file =CreateFileA(CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx), + GENERIC_READ | GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, CX_reg(context), NULL); + + if(file == INVALID_HANDLE_VALUE) { + bSetDOSExtendedError = TRUE; + break; + } + SET_AX(context, Win32HandleToDosFileHandle(file)); + } + break; + + case 0x3d: /* "OPEN" - OPEN EXISTING FILE */ + TRACE("OPEN mode 0x%02x %s\n",AL_reg(context), + (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); + { + HANDLE file =CreateFileA(CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx), + GENERIC_READ | GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, 0, NULL); + + if(file == INVALID_HANDLE_VALUE) { + TRACE("Open failed\n"); + bSetDOSExtendedError = TRUE; + break; + } + SET_AX(context, Win32HandleToDosFileHandle(file)); + } + break; + + case 0x3e: /* "CLOSE" - CLOSE FILE */ + TRACE("CLOSE handle %d\n", BX_reg(context)); + if(!CloseHandle(DosFileHandleToWin32Handle(BX_reg(context)))) + bSetDOSExtendedError = TRUE; + 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) ); + { + DWORD read; + if(!ReadFile(DosFileHandleToWin32Handle(BX_reg(context)), + CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx), CX_reg(context), + &read, NULL)) { + TRACE("Read failed %ld\n", GetLastError()); + bSetDOSExtendedError = TRUE; + } else + SET_AX(context, read); + } + break; + case 0x40: /* WRITE TO FILE OR DEVICE */ - /* Writes to stdout are handled here. */ - if (BX_reg(context) == 1) { - BYTE *ptr = CTX_SEG_OFF_TO_LIN(context, - context->SegDs, - context->Edx); - int i; - - for(i=0; i<CX_reg(context); i++) - DOSVM_PutChar(ptr[i]); - } else - DOS3Call( context ); + TRACE("WRITE from %04lX:%04X to handle %d for %d byte\n", + context->SegDs, DX_reg(context), BX_reg(context), CX_reg(context)); + { + DWORD wrote; + if(!WriteFile(DosFileHandleToWin32Handle(BX_reg(context)), + CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx), CX_reg(context), + &wrote, NULL)) + bSetDOSExtendedError = TRUE; + else + SET_AX(context, wrote); + } break; case 0x41: /* "UNLINK" - DELETE FILE */ @@ -840,6 +910,24 @@ 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)), + (AL_reg(context) == 0) ? "start of file" : (AL_reg(context) == 1)? + "current file position" : "end of file"); + { + DWORD pos; + if((pos =SetFilePointer(DosFileHandleToWin32Handle(BX_reg(context)), + MAKELONG(DX_reg(context), CX_reg(context)), NULL, + AL_reg(context))) == INVALID_SET_FILE_POINTER) + bSetDOSExtendedError = TRUE; + else { + SET_AX(context, LOWORD(pos)); + SET_DX(context, HIWORD(pos)); + } + } + break; + case 0x43: /* FILE ATTRIBUTES */ switch (AL_reg(context)) {