|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : mars 2010 Messages : 34 ![]() |
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 ! |
|
|
00
|
|
|
#2 |
|
Invité régulier
![]() Inscription : mars 2010 Messages : 34 ![]() |
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 |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : mars 2010 Messages : 34 ![]() |
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 |
|
|
00
|
|
|
#4 | |||||
|
Débutant
Inscription : janvier 2004 Messages : 435 ![]() |
Citation:
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 :
Code :
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 |
|||||
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : mars 2010 Messages : 34 ![]() |
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 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com