int fsdb_set_file_attrs (a_inode *aino) { uae_u32 tmpmask; uae_u8 fsdb[UAEFSDB2_LEN]; uae_u32 mode; tmpmask = filesys_parse_mask (aino->amigaos_mode); mode = GetFileAttributesSafe (aino->nname); if (mode == INVALID_FILE_ATTRIBUTES) return ERROR_OBJECT_NOT_AROUND; mode &= FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN; mode = 0; if ((tmpmask & (A_FIBF_WRITE | A_FIBF_DELETE)) == 0) mode |= FILE_ATTRIBUTE_READONLY; if (!(tmpmask & A_FIBF_ARCHIVE)) mode |= FILE_ATTRIBUTE_ARCHIVE; if (tmpmask & A_FIBF_PURE) mode |= FILE_ATTRIBUTE_SYSTEM; if (tmpmask & A_FIBF_HIDDEN) mode |= FILE_ATTRIBUTE_HIDDEN; SetFileAttributesSafe (aino->nname, mode); aino->dirty = 1; if (aino->volflags & MYVOLUMEINFO_STREAMS) { if (needs_fsdb (aino)) { create_uaefsdb (aino, fsdb, mode); write_uaefsdb (aino->nname, fsdb); } else { delete_uaefsdb (aino->nname); } } return 0; }
struct my_openfile_s *my_open (const TCHAR *name, int flags) { struct my_openfile_s *mos; HANDLE h; DWORD DesiredAccess = GENERIC_READ; DWORD ShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; DWORD CreationDisposition = OPEN_EXISTING; DWORD FlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; DWORD attr; const TCHAR *namep; TCHAR path[MAX_DPATH]; if (currprefs.win32_filesystem_mangle_reserved_names == false) { _tcscpy (path, PATHPREFIX); _tcscat (path, name); namep = path; } else { namep = name; } mos = xmalloc (struct my_openfile_s, 1); if (!mos) return NULL; attr = GetFileAttributesSafe (name); if (flags & O_TRUNC) CreationDisposition = CREATE_ALWAYS; else if (flags & O_CREAT) CreationDisposition = OPEN_ALWAYS; if (flags & O_WRONLY) DesiredAccess = GENERIC_WRITE; if (flags & O_RDONLY) { DesiredAccess = GENERIC_READ; CreationDisposition = OPEN_EXISTING; } if (flags & O_RDWR) DesiredAccess = GENERIC_READ | GENERIC_WRITE; if (CreationDisposition == CREATE_ALWAYS && attr != INVALID_FILE_ATTRIBUTES && (attr & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN))) SetFileAttributesSafe (name, FILE_ATTRIBUTE_NORMAL); h = CreateFile (namep, DesiredAccess, ShareMode, NULL, CreationDisposition, FlagsAndAttributes, NULL); if (h == INVALID_HANDLE_VALUE) { DWORD err = GetLastError(); if (err == ERROR_ACCESS_DENIED && (DesiredAccess & GENERIC_WRITE)) { DesiredAccess &= ~GENERIC_WRITE; h = CreateFile (namep, DesiredAccess, ShareMode, NULL, CreationDisposition, FlagsAndAttributes, NULL); if (h == INVALID_HANDLE_VALUE) err = GetLastError(); } if (h == INVALID_HANDLE_VALUE) { write_log (_T("failed to open '%s' %x %x err=%d\n"), namep, DesiredAccess, CreationDisposition, err); xfree (mos); mos = NULL; goto err; } } mos->h = h; err: //write_log (_T("open '%s' = %x\n"), namep, mos ? mos->h : 0); return mos; }
bool my_chmod (const TCHAR *name, uae_u32 mode) { DWORD attr = FILE_ATTRIBUTE_NORMAL; if (!(mode & FILEFLAG_WRITE)) attr |= FILE_ATTRIBUTE_READONLY; if (mode & FILEFLAG_ARCHIVE) attr |= FILE_ATTRIBUTE_ARCHIVE; if (SetFileAttributesSafe (name, attr)) return true; return false; }