2015-11-29 76 views
2

我目前正在開發一個簡單的內核模塊,它可以盜取系統調用,如openreadwrite並用一個簡單的功能,日誌文件被打開,讀,寫替換它們,放入一個文件並返回原始的系統調用。解決文件描述符文件名/文件路徑

我的查詢是,我能夠在readwrite系統調用中獲得文件描述符,但我無法理解如何使用相同的方法獲取文件名。

目前我能夠訪問與使用給定的FD下面的代碼相關聯的文件結構:

struct file *file; 
file = fcheck(fd); 

該文件結構中有兩個重要的實體,這是我關心的,我相信:

  1. f_path
  2. f_inode

任何人都可以幫我得到dentryinode或與此fd關聯的路徑名稱使用與它相關聯的文件結構? 我的方法是否正確?或者我需要做一些不同的事情?

我使用的是Ubuntu 14.04,我的內核版本是3.19.0-25-generic,用於內核模塊開發。

回答

1

.f_inode實際上是一個inode。

.f_path->dentry是dentry。

通過->d_parent鏈接遍歷此目錄項,直到f_path.mnt.mnt_root目錄項會被感動,並收集dentry->d_name組件,將構建該文件的路徑,相對於掛載點。這是通過例如d_path完成的,但是以更謹慎的方式完成。

相反的fcheck(fd),裏面RCU閱讀部分應使用,也可以使用fget(fd),這應該與fput()配對。

0

的方法是完全不正確 - 見http://www.watson.org/~robert/2007woot/

的Linux已經爲做這件事(審計)的可靠機制。如果你想實現它(爲了好玩,我假設),你想要把你的鉤子大致放在審計正在做的地方。機會是LSM掛鉤在適當的地方,沒有檢查。