diff -urN wine-20050930/dlls/kernel/oldconfig.c wine-20050930/dlls/kernel/oldconfig.c --- wine-20050930/dlls/kernel/oldconfig.c 2005-08-19 02:58:40.000000000 -0700 +++ wine-20050930/dlls/kernel/oldconfig.c 2007-02-25 20:32:49.000000000 -0800 @@ -287,6 +287,7 @@ static int SCSI_getprocentry( FILE * procfile, struct LinuxProcScsiDevice * dev ) { int result; + unsigned int ansirev; result = fscanf( procfile, "Host:%*1[ ]scsi%d%*1[ ]Channel:%*1[ ]%d%*1[ ]Id:%*1[ ]%d%*1[ ]Lun:%*1[ ]%d\n", @@ -316,9 +317,10 @@ } result = fscanf( procfile, - " Type:%*3[ ]%32c%*1[ ]ANSI%*1[ ]SCSI%*1[ ]revision:%*1[ ]%d\n", + " Type:%*3[ ]%32c%*1[ ]ANSI%*1[ ]SCSI%*1[ ]revision:%*1[ ]%x\n", dev->type, - &dev->ansirev ); + &ansirev ); + dev->ansirev = (ansirev > 3) ? 2 : ansirev; /* ide-scsi writes ffffffff */ if( result != 2 ) { ERR("SCSI type line scan count error\n"); diff -urN wine-20050930/dlls/ntdll/cdrom.c wine-20050930/dlls/ntdll/cdrom.c --- wine-20050930/dlls/ntdll/cdrom.c 2005-09-12 03:30:06.000000000 -0700 +++ wine-20050930/dlls/ntdll/cdrom.c 2007-02-27 11:57:43.000000000 -0800 @@ -1440,6 +1440,8 @@ scsireq_t cmd; int io; #endif + size_t i; + unsigned char *p; if (pPacket->Length < sizeof(SCSI_PASS_THROUGH_DIRECT)) return STATUS_BUFFER_TOO_SMALL; @@ -1470,6 +1472,49 @@ cmd.sbp = (unsigned char*)pPacket + pPacket->SenseInfoOffset; cmd.timeout = pPacket->TimeOutValue*1000; + /* first, print the whole CDB the Windows program passed. */ + TRACE("cdb[%d]: ", pPacket->CdbLength); + for(i = pPacket->CdbLength, p = cmd.cmdp; i != 0; i--) + TRACE("%02x ", *p++); + + /* + * then, truncate it based on the command group. yeah, well, + * what do you trust, what's ``probably right,'' or the + * intent of a Windows programmer? + */ + switch((*cmd.cmdp >> 5) & 0x7) {/* command group */ + case 0: + cmd.cmd_len = 6; + break; + case 1: + case 2: + case 6: + case 7: + cmd.cmd_len = 10; + break; + case 3: + case 4: + case 5: + cmd.cmd_len = 12; + break; + default: + WARN("logical impossibility!\n"); + cmd.cmd_len = 12; + } + if (cmd.cmd_len > pPacket->CdbLength) + cmd.cmd_len = pPacket->CdbLength; + + /* but not if the truncated part doesn't look bzero'ed */ + for(p = cmd.cmdp + cmd.cmd_len, i = pPacket->CdbLength - cmd.cmd_len; i != 0; i--) + if (*p++ != '\0') + break; + if (i != 0) + cmd.cmd_len = pPacket->CdbLength; + if (cmd.cmd_len != pPacket->CdbLength) + TRACE(", truncated to be cdb[%d] based on command group %d.\n", cmd.cmd_len, (*cmd.cmdp >> 5) & 0x7); + else + TRACE("\n"); + switch (pPacket->DataIn) { case SCSI_IOCTL_DATA_IN: @@ -1477,6 +1522,9 @@ break; case SCSI_IOCTL_DATA_OUT: cmd.dxfer_direction = SG_DXFER_TO_DEV; + TRACE("host->device data phase: "); + for (i = cmd.dxfer_len, p = cmd.dxferp; i != 0; i--) + TRACE("%02x ", *p++); break; case SCSI_IOCTL_DATA_UNSPECIFIED: cmd.dxfer_direction = SG_DXFER_NONE; @@ -1487,10 +1535,30 @@ io = ioctl(fd, SG_IO, &cmd); + switch (pPacket->DataIn) { + case SCSI_IOCTL_DATA_IN: + TRACE("device->host data phase: "); + for (i = cmd.dxfer_len - cmd.resid, p = cmd.dxferp; i != 0; i--) + TRACE("%02x ", *p++); + /* FALLTHROUGH */ + case SCSI_IOCTL_DATA_OUT: + TRACE(" (residual = %d)\n", cmd.resid); + break; + } + pPacket->ScsiStatus = cmd.status; pPacket->DataTransferLength = cmd.resid; pPacket->SenseInfoLength = cmd.sb_len_wr; + TRACE("status byte %d", cmd.status); + if (cmd.sb_len_wr != 0) { + TRACE(", sense[%d]: ", cmd.sb_len_wr); + for (i = cmd.sb_len_wr, p = cmd.sbp; i != 0; i--) + TRACE("%02x ", *p++); + } else + TRACE(", no sense requested."); + TRACE("\n"); + ret = CDROM_GetStatusCode(io); #elif defined HAVE_SCSIREQ_T_CMD