私の目標は、プロセスのオープンファイル記述子のアクセス許可を変更することです。たとえば、PIDが既知のプロセスがあり、標準から3つ離れた2つのファイル記述子があります.1つは読み取り専用アクセス権でオープンされ、もう1つは書き込み専用アクセス権でオープンされました。私は、ファイルディスクリプタのアクセス権を読み取り専用から読み取りと書き込みに変更したい。その後、ファイルディスクリプタを使用して、作成されたオブジェクトを書き込むことができます。理解Linuxカーネルのデータ構造ファイルディスクリプタを処理するための
私は私にそのPIDで識別されるプロセスのファイル記述子へのアクセスを提供するカーネルモジュールを書かれています。ヘッダーとフォーラムを検索して、ファイル記述子を処理するためのLinuxのデータ構造の仕組みを理解しましたが、私はまだ混乱しています。私が見つけたことは、すべてのプロセスがオープンファイル記述子の配列が含ま下に開いているすべてのファイルのためのメンバーを、含まれている独自のtask_structを、持っている、です。私はここからinodeとどのようにリンクしているのか分かりません。
私は私達に権限を与えますが、私はそれを呼び出すための方法を見つけることができませんf_modeと呼ばれる構造体ファイルのメンバーがあることが分かりました。私はそれを直接アクセスすると、それは私にunsigned intを与えますが、どの値が何にマップされているのかわかりません。また、アクセス権限を格納するデータメンバーであるかどうかはわかりません。これを変更すると、ファイル記述子のアクセス権が変更されますか?
コードは以下のとおりである:
static int __init mainInit(void){
int pid=13433;
struct task_struct * task;
struct files_struct * files;
struct fdtable * filestable;
struct path files_path;
//Get Task structure from PID
task = pid_task(find_vpid(pid), PIDTYPE_PID);
//Get open FIles from the task tstructure
files = task->files;
filestable=files_fdtable(files);
int i=0;
char *cwd;
char *buf = (char *)kmalloc(GFP_KERNEL,100*sizeof(char));
while(filestable->fd[i] != NULL){
files_path = filestable->fd[i]->f_path;
cwd=d_path(&files_path,buf, 100*sizeof(char));
printk(KERN_INFO "Open FD with %d with name %s with access %x\n", i, cwd,filestable->fd[i]->f_mode);
//printk(KERN_INFO "FMode read:%x Fmodewrite:%x\n",FMODE_READ,FMODE_WRITE);
//Check access mode
if(filestable->fd[i]->f_mode==FMODE_READ){
printk(KERN_INFO "File has access FMODE_READ\n");
}else if(filestable->fd[i]->f_mode==FMODE_WRITE){
printk(KERN_INFO "File has access FMODE_WRTIE\n");
}
i++;
}
return 0;
}
static void __exit mainExit(void){
printk(KERN_INFO "Goodbye Kernel!. Returning to normal useless world!\n");
}
module_init(mainInit);
module_exit(mainExit);