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; }
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; }
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; }
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; }
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); } } } }
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; }