2013-04-09 41 views

回答

4

正如您在函数名称中看到的,内核函数fat_ioctl_get_attributes是通过ioctl从用户空间调用的,我不知道任何其他绑定。因此,你可以简单地读通过调用ioctl自己的属性,如:

import array 
import fcntl 
import os 

FAT_IOCTL_GET_ATTRIBUTES = 0x80047210 
FATATTR_BITS = 'rhsvda67' 

def get_fat_attrs(fn): 
    fd = os.open(fn, os.O_RDONLY) 
    try: 
     buf = array.array('L', [0]) 
     try: 
      fcntl.ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, buf, True) 
     except IOError as ioe: 
      if ioe.errno == 25: # Not a FAT volume 
       return None 
      else: 
       raise 

     return buf[0] 
    finally: 
     os.close(fd) 

if __name__ == '__main__': 
    import sys 
    for fn in sys.argv[1:]: 
     attrv = get_fat_attrs(fn) 
     if attrv is None: 
      print(fn + ': Not on a FAT volume') 
      continue 
     s = ''.join((fb if (1 << idx) & attrv else ' ') 
        for idx,fb in enumerate(FATATTR_BITS)) 
     print(fn + ': ' + s) 
+0

为什么'进口sys'你知道它的主后? – Serdalis 2013-04-09 08:09:33

+1

@Serdalis因为在下一行中,此演示程序遍历程序的所有[命令行参数](http://docs.python.org/3/library/sys.html#sys.argv),并且'如果此演示程序用作库,则不需要sys'。 – phihag 2013-04-09 08:14:58

+0

我在想这个解决方案,但是你是如何得到函数地址(FAT_IOCTL_GET_ATTRIBUTES = 0x80047210)?在我distr我得到错误“功能未实施”。 – therg 2013-04-09 08:24:41