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 :

Driver sur Windows CE 6


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 41
    Par défaut Driver sur Windows CE 6
    Bonjour à tous,

    Je développe sur Visual Studio 2005 une application pour Windows CE 6.
    Mon application a besoin de discuter avec le noyau, j'ai donc aussi un driver noyau qui se charge dans l'image de l'OS.

    Autant le driver noyau que l'application s'exécute (charge) normalement, sauf dans un cas particulier.

    Pour que mon application donne des données au driver noyau, j'utilise DeviceIoControl. Dans mon cas je veux lui transmettre un(e) HANDLE. En effet, j'aimerais que mon driver noyau me fasse un SetEvent sur cette handle lorsque son traitement est terminé, du côté utilisateur je fais un WaitForSingleObject.
    Cependant, lorsque je fais mon fameux SetEvent, GetLastError me retour l'erreur 6 (à savoir ERROR_INVALID_HANDLE). J'ai comparé les Handles de l'espace utilisateur à leurs clone dans le noyau et ils sont identiques.

    Est-ce que mon problème vient du fait que mon handle est déclaré dans l'espace utilisateur et qu'elle est levée dans le noyau ? Si oui, quelle serait l'alternative à adopter ?

    Sinon, est-ce qu'il y a une méthode qui fait ce que je veux ? Mais dont j'ignore l’existence.

    Merci et bon week-end !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 41
    Par défaut
    Le problème évoqué est reglé, si ça peut intéresser qqn : j'ai déclarer mon HANDLE dans l'espace noyau, je passe une référance sur ce HANDLE à l'espace utilisateur, depuis là l'application est capable de se mettre en attente.

    Maintenant j'ai un autre problème, j'utilise un driver pour passer des signaux. cepenandant je ne suis pas sûr qu'il soit installé comme il faut. En effet, lorsque je fais un CreateFile, j'obtiens l'erreur 55. Cette fonction demande un descripteur de fichier ou de périphériques. Tout en sachant que je n'ai pas d'interface graphique (je rappelle que je suis sous CE 6), est-ce qu'il y a une commande qui liste tous les prériphériques (genre COM1, COM2, etcc ) ?

    Merci d'avance

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 41
    Par défaut
    Tous les problèmes évoqués précédemment sont résolus.
    Mais maintenant un autre problème se pose, cette fois au niveau de l'utilisation de KernelLibIoControl.

    La valeur contenue dans mon buffer d'entrée change, je trouve ça très bizarre.
    En effet, je passe un pointeur sur une structure à KernelLibIoControl, mais dans ma fonction IOControl les valeurs de tous les champs de ma struct n'ont rien à voir
    J'ai controllé que LoadIntChainHandler (pour mon premier paramètre de KernelLibIoControl) est correct et c'est le cas.
    Y'a-t-il une possibilité de spécifier un mapping entre un driver et son ISR ?
    Quelqu'un a-t-il une idée ? même si elle a l'air farfelue j'accepte

    Merci

  4. #4
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par défaut
    Citation Envoyé par JaroBx Voir le message
    Tous les problèmes évoqués précédemment sont résolus.
    Mais maintenant un autre problème se pose, cette fois au niveau de l'utilisation de KernelLibIoControl.

    La valeur contenue dans mon buffer d'entrée change, je trouve ça très bizarre.
    En effet, je passe un pointeur sur une structure à KernelLibIoControl, mais dans ma fonction IOControl les valeurs de tous les champs de ma struct n'ont rien à voir
    J'ai controllé que LoadIntChainHandler (pour mon premier paramètre de KernelLibIoControl) est correct et c'est le cas.
    Y'a-t-il une possibilité de spécifier un mapping entre un driver et son ISR ?
    Quelqu'un a-t-il une idée ? même si elle a l'air farfelue j'accepte

    Merci
    Bonjour JaroBX,

    J'ai pas tres bien compris ton soucis, t'aurai un bout de code à nous montrer.

    Voici comment j'utilise les IOCTL sous winCE ( dans le cas d'un port COM) :

    1 ) CreateFile ==>>> te retourne un handle
    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
    // nom du fichier : winbase.h
    
    WINBASEAPI
    HANDLE
    WINAPI
    CreateFileW(
        LPCWSTR lpFileName,
        DWORD dwDesiredAccess,
        DWORD dwShareMode,
        LPSECURITY_ATTRIBUTES lpSecurityAttributes,
        DWORD dwCreationDisposition,
        DWORD dwFlagsAndAttributes,
        HANDLE hTemplateFile
        );
    
    ((PT_CONTEXT)pContext)->StrContextPP.hnd = CreateFile( lpPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
    2 ) DeviceIoControl à appeler avec ton Handle, l'IOCTL que tu veu utiliser et tes différents buffer en E/S
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WINBASEAPI 
    BOOL 
    WINAPI DeviceIoControl (HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
    
    		DeviceIoControl(
    		((PT_CONTEXT)pContext)->StrContextPP.hnd , // Handle
    		IOCTL_IRD_SET_POWER_DOWN,  // IOCTL
    		NULL, 
    		NULL, 
    		NULL, 
    		NULL, 
    		NULL, 
    		NULL);
    Du coté de ton pointeur regarde s'il est correctement "casté", sachant que le type de pointeur par defaut est un "LPVOID".
    Te serait-il possible d'utiliser un IOCTL dans lequel tu ne passerai pas de pointeur et donc d'utiliser un simple "NULL"
    C'a te permettrai de t'assurer que ton "CAST" soit la raison de ton problème.

    En esperant t'avoir aidé,

    Cordialement,

    Moulefrite

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 41
    Par défaut
    Salut,

    Merci pour ta réponse

    Le problème a été résolu.
    Petite précision, le problème se posait avec "KernelLibIoControl" et non pas avec "DeviceIoControl".

    La solution que j'ai trouvé et qui fonctionne à tous les coups, c'est de faire un CeOpenCallerBufer(...) avant le KernelLibIoControl et CeCloseCallerBuffer() après.

    Bonne journée

Discussions similaires

  1. Réponses: 10
    Dernier message: 20/01/2016, 00h13
  2. Driver OLEDB Sybase ASE sur windows server 2012
    Par darkelend dans le forum Outils
    Réponses: 1
    Dernier message: 14/08/2013, 17h47
  3. Réponses: 2
    Dernier message: 29/11/2012, 17h39
  4. Réponses: 2
    Dernier message: 11/09/2009, 18h24
  5. Pb Driver JDBC sur Windows XP SP2
    Par asterix76-rouen dans le forum JDBC
    Réponses: 1
    Dernier message: 25/02/2008, 08h35

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