On Tue, 28 Nov 2000 18:07:42 +0100, 
Georges Mariano <[EMAIL PROTECTED]> wrote :
> 
> (ne peut on pas avoir plus que le pid ??)

Dans le source du module, voir la fonction trace_open :

static int trace_open (struct inode *inode, struct file *file)
{
    struct task_struct *tsk = current;
    
    printk (KERN_INFO "trace: process %d %s try open block major %d\n",
            tsk->pid, tsk->comm, major);
    return -ENODEV;
}

On voit que ce code extrait l'information au moyen de current (au
fait, pourquoi ne pas �crire directement current->pid ? Ici, tsk ne
change pas de valeur) qui est une variable fondamentale du noyau,
pointant vers une structure d�crivant la t�che en cours d'ex�cution �
l'instant o� trace_open est parcourue.

Il faut s'imaginer trace_open comme une sous-routine du processus
courant, appel�e lorsque ce dernier essaie de faire un open sur un
p�riph�rique de makeur 13. La seule diff�rence avec une routine
ordinaire est que le processus est alors en � mode noyau � et a alors
tous les privil�ges.

Il suffit donc de jeter un coup d'oeil � la d�finition d'une
task_struct pour voir comment extraire l'information recherch�e. Et
tout est possible puisque par d�finition, toute l'information sur
cette t�che se trouve dans cette structure.

Voir donc /usr/src/linux/include/linux/sched.h, ligne 230 dans un
2.2.18pre17. En ce qui concerne Les infos les plus int�ressantes, les
plus facilement disponibles sont probablement celles qu'Edouard a
utilis�es :

- current->comm, le nom de la  commande (char[16)
- current->pid, le pid (pid_t, cad int)

Pour les arguments de la commande (i.e. la ligne de commande),
s'inspirer de la routine get_arg dans fs/proc/array.c : il faut en
fait lire directement dans la m�moire du processus. 

Pour les variables d'environnement, voir la routine get_env dans le
m�me fichier.

Marc

P.S. Sinon, si tu veux �tre s�r d'attraper le coupable, tu disposes de
toute l'information n�cessaire pour lui faire faire un core dump : �a
ne passera pas inaper�u (tir� de la routine de traitement de SIGABRT) !


 lock_kernel();
 if (current->binfmt
     && current->binfmt->core_dump
     && current->binfmt->core_dump(signr, regs))
         exit_code |= 0x80;
 unlock_kernel();


Répondre à