예제 #1
0
static int open_device (int unitnum, const TCHAR *ident, int flags)
{
	struct dev_info_ioctl *ciw = NULL;
	if (ident && ident[0]) {
		for (int i = 0; i < MAX_TOTAL_SCSI_DEVICES; i++) {
			ciw = &ciw32[i];
			if (unittable[i] == 0 && ciw->drvletter != 0) {
				if (!_tcsicmp (ciw->drvlettername, ident)) {
					unittable[unitnum] = i + 1;
					if (sys_cddev_open (ciw, unitnum) == 0)
						return 1;
					unittable[unitnum] = 0;
					return 0;
				}
			}
		}
		return 0;
	}
	ciw = &ciw32[unitnum];
	for (int i = 0; i < MAX_TOTAL_SCSI_DEVICES; i++) {
		if (unittable[i] == unitnum + 1)
			return 0;
	}
	if (ciw->drvletter == 0)
		return 0;
	unittable[unitnum] = unitnum + 1;
	if (sys_cddev_open (ciw, unitnum) == 0)
		return 1;
	unittable[unitnum] = 0;
	blkdev_cd_change (unitnum, ciw->drvlettername);
	return 0;
}
예제 #2
0
static void close_scsi_device (int unitnum)
{
	struct dev_info_spti *di = unitisopen (unitnum);
	if (!di)
		return;
	close_scsi_device2 (di);
	blkdev_cd_change (unitnum, di->drvletter ? di->drvlettername : di->name);
	unittable[unitnum] = 0;
}
예제 #3
0
static void close_device (int unitnum)
{
	struct dev_info_ioctl *ciw = unitcheck (unitnum);
	if (!ciw)
		return;
	sys_cddev_close (ciw, unitnum);
	blkdev_cd_change (unitnum, ciw->drvlettername);
	unittable[unitnum] = 0;
}
예제 #4
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, L"\\\\.\\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 (L"SPTI: failed to open unit %d err=%d ('%s')\n", unitnum, GetLastError (), dev);
	} else {
		uae_u8 inqdata[INQUIRY_SIZE + 1] = { 0 };
		checkcapabilities (di);
		if (!inquiry (di, unitnum, inqdata)) {
			write_log (L"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) {
			di->mediainserted = mediacheck (di, unitnum);
			write_log (L"SPTI: unit %d (%c:\\) opened [%s], %s, '%s'\n",
				unitnum, di->drvletter ? di->drvletter : '*',
				di->isatapi ? L"ATAPI" : L"SCSI",
				di->mediainserted ? L"media inserted" : L"drive empty",
				di->name);
		} else {
			write_log (L"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;
}
예제 #5
0
void win32_spti_media_change (TCHAR driveletter, int insert)
{
	for (int i = 0; i < total_devices; i++) {
		struct dev_info_spti *di = &dev_info[i];
		if (di->drvletter == driveletter && di->mediainserted != insert) {
			write_log (L"SPTI: media change %c %d\n", dev_info[i].drvletter, insert);
			di->mediainserted = insert;
			int unitnum = getunitnum (di);
			if (unitnum >= 0) {
				update_device_info (unitnum);
				scsi_do_disk_change (unitnum, insert, NULL);
				blkdev_cd_change (unitnum, di->drvletter ? di->drvlettername : di->name);
			}
		}
	}
}
예제 #6
0
bool win32_ioctl_media_change (TCHAR driveletter, int insert)
{
	for (int i = 0; i < total_devices; i++) {
		struct dev_info_ioctl *ciw = &ciw32[i];
		if (ciw->drvletter == driveletter && ciw->di.media_inserted != insert) {
			write_log (_T("IOCTL: media change %s %d\n"), ciw->drvlettername, insert);
			ciw->di.media_inserted = insert;
			int unitnum = getunitnum (ciw);
			if (unitnum >= 0) {
				update_device_info (unitnum);
				scsi_do_disk_change (unitnum, insert, NULL);
				filesys_do_disk_change (unitnum, insert != 0);
				blkdev_cd_change (unitnum, ciw->drvlettername);
				return true;
			}
		}
	}
	return false;
}