KMDF : Problème de compilation

Messages postés
401
Date d'inscription
mercredi 19 avril 2006
Statut
Membre
Dernière intervention
6 juin 2011
- - Dernière réponse : valblade
Messages postés
3
Date d'inscription
samedi 20 septembre 2003
Statut
Membre
Dernière intervention
9 septembre 2008
- 9 sept. 2008 à 19:38
Bonjour,

A l'aide du WinDDK, j'essai de programmer un driver générique et surtout de comprendre comment tout cela fonctionne.

Malheureusement et ce qui était prévisible, le compilateur me ressort des erreurs.

#include <ntddk.h> 
#include <wdf.h>

NTSTATUS
  MyDriverDeviceAdd (
    IN WDFDRIVER Driver,
    IN PWDFDEVICE_INIT DeviceInit
    );
 
VOID 
  MyDriverUnload (
    IN WDFDRIVER  Driver
    );

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) 
{
   
    NTSTATUS status;
    WDF_DRIVER_CONFIG  config;

    DbgPrint("Lancement du driver\n");

    WDF_DRIVER_CONFIG_INIT(&amp;config,MyDriverDeviceAdd);

    config.EvtDriverUnload = MyDriverUnload;

// Erreur de compilation sur cette fonction
    status = WdfDriverCreate(
    DriverObject,
    RegistryPath,
    WDF_NO_OBJECT_ATTRIBUTES,
    &amp;config,
    WDF_NO_HANDLE
    );

    return STATUS_SUCCESS; 
}

NTSTATUS MyDriverDeviceAdd(Driver,DeviceInit){
DbgPrint("Nouveau device conecté");
return STATUS_SUCCESS;
}

VOID MyDriverUnload(Driver){
DbgPrint("unload driver");
}



Lorsque je commente la fonction WdfDriverCreate, cela compile très bien.
Lorsque je "décommente", le compilateur me sort une erreur de lien :

error LNK2001: unresolved external symbol _WdfFunctions
error LNK2001: unresolved external symbol _WdfDriverGlobals

J'ai beau regarder les exemples présent dans le winddk et chercher sur le  net, je ne trouve aucune référence à cette erreur.
J'en appel donc à la communauté pour trouver une piste et régler ce petit soucis

Merci d'avance,

Bonne Prog
Afficher la suite 

8 réponses

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
Bonjour,

Ce n'est pas le compilateur qui sort des erreurs mais l'éditeur de liens (error LNK = error LiNK editor) c'est à dire le programme qui réunit "tous les bouts de codes" pour créer l'exécutable final.
 
En l'occurence ici l'éditeur de liens ne trouve pas le code des fonctions "_WdfFunctions" et "_WdfDriverGlobals" parce qu'il manque dans le projet la librairie qui les contient (du genre "wdf.lib" par exemple). Cette librairie "wdf.lib" (ou autre !!!) peut être ajoutée dans le projet ou dans le code avec un #pragma comment(lib,"wdf.lib") après le #include <wdf.h>.

Jean-François
Commenter la réponse de cs_jfrancois
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
Complément !!!

Ce n'est pas forcément du code que l'éditeur de liens ne trouve pas ! Ca peut être aussi des données !

Jean-François
Commenter la réponse de cs_jfrancois
Messages postés
3
Date d'inscription
samedi 20 septembre 2003
Statut
Membre
Dernière intervention
9 septembre 2008
0
Merci
Bonjour,

J'ai un peu le même souci, j'utilise le WDK, et j'aimerais compiler un petit driver.

Néanmoins, j'ai un undefined reference sur ZwQuerySystemInformation... j'inclus pourtant wdm.h...

Quelqu'un aurait-il une idée?

Merci d'avance.
Commenter la réponse de valblade
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
Bonjour,

... Néanmoins, j'ai un undefined reference sur ZwQuerySystemInformation... j'inclus pourtant wdm.h. ...

Celà n'a rien à voir ! Le fichier d'entête wdm.h contient classiquement des descriptions (fonctions, classes, constantes, ...); il est utilisé par le compilateur. Ce qui manque c'est le fichier utilisé par le linker et qui contient le code de la fonction ZwQuerySystemInformation ! c'est à dire le fichier d'extension lib.

Jean-François
Commenter la réponse de cs_jfrancois
Messages postés
3
Date d'inscription
samedi 20 septembre 2003
Statut
Membre
Dernière intervention
9 septembre 2008
0
Merci
si je comprends bien, tu veux que j'ajoute un #pragma comment(lib,"ntdll.lib")

J'ai testé cela ne marche pas.

Par contre, j'ai vu sur certain extraits de code qu'une déclaration du prototype de ZwQuerySystemInformation est faite avant...

NTSYSAPI
NTSTATUS
NTAPI ZwQuerySystemInformation(
                        IN ULONG SystemInformationClass,
                        IN PVOID SystemInformation,
                        IN ULONG SystemInformationLength,
                        OUT PULONG ReturnLength);

Là par contre, ca compile (pas encore testé si cela marche), mais ca sens le hack pour eviter de faire crier le linker..
Sinon, je commence à peine le dev de driver, à quoi correspondent les macro IN et OUT?

Merci
Commenter la réponse de valblade
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
1) Si le prototype est ajouté avant forcément ça compile sans problème mais ça n'a toujours aucun rapport avec le linker qui se contrefiche totalement du code source ! La seule chose qui l'intéresse c'est qu'on lui fournisse le fichier lib qui contient le code de la fonction !!!

2) En cherchant ZwQuerySystemInformation() sur Google, je suis tombé sur MSDN qui annonce que cette fonction n'est plus suivie (ZwQuerySystemInformation may be altered or unavailable in subsequent versions of Windows. Applications should use the alternate functions listed in this topic). C'est peut-être pour ça qu'elle n'est pas trouvée dans ntdll.lib. Il est dit aussi qu'il faut l'utiliser en la chargeant explicitement (This function has no associated import library. You must use the LoadLibrary and GetProcAddress functions to dynamically link to Ntdll.dll) : il n'y a donc pas de fichier lib contenant le chargement implicite.

3) IN et OUT sont des macros qui ne génèrent rien. Elles sont là à titre indicatif pour signaler si le paramètre qui suit est en entrée (IN) ou en sortie (OUT) ... ou optionel (OPTIONAL).

Jean-François
Commenter la réponse de cs_jfrancois
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
Complément ! Le fichier lib contient le code de la fonction si c'est une bibliothèque statique ou le code de chargement implicite de la fonction si elle est disponible en DLL.

Jean-François
Commenter la réponse de cs_jfrancois
Messages postés
3
Date d'inscription
samedi 20 septembre 2003
Statut
Membre
Dernière intervention
9 septembre 2008
0
Merci
Merci pour ton aide, mais le simple ajout du prototype a suffit à faire fonctionner mon driver.

Merci encore pour ton aide.
Commenter la réponse de valblade