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; }
/* 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; }
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; }