예제 #1
0
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;
}
예제 #2
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;
}
예제 #3
0
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;
}
예제 #4
0
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;
}
예제 #5
0
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;
}
예제 #6
0
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;
}
예제 #7
0
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;
}