9Fermer11
ZerosquareLe 29/12/2009 à 20:37
Les exemples donnés pas Squalyl pour Windows sont en fait des fonctions de la bibliothèque C. Une API indépendante du langage, c'est par exemple GetLocalTime().

Sinon, la façon dont sont effectués les appels API pour les applications n'est pas la même sous Linux et sous Windows. Néanmoins le but est le même : faire que les anciennes applications compilées continuent à fonctionner sur un système plus récent (oui, c'est aussi possible avec Linux, par exemple en faisant une compilation statique pour ne pas avoir de problème de dépendances : on demande d'inclure le code de toutes les bibliothèques utilisées dans l'exécutable, les seuls liens dynamiques restant étant les fonctions du noyau comme write()) :

- sous Linux, les numéros des fonctions du noyau sont définis une fois pour toutes, et les appels se font effectivement avec l'interruption 0x80 ou l'instruction SYSENTER.

- sous Windows, les appels de fonctions API se font comme des appels de sous-routines ordinaires, mais le linker laisse un "blanc" à la place de l'adresse de la fonction, et le nom en clair de la fonction est inclus dans une table dans l'exécutable. Au chargement du programme, le système remplit ces blancs avec les adresses des fonctions correspondant à chaque nom. (on peut aussi utiliser un numéro à la place du nom de la fonction, mais ceux-ci changent à chaque version de Windows, donc la compatibilité n'est pas assurée).

Tout ceci concerne uniquement les applications, pour les drivers et le fonctionnement interne c'est potentiellement différent (par exemple, sous Win9x, les VxD utilisaient une instruction int, avec patchage du code à chaud pour le remplacer par une instruction call après la première exécution de l'appel, histoire d'améliorer les perfs -- oui oui, du code noyau automodifiant hehe)