Précédent   Forum des professionnels en informatique > Systèmes > Windows
Windows Forum d'entraide sur le système Windows. Lire la F.A.Q Windows XP et la F.A.Q Windows Vista
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/12/2011, 16h41   #1
Invité régulier
 
Inscription : mars 2010
Messages : 34
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : mars 2010
Messages : 34
Points : 8
Points : 8
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 !
JaroBx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 16h24   #2
Invité régulier
 
Inscription : mars 2010
Messages : 34
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : mars 2010
Messages : 34
Points : 8
Points : 8
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
JaroBx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 15h24   #3
Invité régulier
 
Inscription : mars 2010
Messages : 34
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : mars 2010
Messages : 34
Points : 8
Points : 8
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
JaroBx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 18h09   #4
Débutant
 
Homme
Inscription : janvier 2004
Messages : 435
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : janvier 2004
Messages : 435
Points : 245
Points : 245
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 :
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 :
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
moulefrite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2011, 10h20   #5
Invité régulier
 
Inscription : mars 2010
Messages : 34
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations forums :
Inscription : mars 2010
Messages : 34
Points : 8
Points : 8
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
JaroBx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h17.


 
 
 
 
Partenaires

Hébergement Web