Bonjour a tous j'aurais voulu savoir précisément à quoi servent ces instructions (cli et sti) ?
Bonjour a tous j'aurais voulu savoir précisément à quoi servent ces instructions (cli et sti) ?
Bonjour,
STI (Set Interrupt) sert à armer le drapeau d'interruption. CLI (Clear Interrupt) est l'instruction contraire, qui désarme le drapeau d'interruption. Permet principalement d'activer/désactiver les interruptions hardware.
Dans la vie, il y a 10 sortes de personnes. Ceux qui comprennent le binaire et les autres...
Est-ce que tu pourais être plus précis stp, ou me renvoyer vers un tutorial ?
A quoi correspondent ces interruptions et qund osnt-elles utilisées ?
Par exemple, j'ai un code source de driver qui fait un beep carte mère, et lorsqu'il envoie des données sur les ports de la carte avec des IN et OUT, il met des cli et sti... pourquoi ?
Au fait, j'ai entendu parle de la fonction HalMakeBeep pour créer un beep carte mère. Peut-on l'appeler du user-land ou faut-il faire un driver ?
Il met des CLI et STI pour empêcher les interruptions matérielles (comme l'appui sur une touche du clavier), probablement dans ce cas pour que le processeur ne soit pas dérangé soit par l'utilisateur, soit par des timers déclenchant des interruptions à intervalles réguliers.lorsqu'il envoie des données sur les ports de la carte avec des IN et OUT, il met des cli et sti... pourquoi ?
Pour savoir qu'est-ce qu'une interruption, outre l'entrée Interruption de la FAQ, tu as un tutoriel en assembleur très bien fait qui parle également des interruptions. Enfin, tu peux regarder le manuel Intel aux entrées CLI et STI.
Pour HalMakeBeep, qui est importée de la bibliothèque HAL.DLL (il faut posséder HAL.LIB pour l'utiliser), la dll se charge visiblement des appels au système, tu peux donc l'appeler de n'importe quel niveau de sécurité. Elle prend comme seul paramètre la fréquence du son.
Dans la vie, il y a 10 sortes de personnes. Ceux qui comprennent le binaire et les autres...
Pourquoi dois-je utiliser hal.lib ? Je ne peux pas aller chercher les fonctions dans hal.dll avec GetProcAdress() ?
J'ai trouvé hal.lib mais elle est dans le DDK, est-ce que cela signifie qu'un driver est nécessaire ?
et puis je n'ai trouve aucun .h, comment utiliser le .lib ?
Hal.lib est utile pour importer HalMakeBeep en assembleur; je pense que nous ne sommes pas sur la même fréquence.
Tu peux faire ça, en C... auquel cas, ce message n'a rien à faire dans le forum assembleur.Je ne peux pas aller chercher les fonctions dans hal.dll avec GetProcAdress() ?
Dans la vie, il y a 10 sortes de personnes. Ceux qui comprennent le binaire et les autres...
ok dsl c'est parce qu'on est parti sur autre chose et ue je ne voulais pas créer de nouveau thread ^^
Bon pour finir la-dessus, c'est normal qu'il n'y ait pas de .h ?
En C : je fais un pointeur sur le bon type de fonction et j'appelle GetProcAdress()
En ASM : il me faut un .inc non ? il est introuvable...
Je me trompe ?
PS : est-ce que le fait que hal.lib ne soit pas fourni avec VC++ mais avec le DDK n'indiquerait pas qu'il faille etre en ring0 ?
PS2 : en C, comment je fais pour trouver le prototype de la fonction alors qu'il n'y a pas de .h ?
Exactement. Ca liste les prototypes de la même manière qu'un .h.En ASM : il me faut un .inc non
Effectivement c'est gênant . Mais si tu arrives à trouver les prototypes des fonctions de Hal.dll que tu veux utiliser, tu peux quand même utiliser ces fonctions avec le seul Hal.lib, à condition que tu déclares ces prototypes au début de ton programme et que tu lies Hal.lib à ton prog à l'assemblage.il est introuvable...
Si tu ne possèdes pas de .h, impossible de le deviner évidemment. Maintenant, la même chose s'applique ici : si tu possèdes une doc, ou un site internet où les fonctions sont décrites en détail, c'est tout ce dont tu as besoin.en C, comment je fais pour trouver le prototype de la fonction alors qu'il n'y a pas de .h ?
A ce niveau-là je ne pense pas que ça indique quoi que ce soit, maintenant il est possible que la DLL(liée au LIB) implémente un driver qui se charge des instructions en ring0(ça arrive souvent, justement à cause des nouveaux OS comme XP). Si c'est le cas, tu ne devrais pas avoir de problèmes pour appeler une fonction de cette bibli. De toutes façons, si la dll accède au matériel sans demander l'autorisation à personne, tu le sauras tout de suiteest-ce que le fait que hal.lib ne soit pas fourni avec VC++ mais avec le DDK n'indiquerait pas qu'il faille etre en ring0 ?
Dans la vie, il y a 10 sortes de personnes. Ceux qui comprennent le binaire et les autres...
Ok j'ai fait quelques recherches et j'ai trouvé le prototype de HalMakeBeep() dans ntddk.h
Premier problème : impossible d'inclure ce fichier dans VC++, il me dit que le compilo est incompatible. Je procède donc ainsi :
hmod vaut alors NULL et j'obtiens l'erreur 998, ERROR_NOACCESS, "Invalid access to memory location".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include "windows.h" typedef BOOLEAN (WINAPI *pHalMakeBeep)(IN ULONG freq); int main() { HMODULE hmod = LoadLibrary("hal.dll"); int error = GetLastError(); FreeLibrary(hmod); return 0; }
Je suppose donc qu'un programme user-land classique ne peut pas accéder à cette DLL....
Je vois deux solutions :
- faire un driver noyau (ASM ou C, peu importe), ou toute autre chose permettant de passer en ring0
- s'injecter dans lsass.exe pour obtenir les privilèges SYSTEM et voir s'ils sont suffisants...
Qu'en pensez-vous ?
Bonjour,
HalMakeBeep() utilise des instructions privilégiées (CLI, IN, OUT, etc.) et est mappée par le système d'exploitation - plus exactement pas le kernel lui-même - et sert d'interface entre le kernel et le matériel. (HAL => Hardware Abstraction Layer : Couche d'abstraction matériel)
En gros, il est impossible de l'utiliser en ring 3 (user mode), d'autant plus que l'ImageBase de HAL est située hors des limites de chargement de l'user-land.
Par contre on peut tout à fait l'utiliser depuis un driver tournant en ring 0 (kernel mode). Il suffit de lier sur la bibliothèque HAL puisque quoi qu'il arrive, une version de HAL est présente en mémoire, il n'y a donc pas besoin de charger explicitement ce module.
Je comprends pas bien ce que tu entends par "mappé par le système d'exploitation" ? (surtout par mappé en fait :p)
Sinon si je link avec hal.lib, a quoi sert la DLL puisque le code de hal.lib sera recopié dans mon executable a la compilation ?
Petite erreur de ma part, je voulais dire que le module (et non la fonction) était mappé par le système. (to map => transférer en mémoire).
C'est une édition de lien dynamique, le code reste dans la DLL et le module appelant (dans notre cas, le driver) ne fait qu'appeler la fonction de la DLL. Le code de cette dernière n'étant présent que (et uniquement) dans la DLL, pas dans le module appelant.Sinon si je link avec hal.lib, a quoi sert la DLL puisque le code de hal.lib sera recopié dans mon executable a la compilation ?
C'est la même chose que quand on lie sur une DLL système user-land (type kernel32). Le code reste dans la DLL, le programme appelant une fonction de kernel32 ne fait que faire un appel (CALL) vers le code de la DLL.
alors le fichier .lib contient quoi ? (puisque le code est dans la DLL...)
Bonjour,
Dans le cas qui nous intéresse (bibliothèque statique [*.lib] permettant de lier sur une bibliothèque dynamique [*.dll]), celle-ci contient uniquement :
- Une entête : qui donne divers renseignements comme la date de création du fichier *.lib, le nombre de fonctions, la taille du fichier .lib, etc.
- Un tableau donnant les fonctions exportées par la DLL.
- Un tableau donnant, pour chaque fonction, certaines informations (à quel module appartient la fonction, le nom de la fonction est-il décoré, numéro d'ordinal de la fonction, type du processeur cible, etc.)
Les fonctions exportées le sont sous la forme de décoration C (C name mangling ) :
_xxxx@ : la fonction est de type stdcall.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 _MakeHalBeep@4 __imp__MakeHalBeep@4 ...
MakeHalBeep : nom de la fonction
@4 : La fonction prend x/4 paramètre(s) en entrée ou x est le nombre suivant le '@'.
Dans l'exemple, il y a un seul paramètre ayant une taille 4 octet (ça ne permet pas de dégager le type, cela peut être un int, un unsigned int, etc., mais ça n'est pas le rôle de l'éditeur de lien de vérifier le type.)
[N.B : le 4 dans X/4 est une constante : @8 donne deux paramètres en entrée.]
__imp__ : la fonction peut être importée par un autre module, elle est donc exportée par la bibliothèque dynamique (*.DLL).
J'ai posté une nouvelle discussion sur le forum WIN32 parce qu'on a complètement dévié du sujet initial
Merci de bien vouloir y passer
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager