static int mediacheck (struct dev_info_spti *di, int unitnum) { uae_u8 cmd [6] = { 0,0,0,0,0,0 }; /* TEST UNIT READY */ if (di->open == false) return -1; int v = execscsicmd (di, unitnum, cmd, sizeof cmd, 0, 0); return v >= 0 ? 1 : 0; }
static const uae_u8 *execscsicmd_out (int unitnum, const uae_u8 *data, int len) { DEBUG_LOG ("SCSIDEV: unit=%d: execscsicmd_out\n", unitnum); if (execscsicmd (unitnum, data, len, 0, 0) < 0) return 0; return data; }
static uae_u8 *execscsicmd_out (int unitnum, uae_u8 *data, int len) { struct dev_info_spti *di = unitisopen (unitnum); if (!di) return 0; int v = execscsicmd (di, unitnum, data, len, 0, 0); if (v < 0) return 0; return data; }
static uae_u8 *execscsicmd_in_internal (struct dev_info_spti *di, int unitnum, uae_u8 *data, int len, int *outlen) { int v = execscsicmd (di, unitnum, data, len, di->scsibuf, DEVICE_SCSI_BUFSIZE); if (v < 0) return 0; if (v == 0) return 0; if (outlen) *outlen = v; return di->scsibuf; }
static uae_u8 *execscsicmd_in (int unitnum, uae_u8 *data, int len, int *outlen) { struct dev_info_spti *di = unitisopen (unitnum); if (!di) return 0; int v = execscsicmd (di, unitnum, data, len, di->scsibuf, DEVICE_SCSI_BUFSIZE); if (v < 0) return 0; if (v == 0) return 0; if (outlen) *outlen = v < *outlen ? v : *outlen; return di->scsibuf; }
static const uae_u8 *execscsicmd_in (int unitnum, const uae_u8 *data, int len, int *outlen) { int v; DEBUG_LOG ("SCSIDEV: unit=%d: execscsicmd_in\n", unitnum); v = execscsicmd (unitnum, data, len, scsibuf, DEVICE_SCSI_BUFSIZE); if (v < 0) return 0; if (v == 0) return 0; if (outlen) *outlen = v; return scsibuf; }
static int open_scsi_device2 (struct dev_info_spti *di, int unitnum) { HANDLE h; TCHAR *dev; if (di->bus >= 0) { dev = xmalloc (TCHAR, 100); _stprintf (dev, _T("\\\\.\\Scsi%d:"), di->bus); } else { dev = my_strdup (di->drvpath); } if (!di->scsibuf) di->scsibuf = (uae_u8*)VirtualAlloc (NULL, DEVICE_SCSI_BUFSIZE, MEM_COMMIT, PAGE_READWRITE); h = CreateFile(dev,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); di->handle = h; if (h == INVALID_HANDLE_VALUE) { write_log (_T("SPTI: failed to open unit %d err=%d ('%s')\n"), unitnum, GetLastError (), dev); } else { int err = 0; uae_u8 inqdata[INQUIRY_SIZE + 1] = { 0 }; checkcapabilities (di); execscsicmd(di, unitnum, inqdata, 6, NULL, 0, 0, &err); if (err) { write_log(_T("SPTI: TUR failed unit %d, err=%d ('%s':%d:%d:%d:%d)\n"), unitnum, err, dev, di->bus, di->path, di->target, di->lun); close_scsi_device2(di); xfree(dev); return 0; } if (!inquiry (di, unitnum, inqdata)) { write_log (_T("SPTI: inquiry failed unit %d ('%s':%d:%d:%d:%d)\n"), unitnum, dev, di->bus, di->path, di->target, di->lun); close_scsi_device2 (di); xfree (dev); return 0; } inqdata[INQUIRY_SIZE] = 0; di->name = my_strdup_ansi ((char*)inqdata + 8); if (di->type == INQ_ROMD) { // This fake CD device hangs if it sees SCSI read command. if (!memcmp(inqdata + 8, "HUAWEI Mass Storage ", 8 + 16)) { write_log(_T("SPTI: '%s' ignored.\n"), di->name); close_scsi_device2(di); xfree(dev); return 0; } di->mediainserted = mediacheck (di, unitnum); write_log (_T("SPTI: unit %d (%c:\\) opened [%s], %s, '%s'\n"), unitnum, di->drvletter ? di->drvletter : '*', di->isatapi ? _T("ATAPI") : _T("SCSI"), di->mediainserted ? _T("media inserted") : _T("drive empty"), di->name); } else { write_log (_T("SPTI: unit %d, type %d, '%s'\n"), unitnum, di->type, di->name); } di->inquirydata = xmalloc (uae_u8, INQUIRY_SIZE); memcpy (di->inquirydata, inqdata, INQUIRY_SIZE); xfree (dev); di->open = true; update_device_info (unitnum); if (di->type == INQ_ROMD) blkdev_cd_change (unitnum, di->drvletter ? di->drvlettername : di->name); return 1; } xfree (dev); return 0; }