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

Windows Discussion :

Thunk functions : appel de CreateFile dans une appli 16 bits


Sujet :

Windows

  1. #1
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut Thunk functions : appel de CreateFile dans une appli 16 bits
    Bonjour !

    Dans une appli 16 bits (écrite en BPW, pour ceux qui connaissent), j'essaye d'exécuter la fonction CreateFile du kernel32 à l'aide des thunk functions du kernel16 (LoadLibraryEx32W, FreeLibrary32W, GetProcAddress32W, GetVDMPointer32W et CallProc32W).

    Sur une machine Win NT 4.0 ou Win 2000 Pro, j'aboutis à une access violation dans NTDLL.DLL.
    J'ai vérifié tous mes paramètres, converti les adresses 16:16 en adresses linéaires... rien à faire.

    C'est la première fois que j'ai un problème avec les thunk functions.

    Quelqu'un a-t-il déjà été confronté au problème ?
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    J'ai trouvé !!!

    Sans que je puisse donner la moindre explication à la chose, tout fonctionne si je traduis l'adresse 16:16 du nom de fichier en adresse linéaire directement dans mon programme 16 bits (à l'aide de la fonction GetVDMPointer32W du kernel 16 bits) au lieu de la laisser traduire par la fonction CallProc32W.

    Si quelqu'un peut m'expliquer pourquoi, je suis bien entendu preneur !

    J'aurai séché là-dessus près d'un mois 1/2...
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Maintenant que tu as trouvé ça semble logique.
    De même que depuis le 16 bits il faut convertir le pointeur de fonction pour pouvoir l'appeler, cette fonction (exécutée en 32 bits) se voit passer un pointeur 16 bits...boum. Donc il faut aussi convertir l'adresse des paramètres passés, au même titre que l'on traduit l'adresse des fonctions appelées. Enfin, je pense.
    Félicitations.

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Merci !

    En fait, la fonction CallProc32W fait elle aussi partie du kernel 16 bits.

    J'ai pourtant déjà appelé pas mal de fonctions 32 bits en laissant CallProc32W convertir l'adresse 16:16 (FindFirstFile, GetCurrentDirectory, GetOpenFileName et encore bien d'autres) sans avoir jamais eu de problème, d'où ma perplexité.
    Je n'utilisais GetVDMPointer32W que pour des adresses à l'intérieur de structures passées comme paramètres à CallProc32W.

    Enfin, ça reste du "bricolage". Le "thunking" comporte hélas des zones d'ombres et de flou : j'ai plusieurs sources documentaires qui se contredisent parfois sur le même sujet. Et MSDN n'est pas toujours exempt d'erreur...
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

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

Discussions similaires

  1. [8.0] Intégration de PostGreSQL dans une appli windows
    Par Didier69 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 27/01/2005, 16h26
  2. [C#] Ressources importantes dans une appli .net
    Par tiboleo dans le forum Windows Forms
    Réponses: 31
    Dernier message: 07/09/2004, 19h27
  3. capter les messages d'interbase dans une appli
    Par devalender dans le forum InterBase
    Réponses: 6
    Dernier message: 25/06/2004, 16h58
  4. Se servir du login/passwd window dans une appli
    Par ericb dans le forum Windows
    Réponses: 8
    Dernier message: 26/05/2004, 17h34
  5. Appel de procédure dans une page ASP
    Par PrinceMaster77 dans le forum ASP
    Réponses: 5
    Dernier message: 02/04/2004, 16h59

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