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 :

Fonctions de ntdll.dll (DDK)


Sujet :

Windows

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut Fonctions de ntdll.dll (DDK)
    J'ai installé le DDK pour pouvoir faire appel à certaines fonctions qui ne se touvent pas dans l'API.

    J'ai eu quelques difficulté avec les include, par exemple
    #include <windows.h>
    #include <ntddk.h>
    ensemble ne font pas bon ménage.

    Ensuite il y a un problème de link car une fonction est définie dans deux modules, ntdll.lib et libcmtd.lib
    Comment résoudre cette ambiguité ?
    Merci.

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Le DDK est fait pour créer du code kernel, pas du code user... C'est normal que les deux entêtes principaux se bouffent le nez, et ce n'est pas prêt de s'arranger !
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Ok, ça c'est résolu en utilisant des .cpp différents.

    Reste le problème de link. En fait en link dynamique c'est OK mais en link statique ça ne passe pas
    Une idée pourquoi ?

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par camboui Voir le message
    Reste le problème de link. En fait en link dynamique c'est OK mais en link statique ça ne passe pas
    Tu ne peux PAS mélanger du code niveau kernel et niveau user dans le même processus... Ce n'est pas parce que ça linke que ça va marcher, ou que ça passera sur une machine "normale" (= sans le DDK installé).

    Si tu veux utiliser une fonction kernel dans un programme en mode user, tu dois créer un driver dédié (ou utiliser un driver existant effectuant le boulot) qui fera le "pont" entre les deux mondes. C'est la seule méthode réellement propre et fiable.

    En l'occurrence : quelle(s) fonction(s) kernel cherches-tu à utiliser ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    L'API a certaines lacunes qui sont comblées par des fonctions dispo ailleurs ou non documentées.

    Je suis en mode user, je cherche simplement à utiliser les fonctions ZwXxx qui se trouvent dans ntdll.dll. En particulier ZwQueryInformationFile().
    Le but est de faire du logging en cas d'erreur IO. Je ne trouve pas qu'il soit utile de stocker les informations en amont, infos dont je n'ai pas besoin en tant normal. Je souhaite que l'OS me fournisse cette info si nécessaire.
    Exemple typique: retrouver le nom d'un fichier dont on ne connait que le handle.

  6. #6
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Au lieu de passer par un driver afin d'exécuter du code kernel comme l'a dit Mac LAK pour utiliser des fonctions de type Zw(n)*(x), passe par la récupération de l'adresse de ta fonction exportée par le module ntdll.
    Pour cela, utilise GetProcAddress().

    Allez je mets un exemple pour la fonction NtQueryInformationFile():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    typedef long NTSTATUS;
    
    typedef NTSTATUS (NTAPI *NTQUERYINFORMATIONFILE)(
        IN  HANDLE                 FileHandle,
        OUT PIO_STATUS_BLOCK       IoStatusBlock,
        OUT PVOID                  FileInformation,
        IN  DWORD                  Length,
        IN  FILE_INFORMATION_CLASS FileInformationClass
        );
    
    NTQUERYINFORMATIONFILE NtQueryInformationFile = NULL;
    
    int main()
    {
        NTSTATUS status = -1;
        HMODULE hNtdll = NULL;
    
        hNtdll = LoadLibrary("ntdll.dll");
        if(hNtdll == NULL)
            return EXIT_FAILURE;
    
        NtQueryInformationFile = (NTQUERYINFORMATIONFILE)GetProcAddress(hNtdll, "NtQueryInformationFile");
        if(NtQueryInformationFile == NULL)
            return EXIT_FAILURE;
    
        // Utilisation de NtQueryInformationFile() à ta guise
    
        FreeLibrary(hNtdll);
    
        return 0;
    }
    Je te laisse définir les structures nécessaires pour pouvoir compiler.

    ;-)

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par camboui Voir le message
    L'API a certaines lacunes qui sont comblées par des fonctions dispo ailleurs ou non documentées.
    Certes, mais il est en général dangereux et/ou caractéristique d'une "mauvaise pratique" de les utiliser. Si elles ne sont pas publiées "normalement", c'est qu'il y a une bonne raison.

    Dans ton cas, cela revient à peu près à la même chose que d'aller "fouiller" le contenu interne d'une structure FILE* (en C) pour trouver des informations sur le fichier en cours d'utilisation... Chose hautement non-portable, bien sûr, mais également très dangereux car cela peut changer d'une version à l'autre du compilateur.

    Citation Envoyé par camboui Voir le message
    Je suis en mode user, je cherche simplement à utiliser les fonctions ZwXxx qui se trouvent dans ntdll.dll. En particulier ZwQueryInformationFile().
    Le but est de faire du logging en cas d'erreur IO. Je ne trouve pas qu'il soit utile de stocker les informations en amont, infos dont je n'ai pas besoin en tant normal. Je souhaite que l'OS me fournisse cette info si nécessaire.
    Exemple typique: retrouver le nom d'un fichier dont on ne connait que le handle.
    Normalement, tu es censé utiliser les fonctions NtXxx en mode user, et pas les ZwXxx.

    Pour l'exemple que tu cites, tu as GetFileInformationByHandleEx (API Win32 "normale") qui répond à ton besoin, et qui sera nettement plus propre à utiliser.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #8
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Mac LAK
    Certes, mais il est en général dangereux et/ou caractéristique d'une "mauvaise pratique" de les utiliser.
    Une mauvaise pratique, souvent utiliser à des fins douteuses...
    Enfin, si c'est dans un but d'apprendre, de découvrir, de réaliser des tools de surveillance etc..., c'est bien plus nôble!

    En tout cas, l'idéal comme tu fais part, c'est d'utiliser des APIs documentées, prévues pour une programmation "normale" au niveau utilisateur.

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Pour l'exemple que tu cites, tu as GetFileInformationByHandleEx (API Win32 "normale") qui répond à ton besoin, et qui sera nettement plus propre à utiliser.
    Je n'en doute pas, mais
    Minimum supported client: Windows Vista
    Minimum supported server: Windows Server 2008
    C'est un peu contrariant...
    J'essaie malgré tout, je suis sous XP et VS2005. Ça compile mais le linker ne trouve pas la fonction... (kernel32.lib qui n'est pas à jour ?)

    Je veux bien utiliser les versions NtXxx au lieu de ZwXxx mais dans quel header sont-elles déclarées ? (pas ntddk.h en tout cas)

    Sinon l'idée de charger dynamiquement les adresses des fonctions de l'API est bonne, et c'est instructif, merci ! (on aime bien chipotter, hein ! )

  10. #10
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par camboui
    Je veux bien utiliser les versions NtXxx au lieu de ZwXxx mais dans quel header sont-elles déclarées ? (pas ntddk.h en tout cas)

    Sinon l'idée de charger dynamiquement les adresses des fonctions de l'API est bonne, et c'est instructif, merci ! (on aime bien chipotter, hein ! )
    J'ai l'impression que tu as parcouru rapidement le code que je t'ai posté. ;')
    Tout y est pour l'utilisation d'une fonction Ntxxx, notamment en passant par un pointeur de fonction auquel on assignera la valeur récupérée via GetProcAddress(). De ce fait, nul besoin de chercher un fichier d'entête déclarant des fonctions en NtXxx. D'ailleurs, je ne crois pas qu'il existe!?

    Le seul fichier d'entête que tu as surement besoin pour le code fourni est celui-ci:

  11. #11
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    J'ai complété et testé ton bout de code, et de fait ça fonctionne !
    Il m'a même permis de vérifier que GetFileInformationByHandleEx n'existe pas sur ma machine (GetFileInformationByHandle bien).

    Reste qu'il ne faut pas se tromper dans le prototypage et espérer que le cast nécessaire en retour de GetProcAddress soit le bon.
    A propos, GetProcAddress n'a pas d'équivalent GetProcAddressA et GetProcAddressW ?

  12. #12
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par camboui Voir le message
    Je n'en doute pas, mais
    Minimum supported client: Windows Vista
    Minimum supported server: Windows Server 2008
    C'est un peu contrariant...
    Relis mieux les notes en bas de page. Pour Vista, c'est dispo "tel quel", sans fioritures, au travers de "Winbase.h". Pour XP / 2003, c'est dans le DDK, au travers de "FileExtd.h".
    Citation Envoyé par MSDN
    • Minimum supported client: Windows Vista
    • Minimum supported server: Windows Server 2008
    • Redistributable: Windows SDK on Windows Server 2003 and Windows XP.
    • Header: WinBase.h (include Windows.h), FileExtd.h on Windows Server 2003 and Windows XP
    • Library: Kernel32.lib, FileExtd.lib on Windows Server 2003 and Windows XP
    • DLL: Kernel32.dll
    Ce n'est pas le cas pour toutes les fonctions de Vista, bien sûr, mais en l'occurrence je suis prêt à parier que cette fonction (sous XP) ne fait que wrapper de façon sécurisée l'appel à la fonction NtQueryInformationFile... Mais au moins, c'est blindé, 100% compatible avec le mode user et sans problèmes de réentrance.
    Il n'y a que pour Windows 2000 que tu es, potentiellement, dans la mouise.

    Citation Envoyé par camboui Voir le message
    Je veux bien utiliser les versions NtXxx au lieu de ZwXxx mais dans quel header sont-elles déclarées ? (pas ntddk.h en tout cas)
    Je n'ai pas le DDK sous le coude, mais je crois que c'est dans "Winternl.h".
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  13. #13
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Mac LAK
    Je n'ai pas le DDK sous le coude, mais je crois que c'est dans "Winternl.h".
    Bien vu et bonne mémoire!

  14. #14
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    J'ai bien tout lu, et je dois manifestement avoir un DDK trop vieux (novembre 2006), il n'y a pas de FileExtd.h ni de FileExtd.lib.

    Je ne vais probablement pas généralisé l'usage de ces fonctions un peu "cachées". En attendant de pouvoir utiliser la nouvelle fonction dispo depuis Vista et WS2008 je vais faire l'appel dynamique à NtXxx avec GetProcAddress. Au pire elle n'existe pas et tant pis, mais au moins le programme fonctionnera sur tous les Windows (depuis XP au moins) sans se demander si tel ou tel màj est installée.

    Merci à tous les deux !

  15. #15
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par camboui Voir le message
    J'ai bien tout lu, et je dois manifestement avoir un DDK trop vieux (novembre 2006), il n'y a pas de FileExtd.h ni de FileExtd.lib.
    Ah ben c'est malin, tiens...
    Blague à part : pourquoi ne télécharges-tu pas le dernier WDK sur le site MS ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

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

Discussions similaires

  1. Appel de fonction d'une DLL en TANSAC SQL
    Par sylvain114d dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/01/2006, 10h21
  2. Réponses: 5
    Dernier message: 11/02/2005, 16h52
  3. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  4. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57
  5. [VB6] Ajouter un commentaire à une fonction d'une DLL
    Par Ace303 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/06/2003, 08h14

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