2013-04-09 95 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