Service de noyau kmod_util
Objectif
Les routines Registres à appeler avant et après les appels système spécifiés sont appelées.
Syntaxe
Paramètres
| Article | Descriptif |
|---|---|
| Flags | Indique l'opération. Les valeurs valides sont INTERCEPTION, KU_INTERCEPT_STOPet KU_INTERCEPT_CANCEL. |
| zone tampon | Pointe vers une mémoire tampon contenant un en-tête d'interception d'appel système et un tableau de structures d'interception d'appel système. |
| Enroule | Indique la longueur de la mémoire tampon. |
Descriptif
Le service de noyau Kmod_util permet l'interception des appels système. Les routines appelées fonctions Pré-sc sont spécifiées pour être appelées avant l'appel système intercepté. Les routines appelées fonctions Post-sc sont spécifiées pour être appelées après l'appel système intercepté. En outre, une fonction Pré-sc est autorisée à abandonner l'appel système, en fournissant sa propre valeur de retour et en empêchant les fonctions Pré-sc suivantes et le système s'appelle lui-même. De même, chaque fonction Post-sc peut examiner et modifier la valeur de retour. Si un appel système ne renvoie pas (par exemple, Thread_terminate), les fonctions Post-sc ne sont pas appelées.
Pour chaque appel système intercepté, une fonction Pré-sc , une fonction Post-sc ou les deux doivent être spécifiées. Si une fonction Pré-sc et une fonction Post-sc sont enregistrées pour le même appel système dans le même appel Kmod_util , elles sont considérées comme étant associées. Toutes les fonctions Pré-sc et Post-sc spécifiées dans un appel Kmod_util doivent être définies dans la même extension de noyau que l'appelant du service de noyau Kmod_util . D'autres extensions de noyau, cependant, peuvent intercepter les mêmes appels système. La fonction Pré-sc enregistrée la plus récente est appelée en premier, et sa fonction Post-sc appariée est appelée en dernier.
L'interception d'un appel système est mise en oeuvre de sorte que tous les appels à l'appel système soient interceptés, même pour les processus existants.
Il peut être nécessaire d'empêcher l'interception de certains appels du système pour éviter de déstabiliser le système. Une version ou édition ultérieure du service de noyau Kmod_util peut empêcher l'interception d'appels système supplémentaires, et un tel changement ne sera pas considéré comme une violation de la compatibilité binaire.
Le prototype d'une fonction Pré-sc est
int pre_sc(uintptr_t *rc, void *parms, uintptr_t cookie, void *buffer); Où Parms est un pointeur vers les paramètres de l'appel système, Cookie est une valeur opaque spécifiée par l'appelant de Kmod_util, Mémoire tampon est une mémoire tampon de 128 octets utilisable par la fonction Pré-sc et sa fonction Post-sc appariée.
Si la fonction Pré-sc renvoie une valeur différente de zéro, l'appel système est abandonné. Le paramètre Code retour est l'adresse où une autre valeur de retour peut être spécifiée. Les fonctions Pre_sc suivantes ne sont pas appelées, pas plus que l'appel système. Pour les fonctions Pré-sc déjà appelées, leurs fonctions Post-sc associées sont appelées.
Le prototype d'une fonction post-sc est
void post_sc(uintptr_t *rc, void *parms, uintptr_t cookie,
void *buffer); Les paramètres de la fonction Post-sc sont identiques à ceux de la fonction Pré-sc . En particulier, le paramètre Mémoire tampon est la même mémoire tampon qui a été transmise à la fonction Pré-sc appariée. La valeur de retour peut être modifiée par une fonction Post-sc .
Pour les appels au service de noyau Kmod_util , la mémoire tampon contient un en-tête et un tableau d'éléments sur les appels système à intercepter. La présentation de ces structures est définie dans <sys/sysconfig.h>.
Un élément de tableau est ignoré si l'indicateur KU_IGNORE est défini dans la zone Kue_iflag . Sinon, chaque élément de tableau dans la mémoire tampon d'entrée est validé, et si des erreurs sont trouvées, l'appel complet échoue sans exécution partielle.
- Intercepter les appels système
- Les appels à Kmod_util () avec l'indicateur INTERCEPTION déclenchont l'interception des appels système.
- Arrêt de l'interception d'appel système
Les appels à Kmod_util () avec l'indicateur KU_INTERCEPT_STOP interromont l'interception des appels système spécifiés. Si une fonction Pré-sc a déjà été appelée pour un appel système spécifié, sa fonction Post-sc appariée est toujours appelée, mais les appels futurs vers l'appel système n'appellent pas la fonction Pré-sc ou Post-sc . Il n'est pas valide d'arrêter l'interception d'un appel système qui n'a pas été initialement intercepté par l'extension du noyau appelant.
Si l'interception d'un appel système a été suspendue, elle peut être reprise en appelant la fonction Kmod_util () avec l'indicateur INTERCEPTION , tant que les mêmes valeurs sont spécifiées, telles que les fonctions Pré-sc et Post-sc .
- Annulation d'une interception d'appel système
L'interception des appels système peut être annulée en spécifiant l'indicateur KU_INTERCEPT_CANCEL. Lorsque l'interception est annulée, la fonction Post-sc n'est pas appelée même si sa fonction Pré-sc appariée a été appelée. Il n'est pas valide d'annuler l'interception d'un appel système qui n'a pas été initialement intercepté par l'extension du noyau appelant, mais l'interception peut être annulée sans d'abord arrêter l'interception.
Une fois l'interception d'un appel système annulée, elle peut être interceptée à nouveau en appelant la fonction Kmod_util () avec l'indicateur INTERCEPTION . Différentes fonctions Pré-sc et Pré-sc peuvent être spécifiées dans ce cas.
Valeurs renvoyées
Si les opérations spécifiées peuvent être mises en oeuvre pour tous les appels système spécifiés, 0 est renvoyé. Sinon, une valeur différente de zéro est renvoyée et aucune modification de l'état de l'interception d'appel système ne se produit. Si une erreur se produit en raison d'une erreur de validation dans un élément de tableau particulier, la zone Kue_oflags identifie généralement l'erreur de manière plus détaillée.
Codes d'erreur
Si une erreur se produit, l'une des valeurs d'erreur suivantes est renvoyée:
| Valeur renvoyée | Descriptif |
|---|---|
| EINVAL | Le paramètre indicateurs n'est pas KU_INTERCEPTER, KU_INTERCEPT_STOP, ni KU_INTERCEPT_CANCEL. Les zones de l'en-tête ne sont pas valides ou le paramètre Enroule n'est pas cohérent avec le nombre d'éléments de tableau. La mémoire tampon n'était pas valide. Pour INTERCEPTION, au moins l'un des systèmes Pré-sc et Post-sc doit être fourni pour chaque appel système à intercepter. Toutes les fonctions Pré-sc et Post-sc doivent être dans la même extension de noyau que l'appelant de Kmod_util (). |
| EBUSY | Une demande a été faite pour intercepter un appel système déjà intercepté. |
| ENOENT | Une demande a été faite pour arrêter ou annuler l'interception d'un appel système qui n'a pas été intercepté. |
| ENOMEM | La mémoire n'a pas pu être allouée pour satisfaire la demande. |
| ENOTSUPP | L'un des appels système spécifiés n'est pas autorisé à être intercepté. |