示例#1
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;
}
示例#2
0
/* For an a_inode we have newly created based on a filename we found on the
* native fs, fill in information about this file/directory.  */
int fsdb_fill_file_attrs (a_inode *base, a_inode *aino)
{
	int mode, winmode, oldamode;
	uae_u8 fsdb[UAEFSDB2_LEN];
	int reset = 0;

	if((mode = GetFileAttributesSafe (aino->nname)) == INVALID_FILE_ATTRIBUTES) {
		write_log (_T("GetFileAttributes('%s') failed! error=%d, aino=%p dir=%d\n"),
			aino->nname, GetLastError(), aino, aino->dir);
		return 0;
	}
	aino->dir = (mode & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0;
	mode &= FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;

	if ((base->volflags & MYVOLUMEINFO_STREAMS) && read_uaefsdb (aino->nname, NULL, fsdb)) {
		aino->amigaos_mode = do_get_mem_long ((uae_u32 *)(fsdb + 1));
		xfree (aino->comment);
		aino->comment = NULL;
		if (fsdb[5 + 2 * 257])
			aino->comment = my_strdup_ansi ((char*)fsdb + 5 + 2 * 257);
		xfree (aino_from_buf (base, fsdb, &winmode));
		if (winmode == mode) /* no Windows-side editing? */
			return 1;
		write_log (_T("FS: '%s' protection flags edited from Windows-side\n"), aino->nname);
		reset = 1;
		/* edited from Windows-side -> use Windows side flags instead */
	}

	oldamode = aino->amigaos_mode;
	aino->amigaos_mode = A_FIBF_EXECUTE | A_FIBF_READ;
	if (!(FILE_ATTRIBUTE_ARCHIVE & mode))
		aino->amigaos_mode |= A_FIBF_ARCHIVE;
	if (!(FILE_ATTRIBUTE_READONLY & mode))
		aino->amigaos_mode |= A_FIBF_WRITE | A_FIBF_DELETE;
	if (FILE_ATTRIBUTE_SYSTEM & mode)
		aino->amigaos_mode |= A_FIBF_PURE;
	if (FILE_ATTRIBUTE_HIDDEN & mode)
		aino->amigaos_mode |= A_FIBF_HIDDEN;
	aino->amigaos_mode = filesys_parse_mask(aino->amigaos_mode);
	aino->amigaos_mode |= oldamode & A_FIBF_SCRIPT;
	if (reset && (base->volflags & MYVOLUMEINFO_STREAMS)) {
		create_uaefsdb (aino, fsdb, mode);
		write_uaefsdb (aino->nname, fsdb);
	}
	return 1;
}
示例#3
0
static a_inode *aino_from_buf (a_inode *base, uae_u8 *buf, int *winmode)
{
	uae_u32 mode;
	a_inode *aino = xcalloc (a_inode, 1);
	uae_u8 *buf2;
	TCHAR *s;

	buf2 = buf + 604;
	mode = do_get_mem_long ((uae_u32 *)(buf + 1));
	buf += 5;
	if (buf2[0]) {
		aino->aname = my_strdup ((TCHAR*)buf2);
	} else {
		aino->aname = au_fs ((char*)buf);
	}
	buf += 257;
	buf2 += 257 * 2;
	if (buf2[0]) {
		aino->nname = build_nname (base->nname, (TCHAR*)buf2);
	} else {
		s = au_fs ((char*)buf);
		aino->nname = build_nname (base->nname, s);
		xfree (s);
	}
	buf += 257;
	aino->comment = *buf != '\0' ? my_strdup_ansi ((char*)buf) : 0;
	buf += 81;
	aino->amigaos_mode = mode;
	*winmode = do_get_mem_long ((uae_u32 *)buf);
	aino->dir = ((*winmode) & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0;
	*winmode &= FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;
	aino->has_dbentry = 0;
	aino->dirty = 0;
	aino->db_offset = 0;
	if((mode = GetFileAttributesSafe (aino->nname)) == INVALID_FILE_ATTRIBUTES) {
		write_log (_T("xGetFileAttributes('%s') failed! error=%d, aino=%p\n"),
			aino->nname, GetLastError (), aino);
		return aino;
	}
	aino->dir = (mode & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0;
	return aino;
}