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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    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 : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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 éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    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 : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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 éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    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 émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    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 : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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

+ 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