我看到很多關於從它的inode獲取文件路徑的問題,但幾乎沒有關於做相反的事情。我的內核模塊需要這樣做來獲得關於傳遞給open()
的請求主題的更多信息,例如文件標誌或者它是否是設備。從我能夠從郵件列表,手冊頁和Linux源代碼一起蹭,我想出了這個小功能:檢索inode結構給定文件的路徑
struct inode* get_inode_from_pathname(const char *pathname) {
struct path path;
kern_path(pathname, LOOKUP_FOLLOW, &path);
return path.dentry->d_inode;
}
想在我更換系統調用來使用它使內核消息得到印刷到控制檯,但:
struct inode *current_inode;
...
asmlinkage int custom_open(char const *__user file_name, int flags, int mode) {
current_inode = get_inode_from_pathname(file_name);
printk(KERN_INFO "intercepted: open(\"%s\", %X, %X)\n", file_name, flags, mode);
printk(KERN_INFO "i_mode of %s:%hu\n", file_name, current_inode->i_mode);
return real_open(file_name, flags, mode);
}
有沒有更好的方式來做到這一點?我幾乎肯定我的方式是錯誤的。
這就是我的代碼目前所做的,但它導致我的模塊崩潰。 – Melab 2015-01-12 16:31:33
我已經添加了我的模塊以獲取上面我的回覆中的inode編號。 – 2015-01-13 07:10:58
我在虛擬機中使用了一個最小化的設置,所以我必須找出一些方法來捕獲崩潰堆棧跟蹤(具體是什麼?)。我正在運行內核版本3.16.7,這可能是由於這被用於被劫持的系統調用中,但我會看到我得到的。 – Melab 2015-01-13 17:28:17