IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Adresse (offset) d'une étiquette ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Par défaut Adresse (offset) d'une étiquette ?
    Bonjour ... petite question,
    J'aimerais utiliser une étiquette, mais pas pour utiliser un "goto" (beurk, hi) ... mais pour connaître l'adresse (offset) d'une de mes fonctions
    petit exemple de ce que j'aimerais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ...
    toto : INT ma_fonction (void)
    {
    .... 
    }
     
    INT main (void)
    {
    PVOID adr_toto ;
    ...
    adr_toto = & toto ;
    ...
    }
    J'aurais bien aimé ... mais ça fonctionne pas !
    Je suis dans une impasse, toutes les idées sont les bien venues.
    Surtout les bonnes ...

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Une adresse est une notion valide lors de l'execution. Une etiquette de goto est utilisee par le compilateur. Elle n'a pas d'adresse.

    Par contre, tu peux prendre l'adresse de ta fonction via un pointeur de fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       int (*ptr)(void) = &ma_fonction;

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    et ça :

    ça donne quoi ?

    En plus :
    connaître l'adresse (offset) d'une de mes fonctions
    Tu veux savoir quoi exactement ? l'adresse en mémoire ou l'ofset dans ton fichier ? Si j'ai bien compris, c'est un pointeur de fonction dont tu as besoin ...

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Adresse (offset) d'une étiquette ?
    Citation Envoyé par - Robby -
    J'aimerais utiliser une étiquette, mais pas pour utiliser un "goto" (beurk, hi)
    Je commençais à recharger mon lance-flammes...
    ... mais pour connaître l'adresse (offset) d'une de mes fonctions
    C'est le nom de la fonction. C'est tout. Faut arréter l'assembleur, ça rend fou !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int ma_fonction (void)
    {
    }
     
    int main (void)
    {
       int (*adr_toto) (void);
       adr_toto = ma_fonction ;
       return 0;
    }
    Détails au chapitre 'pointeurs de fonction'.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par DaZumba
    Par contre, tu peux prendre l'adresse de ta fonction via un pointeur de fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       int (*ptr)(void) = &ma_fonction;
    Citation Envoyé par PRomu@ld
    Pas besoin du & depuis 1989...

  6. #6
    Membre confirmé Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Par défaut
    Relax Emmanuel ... pas de "goto" ... promis, juré.
    Vous m'avez donné trop d'infos en trop peu de temps.
    Je dois regarder tout ça de plus près ...
    Je viens de Delphi (pascal) et de l'assembleur ... encore trop peu d'expérience en C ... et les pointeurs de fonctions, je ne connaissais pas. Je regarde ça de tout près ... je teste, j'essaye (j'apprends) ... et je reviens ... merci à tous.

    PS: mais noonnn Emmanuel, l'assembleur, ça rend pas fou ... allons !

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par - Robby -
    et les pointeurs de fonctions, je ne connais pas.
    Gné ? En assembleur x86, il y a des pointeurs de fonction...
    étant donné que CS ne bouge pas pour tous ce qui est programmes user.
    <...>
    Au cas ou ... le but final ... passer l'adresse d'une fonction user à mon driver kernel. <...>
    Ou la la! Je crains le pire. L'adresse dont il est question n'a rien de physique. C'est une valeur qui permet au système de se retrouver dans un contexte donné (un processus utilisateur, par exemple) via la MMU.

    Dans le contexte 'kernel', elle n'a aucun sens. Si tu cheches à installer un callback user dans le kernel, laisse tomber, ça ne peut pas fonctionner.

  8. #8
    Membre confirmé Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Par défaut
    Vi je sais ... faut mapper ... je sais pas ... je cherche ! En tout cas, il y a quasi 3 ans (Delphi) ... j'avais construit une table de services n° 2 ... et via sysenter, j'exécutais une fonction user ... en mode kernel (avec une belle instruction privilégiée au milieu) ... . Ici, j'ai construit mon driver et j'ai construit ma table 2 depuis ce driver ... aucun soucis. Maintenant, faudrait établir le lien "adresse" avec le monde user ... Depuis le user, on peut "mapper" une portion de la mémoire kernel ... faudrait que j'arrive à faire l'inverse. Oui ... c'est l'aventure, clair !

  9. #9
    Membre confirmé Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Par défaut
    voila Emmanuel ... j'ai franchi une étape ! Je passe l'adresse d'une de mes fonctions "user" à mon driver ... lequel appelle ma dite fonction user ... en mode kernel ... deux belles instructions privilégiées au milieu, "OUT" sur le port // et relecture (IN) ... retour de ma fonction vers le driver ( ma fonction user exécutée en mode kernel) ... et retour vers mon main en user. Tout a été décortiqué en kernel debugging bien entendu ... pas d'à peu près ici. En fait, quand je suis dans le driver, celui-ci a été appelé par mon appli user, via DeviceIoControl ... ce qui fait que mon driver "peut voir" l'espace mémoire de mon appli user. Qand je "regarde" ma fonction user depuis mon driver, l'offset est le même, seul CS change (08 en kernel, 1B en user) ... mais 08:toto ou 1B:toto ... représente le même espace mémoire ... par contre, 08:toto, tu es en mode kernel ... enfin, voila, pour la petite histoire.
    Prochaine étape ... une table n°2 et sysenter. La table 2 est déjà construite (ExAllocPoolWithTag et KeAddSystemServiceTable) ... Mais tu m'as bien aidé Emmanuel ... oui ... PVOID toto = ma_fonction ... ç'est ok. Le pointeur de fonction, c'est super aussi ... avec un pointeur de fonction, j'appele le User depuis mon driver ... sans une ligne d'assembleur ... c'était pour te faire plaisir Emmanuel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Adresse/offset du champs d'une structure
    Par ludo894 dans le forum C
    Réponses: 29
    Dernier message: 24/01/2007, 10h58
  2. [CR] débuter l'impression sur une étiquette X
    Par theflamme dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 11/01/2005, 08h47
  3. [CR] insérer une image paramétrer dans une étiquette
    Par yoyothebest dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 22/08/2004, 11h58
  4. Adresse publique d'une machine du L.A.N. ?
    Par WOLO Laurent dans le forum Développement
    Réponses: 4
    Dernier message: 30/11/2003, 15h19
  5. Réponses: 2
    Dernier message: 21/07/2003, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo