// // Maps Linux file modes to DOS DSHRA attributes // unsigned short Linux_To_DOS_Attrs(struct inode *inode, char *component) { unsigned short mapped; mapped = FILE_NORMAL; if ((S_ISLNK(inode->i_mode)) || (S_ISBLK(inode->i_mode)) || (S_ISCHR(inode->i_mode)) || (S_ISFIFO(inode->i_mode)) || (S_ISSOCK(inode->i_mode))) { mapped |= FILE_SYSTEM; /*** UNIXish special files are seen as SYSTEM files ***/ } /* endif */ if (S_ISDIR(inode->i_mode)) { mapped |= FILE_DIRECTORY; } /* endif */ if ((!(inode->i_mode & S_IWUSR)) && (!(inode->i_mode & S_IWGRP)) && (!(inode->i_mode & S_IWOTH))) { mapped |= FILE_READONLY; } if (!isfat(component)) { mapped |= FILE_NONFAT; // Non 8.3 file name } return mapped; }
//试毒员 QWORD prelibation(char* memaddr) { /* //是视频文件 if( ismp4(memaddr) !=0 )return ; //'mp4' if( isrmvb(memaddr) !=0 )return ; //'rmvb' //是音乐文件 if( ismp3(memaddr) !=0 )return ; //'mp3' if( iswav(memaddr) !=0 )return ; //'wav' //是图片 if( isjpeg(memaddr) !=0 )return ; //'jpeg' if( ispng(memaddr) !=0 )return ; //'png' //办公文件 if( isdoc(memaddr) !=0 )return ; //'doc' if( ispdf(memaddr) !=0 )return ; //'pdf' //3d模型 //网络协议包 if( isethernet(memaddr) !=0 )return ; //'ethernet' if( isarp(memaddr) !=0 )return ; //'arp' if( isudp(memaddr) !=0 )return ; //'udp' if( istcp(memaddr) !=0 )return ; //'tcp' */ //是可执行文件 if( iself(memaddr) !=0 )return 0x666c65; //'elf' if( ismacho(memaddr) !=0 )return 0x6f6863616d; //'macho' if( ispe(memaddr) !=0 )return 0x6570; //'pe' //是压缩包 if( is7z(memaddr) !=0 )return 0x7a37; //'7z' if( iscpio(memaddr) !=0 )return 0x6f697063; //'cpio' if( isgz(memaddr) !=0 )return 0x7a67; //'gz' if( istar(memaddr) !=0 )return 0x726174; //'tar' if( iszip(memaddr) !=0 )return 0x70697a; //'zip' //是文件系统 if( isfat(memaddr) !=0 )return 0x746166; //'fat' if( isntfs(memaddr) !=0 )return 0x7366746e; //'ntfs' if( isext(memaddr) !=0 )return 0x747865; //'ext' if( ishfs(memaddr) !=0 )return 0x736668; //'hfs' //是分区表头 //if( isapm(memaddr) !=0)return ; //'apm' //apple partition map //if( isbsd(memaddr) !=0)return ; //'bsd' //bsd label if( isgpt(memaddr) !=0 )return 0x747067; //'gpt' if( ismbr(memaddr) !=0 )return 0x72626d; //'mbr',特殊,只能放最后 //什么都不像,返回失败 return 0; //'unknown' }
int main(int argc, char **argv) { printf("%d\n", isfat(argv[1])); }
bool my_stat (const TCHAR *name, struct mystat *statbuf) { DWORD attr, ok; FILETIME ft, lft; HANDLE h; BY_HANDLE_FILE_INFORMATION fi; const TCHAR *namep; bool fat; TCHAR path[MAX_DPATH]; if (currprefs.win32_filesystem_mangle_reserved_names == false) { _tcscpy (path, PATHPREFIX); _tcscat (path, name); namep = path; } else { namep = name; } // FILE_FLAG_BACKUP_SEMANTICS = can also "open" directories h = CreateFile (namep, 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL); if (h == INVALID_HANDLE_VALUE) return false; fat = isfat (h); ok = GetFileInformationByHandle (h, &fi); CloseHandle (h); attr = 0; ft.dwHighDateTime = ft.dwLowDateTime = 0; if (ok) { attr = fi.dwFileAttributes; if (fat) { // fat lastwritetime only has 2 second resolution // fat creationtime has 10ms resolution // use creationtime if creationtime is inside lastwritetime 2s resolution ULARGE_INTEGER ct, wt; ct.HighPart = fi.ftCreationTime.dwHighDateTime; ct.LowPart = fi.ftCreationTime.dwLowDateTime; wt.HighPart = fi.ftLastWriteTime.dwHighDateTime; wt.LowPart = fi.ftLastWriteTime.dwLowDateTime; uae_u64 ctsec = ct.QuadPart / 10000000; uae_u64 wtsec = wt.QuadPart / 10000000; if (wtsec == ctsec || wtsec + 1 == ctsec) { ft = fi.ftCreationTime; } else { ft = fi.ftLastAccessTime; } } else { ft = fi.ftLastWriteTime; } statbuf->size = ((uae_u64)fi.nFileSizeHigh << 32) | fi.nFileSizeLow; } else { write_log (_T("GetFileInformationByHandle(%s) failed: %d\n"), namep, GetLastError ()); return false; } statbuf->mode = (attr & FILE_ATTRIBUTE_READONLY) ? FILEFLAG_READ : FILEFLAG_READ | FILEFLAG_WRITE; if (attr & FILE_ATTRIBUTE_ARCHIVE) statbuf->mode |= FILEFLAG_ARCHIVE; if (attr & FILE_ATTRIBUTE_DIRECTORY) statbuf->mode |= FILEFLAG_DIR; FileTimeToLocalFileTime (&ft,&lft); uae_u64 t = (*(__int64 *)&lft-((__int64)(369*365+89)*(__int64)(24*60*60)*(__int64)10000000)); statbuf->mtime.tv_sec = t / 10000000; statbuf->mtime.tv_usec = (t / 10) % 1000000; return true; }
/* * generate: * res = n; * simplifies and calls gmove. */ void cgen(Node *n, Node *res) { Node *nl, *nr, *r; Node n1, n2; int a, f; Prog *p1, *p2, *p3; Addr addr; if(debug['g']) { dump("\ncgen-n", n); dump("cgen-res", res); } if(n == N || n->type == T) goto ret; if(res == N || res->type == T) fatal("cgen: res nil"); while(n->op == OCONVNOP) n = n->left; // inline slices if(cgen_inline(n, res)) goto ret; if(n->ullman >= UINF) { if(n->op == OINDREG) fatal("cgen: this is going to misscompile"); if(res->ullman >= UINF) { tempname(&n1, n->type); cgen(n, &n1); cgen(&n1, res); goto ret; } } if(isfat(n->type)) { sgen(n, res, n->type->width); goto ret; } if(!res->addable) { if(n->ullman > res->ullman) { regalloc(&n1, n->type, res); cgen(n, &n1); if(n1.ullman > res->ullman) { dump("n1", &n1); dump("res", res); fatal("loop in cgen"); } cgen(&n1, res); regfree(&n1); goto ret; } if(res->ullman >= UINF) goto gen; if(complexop(n, res)) { complexgen(n, res); goto ret; } f = 1; // gen thru register switch(n->op) { case OLITERAL: if(smallintconst(n)) f = 0; break; case OREGISTER: f = 0; break; } if(!iscomplex[n->type->etype]) { a = optoas(OAS, res->type); if(sudoaddable(a, res, &addr)) { if(f) { regalloc(&n2, res->type, N); cgen(n, &n2); p1 = gins(a, &n2, N); regfree(&n2); } else p1 = gins(a, n, N); p1->to = addr; if(debug['g']) print("%P [ignore previous line]\n", p1); sudoclean(); goto ret; } } gen: igen(res, &n1, N); cgen(n, &n1); regfree(&n1); goto ret; } // update addressability for string, slice // can't do in walk because n->left->addable // changes if n->left is an escaping local variable. switch(n->op) { case OLEN: if(isslice(n->left->type) || istype(n->left->type, TSTRING)) n->addable = n->left->addable; break; case OCAP: if(isslice(n->left->type)) n->addable = n->left->addable; break; } if(complexop(n, res)) { complexgen(n, res); goto ret; } if(n->addable) { gmove(n, res); goto ret; } nl = n->left; nr = n->right; if(nl != N && nl->ullman >= UINF) if(nr != N && nr->ullman >= UINF) { tempname(&n1, nl->type); cgen(nl, &n1); n2 = *n; n2.left = &n1; cgen(&n2, res); goto ret; } if(!iscomplex[n->type->etype]) { a = optoas(OAS, n->type); if(sudoaddable(a, n, &addr)) { if(res->op == OREGISTER) { p1 = gins(a, N, res); p1->from = addr; } else { regalloc(&n2, n->type, N); p1 = gins(a, N, &n2); p1->from = addr; gins(a, &n2, res); regfree(&n2); } sudoclean(); goto ret; } } switch(n->op) { default: dump("cgen", n); fatal("cgen: unknown op %N", n); break; // these call bgen to get a bool value case OOROR: case OANDAND: case OEQ: case ONE: case OLT: case OLE: case OGE: case OGT: case ONOT: p1 = gbranch(AJMP, T); p2 = pc; gmove(nodbool(1), res); p3 = gbranch(AJMP, T); patch(p1, pc); bgen(n, 1, p2); gmove(nodbool(0), res); patch(p3, pc); goto ret; case OPLUS: cgen(nl, res); goto ret; // unary case OCOM: a = optoas(OXOR, nl->type); regalloc(&n1, nl->type, N); cgen(nl, &n1); nodconst(&n2, nl->type, -1); gins(a, &n2, &n1); gmove(&n1, res); regfree(&n1); goto ret; case OMINUS: if(isfloat[nl->type->etype]) { nr = nodintconst(-1); convlit(&nr, n->type); a = optoas(OMUL, nl->type); goto sbop; } a = optoas(n->op, nl->type); goto uop; // symmetric binary case OAND: case OOR: case OXOR: case OADD: case OMUL: a = optoas(n->op, nl->type); if(a != AIMULB) goto sbop; cgen_bmul(n->op, nl, nr, res); break; // asymmetric binary case OSUB: a = optoas(n->op, nl->type); goto abop; case OCONV: regalloc(&n1, nl->type, res); regalloc(&n2, n->type, &n1); cgen(nl, &n1); // if we do the conversion n1 -> n2 here // reusing the register, then gmove won't // have to allocate its own register. gmove(&n1, &n2); gmove(&n2, res); regfree(&n2); regfree(&n1); break; case ODOT: case ODOTPTR: case OINDEX: case OIND: case ONAME: // PHEAP or PPARAMREF var igen(n, &n1, res); gmove(&n1, res); regfree(&n1); break; case OLEN: if(istype(nl->type, TMAP) || istype(nl->type, TCHAN)) { // map and chan have len in the first 32-bit word. // a zero pointer means zero length regalloc(&n1, types[tptr], res); cgen(nl, &n1); nodconst(&n2, types[tptr], 0); gins(optoas(OCMP, types[tptr]), &n1, &n2); p1 = gbranch(optoas(OEQ, types[tptr]), T); n2 = n1; n2.op = OINDREG; n2.type = types[TINT32]; gmove(&n2, &n1); patch(p1, pc); gmove(&n1, res); regfree(&n1); break; } if(istype(nl->type, TSTRING) || isslice(nl->type)) { // both slice and string have len one pointer into the struct. // a zero pointer means zero length regalloc(&n1, types[tptr], res); agen(nl, &n1); n1.op = OINDREG; n1.type = types[TUINT32]; n1.xoffset = Array_nel; gmove(&n1, res); regfree(&n1); break; } fatal("cgen: OLEN: unknown type %lT", nl->type); break; case OCAP: if(istype(nl->type, TCHAN)) { // chan has cap in the second 32-bit word. // a zero pointer means zero length regalloc(&n1, types[tptr], res); cgen(nl, &n1); nodconst(&n2, types[tptr], 0); gins(optoas(OCMP, types[tptr]), &n1, &n2); p1 = gbranch(optoas(OEQ, types[tptr]), T); n2 = n1; n2.op = OINDREG; n2.xoffset = 4; n2.type = types[TINT32]; gmove(&n2, &n1); patch(p1, pc); gmove(&n1, res); regfree(&n1); break; } if(isslice(nl->type)) { regalloc(&n1, types[tptr], res); agen(nl, &n1); n1.op = OINDREG; n1.type = types[TUINT32]; n1.xoffset = Array_cap; gmove(&n1, res); regfree(&n1); break; } fatal("cgen: OCAP: unknown type %lT", nl->type); break; case OADDR: agen(nl, res); break; case OCALLMETH: cgen_callmeth(n, 0); cgen_callret(n, res); break; case OCALLINTER: cgen_callinter(n, res, 0); cgen_callret(n, res); break; case OCALLFUNC: cgen_call(n, 0); cgen_callret(n, res); break; case OMOD: case ODIV: if(isfloat[n->type->etype]) { a = optoas(n->op, nl->type); goto abop; } cgen_div(n->op, nl, nr, res); break; case OLSH: case ORSH: cgen_shift(n->op, nl, nr, res); break; } goto ret; sbop: // symmetric binary if(nl->ullman < nr->ullman) { r = nl; nl = nr; nr = r; } abop: // asymmetric binary if(nl->ullman >= nr->ullman) { regalloc(&n1, nl->type, res); cgen(nl, &n1); if(sudoaddable(a, nr, &addr)) { p1 = gins(a, N, &n1); p1->from = addr; gmove(&n1, res); sudoclean(); regfree(&n1); goto ret; } regalloc(&n2, nr->type, N); cgen(nr, &n2); } else { regalloc(&n2, nr->type, N); cgen(nr, &n2); regalloc(&n1, nl->type, res); cgen(nl, &n1); } gins(a, &n2, &n1); gmove(&n1, res); regfree(&n1); regfree(&n2); goto ret; uop: // unary regalloc(&n1, nl->type, res); cgen(nl, &n1); gins(a, N, &n1); gmove(&n1, res); regfree(&n1); goto ret; ret: ; }