KMDF : Problème de compilation

lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020 - 27 févr. 2008 à 17:56
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

8 réponses

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
27 févr. 2008 à 18:33
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
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
27 févr. 2008 à 18:36
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
0
valblade Messages postés 3 Date d'inscription samedi 20 septembre 2003 Statut Membre Dernière intervention 9 septembre 2008
9 sept. 2008 à 17:59
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.
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
9 sept. 2008 à 18:14
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
valblade Messages postés 3 Date d'inscription samedi 20 septembre 2003 Statut Membre Dernière intervention 9 septembre 2008
9 sept. 2008 à 18:52
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
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
9 sept. 2008 à 19:12
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
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
9 sept. 2008 à 19:17
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
0
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
Merci pour ton aide, mais le simple ajout du prototype a suffit à faire fonctionner mon driver.

Merci encore pour ton aide.
0
Rejoignez-nous