ChangeLog: * dlls/winedos/int21.c * dlls/winedos/dosexe.h * dlls/winedos/winedos.spec * msdos/int21.c * msdos/dpmi.c * include/callback.h * include/drive.h * files/drive.c Move ioctl functions to winedos nog.
--- ../readwritewine/include/callback.h 2002-11-21 09:37:00.000000000 +0200 +++ include/callback.h 2002-11-27 16:23:55.000000000 +0200 @@ -34,7 +34,6 @@ unsigned (WINAPI *GetTimer)( void ); BOOL (WINAPI *inport)( int port, int size, DWORD *res ); BOOL (WINAPI *outport)( int port, int size, DWORD val ); - void (WINAPI *ASPIHandler)( CONTEXT86 *context ); } DOSVM_TABLE; extern DOSVM_TABLE Dosvm; --- ../readwritewine/include/drive.h 2002-08-27 03:13:59.000000000 +0200 +++ include/drive.h 2002-11-27 16:22:25.000000000 +0200 @@ -54,8 +54,6 @@ extern int DRIVE_Enable( int drive ); extern int DRIVE_SetLogicalMapping ( int existing_drive, int new_drive ); extern int DRIVE_OpenDevice( int drive, int flags ); -extern int DRIVE_RawRead(BYTE drive, DWORD begin, DWORD length, BYTE *dataptr, BOOL fake_success ); -extern int DRIVE_RawWrite(BYTE drive, DWORD begin, DWORD length, BYTE *dataptr, BOOL fake_success ); extern char *DRIVE_BuildEnv(void); #endif /* __WINE_DRIVE_H */ --- ../readwritewine/files/drive.c 2002-10-25 05:32:11.000000000 +0200 +++ files/drive.c 2002-11-27 16:23:11.000000000 +0200 @@ -1225,62 +1225,6 @@ return open( DOSDrives[drive].device, flags ); } - -/*********************************************************************** - * DRIVE_RawRead - * - * Read raw sectors from a device - */ -int DRIVE_RawRead(BYTE drive, DWORD begin, DWORD nr_sect, BYTE *dataptr, BOOL fake_success) -{ - int fd; - - if ((fd = DRIVE_OpenDevice( drive, O_RDONLY )) != -1) - { - lseek( fd, begin * 512, SEEK_SET ); - /* FIXME: check errors */ - read( fd, dataptr, nr_sect * 512 ); - close( fd ); - } - else - { - memset(dataptr, 0, nr_sect * 512); - if (fake_success) - { - if (begin == 0 && nr_sect > 1) *(dataptr + 512) = 0xf8; - if (begin == 1) *dataptr = 0xf8; - } - else - return 0; - } - return 1; -} - - -/*********************************************************************** - * DRIVE_RawWrite - * - * Write raw sectors to a device - */ -int DRIVE_RawWrite(BYTE drive, DWORD begin, DWORD nr_sect, BYTE *dataptr, BOOL fake_success) -{ - int fd; - - if ((fd = DRIVE_OpenDevice( drive, O_RDONLY )) != -1) - { - lseek( fd, begin * 512, SEEK_SET ); - /* FIXME: check errors */ - write( fd, dataptr, nr_sect * 512 ); - close( fd ); - } - else - if (!(fake_success)) - return 0; - - return 1; -} - - /*********************************************************************** * DRIVE_GetFreeSpace */ --- ../readwritewine/dlls/winedos/winedos.spec 2002-11-17 09:47:59.000000000 +0200 +++ dlls/winedos/winedos.spec 2002-11-27 16:23:21.000000000 +0200 @@ -14,4 +14,3 @@ @ stdcall GetTimer() DOSVM_GetTimer @ stdcall inport(long long ptr) DOSVM_inport @ stdcall outport(long long long) DOSVM_outport -@ stdcall ASPIHandler(ptr) DOSVM_ASPIHandler --- ../readwritewine/msdos/dpmi.c 2002-11-25 08:58:13.000000000 +0200 +++ msdos/dpmi.c 2002-11-27 16:23:36.000000000 +0200 @@ -49,7 +49,6 @@ GET_ADDR(GetTimer); GET_ADDR(inport); GET_ADDR(outport); - GET_ADDR(ASPIHandler); GET_ADDR(EmulateInterruptPM); GET_ADDR(CallBuiltinHandler); #undef GET_ADDR --- msdos/int21.c.8 2002-11-27 16:10:44.000000000 +0200 +++ msdos/int21.c 2002-11-27 16:31:38.000000000 +0200 @@ -76,182 +76,6 @@ extern char TempDirectory[]; -void CreateBPB(int drive, BYTE *data, BOOL16 limited) -/* limited == TRUE is used with INT 0x21/0x440d */ -{ - if (drive > 1) { - setword(data, 512); - data[2] = 2; - setword(&data[3], 0); - data[5] = 2; - setword(&data[6], 240); - setword(&data[8], 64000); - data[0x0a] = 0xf8; - setword(&data[0x0b], 40); - setword(&data[0x0d], 56); - setword(&data[0x0f], 2); - setword(&data[0x11], 0); - if (!limited) { - setword(&data[0x1f], 800); - data[0x21] = 5; - setword(&data[0x22], 1); - } - } else { /* 1.44mb */ - setword(data, 512); - data[2] = 2; - setword(&data[3], 0); - data[5] = 2; - setword(&data[6], 240); - setword(&data[8], 2880); - data[0x0a] = 0xf8; - setword(&data[0x0b], 6); - setword(&data[0x0d], 18); - setword(&data[0x0f], 2); - setword(&data[0x11], 0); - if (!limited) { - setword(&data[0x1f], 80); - data[0x21] = 7; - setword(&data[0x22], 2); - } - } -} - -static void ioctlGetDeviceInfo( CONTEXT86 *context ) -{ - int curr_drive; - const DOS_DEVICE *dev; - - TRACE("(%d)\n", BX_reg(context)); - - RESET_CFLAG(context); - - /* DOS device ? */ - if ((dev = DOSFS_GetDeviceByHandle( DosFileHandleToWin32Handle(BX_reg(context)) ))) - { - SET_DX( context, dev->flags ); - return; - } - - /* it seems to be a file */ - curr_drive = DRIVE_GetCurrentDrive(); - SET_DX( context, 0x0140 + curr_drive + ((curr_drive > 1) ? 0x0800 : 0) ); - /* no floppy */ - /* bits 0-5 are current drive - * bit 6 - file has NOT been written..FIXME: correct? - * bit 8 - generate int24 if no diskspace on write/ read past end of file - * bit 11 - media not removable - * bit 14 - don't set file date/time on closing - * bit 15 - file is remote - */ -} - -static BOOL ioctlGenericBlkDevReq( CONTEXT86 *context ) -{ - BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx); - int drive = DOS_GET_DRIVE( BL_reg(context) ); - - if (!DRIVE_IsValid(drive)) - { - SetLastError( ERROR_FILE_NOT_FOUND ); - return TRUE; - } - - if (CH_reg(context) != 0x08) - { - INT_BARF( context, 0x21 ); - return FALSE; - } - - switch (CL_reg(context)) - { - case 0x4a: /* lock logical volume */ - TRACE("lock logical volume (%d) level %d mode %d\n",drive,BH_reg(context),DX_reg(context)); - break; - - case 0x60: /* get device parameters */ - /* used by w4wgrp's winfile */ - memset(dataptr, 0, 0x20); /* DOS 6.22 uses 0x20 bytes */ - dataptr[0] = 0x04; - dataptr[6] = 0; /* media type */ - if (drive > 1) - { - dataptr[1] = 0x05; /* fixed disk */ - setword(&dataptr[2], 0x01); /* non removable */ - setword(&dataptr[4], 0x300); /* # of cylinders */ - } - else - { - dataptr[1] = 0x07; /* block dev, floppy */ - setword(&dataptr[2], 0x02); /* removable */ - setword(&dataptr[4], 80); /* # of cylinders */ - } - CreateBPB(drive, &dataptr[7], TRUE); - RESET_CFLAG(context); - break; - - case 0x41: /* write logical device track */ - case 0x61: /* read logical device track */ - { - BYTE drive = BL_reg(context) ? - BL_reg(context) : DRIVE_GetCurrentDrive(); - WORD head = *(WORD *)dataptr+1; - WORD cyl = *(WORD *)dataptr+3; - WORD sect = *(WORD *)dataptr+5; - WORD nrsect = *(WORD *)dataptr+7; - BYTE *data = (BYTE *)dataptr+9; - int (*raw_func)(BYTE, DWORD, DWORD, BYTE *, BOOL); - - raw_func = (CL_reg(context) == 0x41) ? - DRIVE_RawWrite : DRIVE_RawRead; - - if (raw_func(drive, head*cyl*sect, nrsect, data, FALSE)) - RESET_CFLAG(context); - else - { - SET_AX( context, 0x1e ); /* read fault */ - SET_CFLAG(context); - } - } - break; - case 0x66:/* get disk serial number */ - { - char label[12],fsname[9],path[4]; - DWORD serial; - - strcpy(path,"x:\\");path[0]=drive+'A'; - GetVolumeInformationA( - path,label,12,&serial,NULL,NULL,fsname,9 - ); - *(WORD*)dataptr = 0; - memcpy(dataptr+2,&serial,4); - memcpy(dataptr+6,label ,11); - memcpy(dataptr+17,fsname,8); - } - break; - - case 0x6a: - TRACE("logical volume %d unlocked.\n",drive); - break; - - case 0x6f: - memset(dataptr+1, '\0', dataptr[0]-1); - dataptr[1] = dataptr[0]; - dataptr[2] = 0x07; /* protected mode driver; no eject; no notification */ - dataptr[3] = 0xFF; /* no physical drive */ - break; - - case 0x72: - /* Trail on error implementation */ - SET_AX( context, GetDriveType16(BL_reg(context)) == DRIVE_UNKNOWN ? 0x0f : 0x01 ); - SET_CFLAG(context); /* Seems to be set all the time */ - break; - - default: - INT_BARF( context, 0x21 ); - } - return FALSE; -} - /* Many calls translate a drive argument like this: drive number (00h = default, 01h = A:, etc) */ @@ -338,17 +162,6 @@ } } - -static void ASPI_DOS_HandleInt( CONTEXT86 *context ) -{ - if (!Dosvm.ASPIHandler && !DPMI_LoadDosSystem()) - { - ERR("could not setup ASPI handler\n"); - return; - } - Dosvm.ASPIHandler( context ); -} - /*********************************************************************** * DOS3Call (KERNEL.102) * INT_Int21Handler (WPROCS.133) @@ -384,91 +197,6 @@ case 0x44: /* IOCTL */ switch (AL_reg(context)) { - case 0x00: - ioctlGetDeviceInfo(context); - break; - - case 0x01: - break; - case 0x02:{ - const DOS_DEVICE *dev; - static const WCHAR scsimgrW[] = {'S','C','S','I','M','G','R','$',0}; - if ((dev = DOSFS_GetDeviceByHandle( DosFileHandleToWin32Handle(BX_reg(context)) )) && - !strcmpiW( dev->name, scsimgrW )) - { - ASPI_DOS_HandleInt(context); - } - break; - } - case 0x05:{ /* IOCTL - WRITE TO BLOCK DEVICE CONTROL CHANNEL */ - /*BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, context->SegDs,context->Edx);*/ - int drive = DOS_GET_DRIVE(BL_reg(context)); - - FIXME("program tried to write to block device control channel of drive %d:\n",drive); - /* for (i=0;i<CX_reg(context);i++) - fprintf(stdnimp,"%02x ",dataptr[i]); - fprintf(stdnimp,"\n");*/ - SET_AX( context, context->Ecx ); - break; - } - case 0x08: /* Check if drive is removable. */ - TRACE("IOCTL - CHECK IF BLOCK DEVICE REMOVABLE for drive %s\n", - INT21_DriveName( BL_reg(context))); - switch(GetDriveType16( DOS_GET_DRIVE( BL_reg(context) ))) - { - case DRIVE_UNKNOWN: - SetLastError( ERROR_INVALID_DRIVE ); - SET_AX( context, ERROR_INVALID_DRIVE ); - SET_CFLAG(context); - break; - case DRIVE_REMOVABLE: - SET_AX( context, 0 ); /* removable */ - break; - default: - SET_AX( context, 1 ); /* not removable */ - break; - } - break; - - case 0x09: /* CHECK IF BLOCK DEVICE REMOTE */ - TRACE("IOCTL - CHECK IF BLOCK DEVICE REMOTE for drive %s\n", - INT21_DriveName( BL_reg(context))); - switch(GetDriveType16( DOS_GET_DRIVE( BL_reg(context) ))) - { - case DRIVE_UNKNOWN: - SetLastError( ERROR_INVALID_DRIVE ); - SET_AX( context, ERROR_INVALID_DRIVE ); - SET_CFLAG(context); - break; - case DRIVE_REMOTE: - SET_DX( context, (1<<9) | (1<<12) ); /* remote */ - break; - default: - SET_DX( context, 0 ); /* FIXME: use driver attr here */ - break; - } - break; - - case 0x0a: /* check if handle (BX) is remote */ - TRACE("IOCTL - CHECK IF HANDLE %d IS REMOTE\n",BX_reg(context)); - /* returns DX, bit 15 set if remote, bit 14 set if date/time - * not set on close - */ - SET_DX( context, 0 ); - break; - - case 0x0d: - TRACE("IOCTL - GENERIC BLOCK DEVICE REQUEST %s\n", - INT21_DriveName( BL_reg(context))); - bSetDOSExtendedError = ioctlGenericBlkDevReq(context); - break; - - case 0x0e: /* get logical drive mapping */ - TRACE("IOCTL - GET LOGICAL DRIVE MAP for drive %s\n", - INT21_DriveName( BL_reg(context))); - SET_AL( context, 0 ); /* drive has no mapping - FIXME: may be wrong*/ - break; - case 0x0F: /* Set logical drive mapping */ { int drive; @@ -483,20 +211,6 @@ break; } - case 0xe0: /* Sun PC-NFS API */ - /* not installed */ - break; - - case 0x52: /* DR-DOS version */ - /* This is not DR-DOS */ - - TRACE("GET DR-DOS VERSION requested\n"); - - SET_AX( context, 0x0001 ); /* Invalid function */ - SET_CFLAG(context); /* Error */ - SetLastError( ERROR_INVALID_FUNCTION ); - break; - default: INT_BARF( context, 0x21 ); break; --- dlls/winedos/int21.c.8 2002-11-27 16:10:54.000000000 +0200 +++ dlls/winedos/int21.c 2002-11-27 16:30:39.000000000 +0200 @@ -1008,36 +1008,340 @@ return 1; } -void WINAPI DOSVM_Int21Handler_Ioctl( CONTEXT86 *context ) +/*********************************************************************** + * CreateBPB [internal] + * + * Haven't fealt like figuring out what this actually does... + * + * PARAMS: + * drive [?]: ??? + * data [?]: ??? + * limited [I]: ??? + * + * RETURNS: + * Nothing. + */ +void CreateBPB(int drive, BYTE *data, BOOL16 limited) +/* limited == TRUE is used with INT 0x21/0x440d */ { - static const WCHAR emmxxxx0W[] = {'E','M','M','X','X','X','X','0',0}; - const DOS_DEVICE *dev = DOSFS_GetDeviceByHandle( - DosFileHandleToWin32Handle(BX_reg(context)) ); - - if (dev && !strcmpiW( dev->name, emmxxxx0W )) { - EMS_Ioctl_Handler(context); - return; - } - - switch (AL_reg(context)) - { - case 0x0b: /* SET SHARING RETRY COUNT */ - TRACE("IOCTL - SET SHARING RETRY COUNT pause %d retries %d\n", - CX_reg(context), DX_reg(context)); - if (!CX_reg(context)) - { - SET_AX( context, 1 ); - SET_CFLAG(context); + if(drive > 1) { + setword(data, 512); + data[2] = 2; + setword(&data[3], 0); + data[5] = 2; + setword(&data[6], 240); + setword(&data[8], 64000); + data[0x0a] = 0xf8; + setword(&data[0x0b], 40); + setword(&data[0x0d], 56); + setword(&data[0x0f], 2); + setword(&data[0x11], 0); + if(!limited) { + setword(&data[0x1f], 800); + data[0x21] = 5; + setword(&data[0x22], 1); + } + } else { /* 1.44mb */ + setword(data, 512); + data[2] = 2; + setword(&data[3], 0); + data[5] = 2; + setword(&data[6], 240); + setword(&data[8], 2880); + data[0x0a] = 0xf8; + setword(&data[0x0b], 6); + setword(&data[0x0d], 18); + setword(&data[0x0f], 2); + setword(&data[0x11], 0); + if(!limited) { + setword(&data[0x1f], 80); + data[0x21] = 7; + setword(&data[0x22], 2); + } + } +} + +/*********************************************************************** + * DOSVM_Int21Handle_Ioctl [internal] + * + * Handles dos ioctl requests. + * + * PARAMS: + * context [I]: Pointer to structure holding registers. + * + * RETURNS: + * Nothing. + * + * NOTES: + * There is only one place that DOSFS_GetDeviceByHandle is called but it is + * a the center of most ioctls. I didn't find a windows funciton to get the + * name of a device. How can we implement this properly? + */ +void WINAPI DOSVM_Int21Handler_Ioctl(CONTEXT86 *context) +{ + static const WCHAR emmxxxx0W[] = {'E','M','M','X','X','X','X','0',0}; + const DOS_DEVICE *dev = DOSFS_GetDeviceByHandle( + DosFileHandleToWin32Handle(BX_reg(context))); int curr_drive; + + if(dev && !strcmpiW(dev->name, emmxxxx0W)) { + EMS_Ioctl_Handler(context); + return; + } + + switch (AL_reg(context)) { + case 0x00: /* GET DEVICE INFO */ + TRACE("IOCTL - GET DEVICE INFO handle: %d\n", BX_reg(context)); + + /* DOS device ? */ + if(dev) { + SET_DX(context, dev->flags); + return; + } + + /* it seems to be a file */ + curr_drive = GetDosDrive(0); + SET_DX(context, 0x0140 + curr_drive + ((curr_drive > 1) ? 0x0800 : 0)); + /* no floppy */ + /* bits 0-5 are current drive + * bit 6 - file has NOT been written..FIXME: correct? + * bit 8- generate int24 if no diskspace on write/read past end of file * bit 11 - media not removable + * bit 14 - don't set file date/time on closing + * bit 15 - file is remote + */ break; - } - DOSMEM_LOL()->sharing_retry_delay = CX_reg(context); - if (!DX_reg(context)) - DOSMEM_LOL()->sharing_retry_count = DX_reg(context); - RESET_CFLAG(context); - break; - default: - DOS3Call( context ); - } + + case 0x01: /* SET DEVICE INFORMATION */ + FIXME("IOCTL - SET DEVICE INFORMATION\n"); + break; + + case 0x02: /* READ FROM CHARACTER DEVICE */ + TRACE("IOCTL - READ FROM CHARACTER DEVICE\n"); + { + static const WCHAR scsimgrW[] = {'S','C','S','I','M','G','R','$',0}; if(dev && !strcmpiW(dev->name, scsimgrW)) { + DOSVM_ASPIHandler(context); + } else + FIXME("IOCTL - Reading from char device: %s not implemented\n", + debugstr_w(dev->name)); + } + break; + + case 0x05: /* WRITE TO BLOCK DEVICE CONTROL CHANNEL */ + { + /*BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx);*/ + FIXME("IOCTL - WRITE TO BLOCK DEVICE CONTROL CHANNEL drive: %d\n", + BX_reg(context)); + /* for (i=0;i<CX_reg(context);i++) + fprintf(stdnimp,"%02x ",dataptr[i]); + fprintf(stdnimp,"\n");*/ + SET_AX(context, context->Ecx); + break; + } + + case 0x08: /* Check if drive is removable. */ + { + char driveA[] = "A:\\"; + TRACE("IOCTL - CHECK IF BLOCK DEVICE REMOVABLE for drive %s\n", + INT21_DriveName(BL_reg(context))); + *driveA += GetDosDrive(BL_reg(context)); + + switch(GetDriveTypeA(driveA)) { + case DRIVE_UNKNOWN: + SetLastError(ERROR_INVALID_DRIVE); + SET_AX(context, ERROR_INVALID_DRIVE); + SET_CFLAG(context); + break; + case DRIVE_REMOVABLE: + SET_AX(context, 0); /* removable */ + break; + default: + SET_AX(context, 1); /* not removable */ + break; + } + } + break; + + case 0x09: /* CHECK IF BLOCK DEVICE REMOTE */ + { + char driveA[] = "A:\\"; + TRACE("IOCTL - CHECK IF BLOCK DEVICE REMOTE for drive %s\n", + INT21_DriveName( BL_reg(context))); + + *driveA += GetDosDrive(BL_reg(context)); + switch(GetDriveTypeA(driveA)) { + case DRIVE_UNKNOWN: + SetLastError(ERROR_INVALID_DRIVE); + SET_AX(context, ERROR_INVALID_DRIVE); + SET_CFLAG(context); + break; + case DRIVE_REMOTE: + SET_DX(context, (1 << 9) | (1 << 12)); /* remote */ + break; + default: + SET_DX(context, 0); /* FIXME: use driver attr here */ + break; + } + } + break; + + case 0x0a: /* check if handle (BX) is remote */ + TRACE("IOCTL - CHECK IF HANDLE %d IS REMOTE\n",BX_reg(context)); + /* returns DX, bit 15 set if remote, bit 14 set if date/time + * not set on close + */ + SET_DX(context, 0); + break; + + case 0x0b: /* SET SHARING RETRY COUNT */ + TRACE("IOCTL - SET SHARING RETRY COUNT pause %d retries %d\n", + CX_reg(context), DX_reg(context)); + if(!CX_reg(context)) { + SET_AX(context, 1); + SET_CFLAG(context); + break; + } + DOSMEM_LOL()->sharing_retry_delay = CX_reg(context); + if(!DX_reg(context)) + DOSMEM_LOL()->sharing_retry_count = DX_reg(context); + RESET_CFLAG(context); + break; + + case 0x0d: /* GENERIC BLOCK DEVICE REQUEST */ + TRACE("IOCTL - GENERIC BLOCK DEVICE REQUEST %s\n", + INT21_DriveName(BL_reg(context))); + { + BYTE *dataptr = CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx); + int drive = GetDosDrive(BL_reg(context)); + + if(!IsDriveValid(drive)) { + SetLastError(ERROR_FILE_NOT_FOUND); + break; + } + + if(CH_reg(context) != 0x08) { + INT_BARF(context, 0x21); + break; + } + + switch (CL_reg(context)) { + case 0x4a: /* lock logical volume */ + /* We could open the device and send a FSCTL_LOCK_VOLUME ictl + * but the problem is that we would have to keep the device + * open till it needs to be unlocked. If we close the device + * then it will become unlocked...*/ + FIXME("lock logical volume (%d) level %d mode %d\n", drive, + BH_reg(context), DX_reg(context)); + break; + + case 0x60: /* get device parameters */ + /* used by w4wgrp's winfile */ + memset(dataptr, 0, 0x20); /* DOS 6.22 uses 0x20 bytes */ + dataptr[0] = 0x04; + dataptr[6] = 0; /* media type */ + if(drive > 1) { + dataptr[1] = 0x05; /* fixed disk */ + setword(&dataptr[2], 0x01); /* non removable */ + setword(&dataptr[4], 0x300); /* # of cylinders */ + } else { + dataptr[1] = 0x07; /* block dev, floppy */ + setword(&dataptr[2], 0x02); /* removable */ + setword(&dataptr[4], 80); /* # of cylinders */ + } + CreateBPB(drive, &dataptr[7], TRUE); + RESET_CFLAG(context); + break; + + case 0x41: /* write logical device track */ + case 0x61: /* read logical device track */ + TRACE("%s logical device track\n", (CL_reg(context) == 0x41) ? + "Write" : "Read"); + { + BYTE drive = GetDosDrive(BL_reg(context)); + WORD head = *(WORD *)dataptr+1; + WORD cyl = *(WORD *)dataptr+3; + WORD sect = *(WORD *)dataptr+5; + WORD nrsect = *(WORD *)dataptr+7; + BYTE *data = (BYTE *)dataptr+9; + int (*raw_func)(BYTE, DWORD, DWORD, BYTE *, BOOL); + + raw_func = (CL_reg(context) == 0x41) ? DOSVM_RawWrite : + DOSVM_RawRead; + if(raw_func(drive, head*cyl*sect, nrsect, data, FALSE)) + RESET_CFLAG(context); + else { + SET_AX(context, 0x1e); /* read fault */ + SET_CFLAG(context); + } + } + break; + + case 0x66: /* get disk serial number */ + { + char label[12], fsname[9], path[4]; + DWORD serial; + + TRACE("Get disk serial number\n"); + + strcpy(path, "x:\\"); + path[0] = drive + 'A'; + GetVolumeInformationA(path, label, 12, &serial, NULL, NULL, + fsname, 9); + *(WORD*)dataptr = 0; + memcpy(dataptr + 2, &serial, 4); + memcpy(dataptr + 6, label, 11); + memcpy(dataptr + 17, fsname, 8); + } + break; + + case 0x6a: + /* We could use the FSCTL_UNLOCK_VOLUME ioctl. See the comment + * in Lock logical volume */ + FIXME("Unlock logical volume %d\n", drive); + break; + + case 0x6f: + memset(dataptr+1, '\0', dataptr[0]-1); + dataptr[1] = dataptr[0]; + dataptr[2] = 0x07; /* protected mode driver; no eject; no notification */ + dataptr[3] = 0xFF; /* no physical drive */ + break; + + case 0x72: + { + char driveA[] = "A:\\"; + /* Trail on error implementation */ + *driveA += GetDosDrive(BL_reg(context)); + SET_AX(context, GetDriveTypeA(driveA) == DRIVE_UNKNOWN ? + 0x0f : 0x01); SET_CFLAG(context); /* Seems to be set all the time */ + } + break; + + default: + INT_BARF( context, 0x21 ); + } + } + + case 0x0e: /* get logical drive mapping */ + TRACE("IOCTL - GET LOGICAL DRIVE MAP for drive %s\n", + INT21_DriveName( BL_reg(context))); + SET_AL(context, 0); /* drive has no mapping - FIXME: may be wrong */ + break; + + case 0x52: /* DR-DOS version */ + /* This is not DR-DOS */ + + TRACE("GET DR-DOS VERSION requested\n"); + + SET_AX(context, 0x0001); /* Invalid function */ + SET_CFLAG(context); /* Error */ + SetLastError(ERROR_INVALID_FUNCTION); + break; + + default: + DOS3Call(context); + break; + } } /*********************************************************************** --- dlls/winedos/dosexe.h.0 2002-11-27 18:18:54.000000000 +0200 +++ dlls/winedos/dosexe.h 2002-11-27 18:21:08.000000000 +0200 @@ -79,6 +79,9 @@ extern UINT WINAPI DOSVM_GetTimer( void ); extern void DOSVM_RealModeInterrupt( BYTE intnum, CONTEXT86 *context ); +/* dosaspi.c */ +extern void WINAPI DOSVM_ASPIHandler( CONTEXT86 *context ); + /* dosconf.c */ extern DOSCONF *DOSCONF_GetConfig();