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

C++ Discussion :

[DRIVER] besoin d'aide


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut [DRIVER] besoin d'aide
    Bonsoir à tous !

    Je voudrais créer un simple driver noyau implémentant la fonction HalMakeBeep(), voici les codes :

    bip.c
    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
    18
    #include <ntddk.h>
     
    NTSTATUS DriverEntry(IN PDRIVER_OBJECT  DriverObject, IN PUNICODE_STRING  RegistryPath);
     
    #ifdef ALLOC_PRAGMA
    #pragma alloc_text( INIT, DriverEntry )
    #endif 
     
    NTSTATUS DriverEntry(IN PDRIVER_OBJECT  DriverObject, IN PUNICODE_STRING  RegistryPath)
    {
    	INT32 i;
    	HalMakeBeep(880);
    	for(i=0; i<1000000; i++)
    	{
    	}
    	HalMakeBeep(0);
    	return STATUS_DEVICE_CONFIGURATION_ERROR;
    }
    sources:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TARGETNAME=bip
    TARGETTYPE=DRIVER
     
    TARGETLIBS= \
     $(DDK_LIB_PATH)\hal.lib
     
    SOURCES=bip.c
    je lance build.exe (le makefile est présent) et tout compile parfaitement.
    Je test le driver avec le programme suivant :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <windows.h>
     
    int main()
    {
    	HANDLE hSCManager;
    	HANDLE hService;
    	char acDriverPath[MAX_PATH] = "";
     
    	hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
    	if(hSCManager != NULL)
    	{
    		GetFullPathName("bip.sys",MAX_PATH,acDriverPath,NULL);
    		hService = CreateService(hSCManager,"bip","bipbip",SERVICE_START|DELETE,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,acDriverPath,NULL,NULL,NULL,NULL,NULL);
     
    		if(hService != NULL)
    		{
    			StartService(hService,0,NULL);
    			DeleteService(hService);
    			CloseServiceHandle(hService);
    		}
     
    		else
    			MessageBox(NULL,"erreur service",NULL,MB_ICONSTOP);
     
    	}
     
    	else
    		MessageBox(NULL,"erreur connexion",NULL,MB_ICONSTOP);
     
    	return 0;
    }
    qui compile et lance bien le service... mais aucun son n'est produit !

    Est-ce que quelqu'un pourrait m'aider svp ? C'est mon premier driver et je ne sais pas ce qui cloche

  2. #2
    Membre averti Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Points : 358
    Points
    358
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HalMakeBeep(880);
    	for(i=0; i<1000000; i++)
    	{
    	}
    	HalMakeBeep(0);

    Presque pratiquement sur que ce bout de code est optimisé par le compilateur, pour donner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HalMakeBeep(880);
    HalMakeBeep(0);
    Puisque la boucle for ne fait rien ...

    Utilise la fonction Sleep ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Sleep en ring0 ca fonctionne ?

    sinon un truc bizarre ma fonction StartService() retourne 0

    Return Values
    If the function succeeds, the return value is nonzero.

    If the function fails, the return value is zero. To get extended error information, call GetLastError.

    The following error codes can be set by the service control manager. Others can be set by the registry functions that are called by the service control manager.

    Error code Meaning
    ERROR_ACCESS_DENIED The specified handle was not opened with SERVICE_START access.
    ERROR_INVALID_HANDLE The specified handle is invalid.
    ERROR_PATH_NOT_FOUND The service binary file could not be found.
    ERROR_SERVICE_ALREADY_RUNNING An instance of the service is already running.
    ERROR_SERVICE_DATABASE_LOCKED The database is locked.
    ERROR_SERVICE_DEPENDENCY_DELETED The service depends on a service that does not exist or has been marked for deletion.
    ERROR_SERVICE_DEPENDENCY_FAIL The service depends on another service that has failed to start.
    ERROR_SERVICE_DISABLED The service has been disabled.
    ERROR_SERVICE_LOGON_FAILED The service could not be logged on. This error occurs if the service was started from an account that does not have the "Log on as a service" right.
    ERROR_SERVICE_MARKED_FOR_DELETE The service has been marked for deletion.
    ERROR_SERVICE_NO_THREAD A thread could not be created for the service.
    ERROR_SERVICE_REQUEST_TIMEOUT The process for the service was started, but it did not call StartServiceCtrlDispatcher, or the thread that called StartServiceCtrlDispatcher may be blocked in a control handler function.

    En l'occurence, GetLastError() me renvoie l'erreur 87 (ERROR_INVALID_PARAMETER "The parameter is incorrect.")

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Bon désolé je me suis trompé l'erreur retournée par CreateService provient du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	return STATUS_DEVICE_CONFIGURATION_ERROR;
    qui se trouve dans mon driver.
    ¨
    Peut-être que le problème est bien celui soulevé par Kujara, mais comment le résoudre car je ne suis pas sûr que Sleep soit utilisable en ring0

    Edit :
    C'est bien le bon problème puisque j'ai fait une fonction pause
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void pause()
    {
    	__asm
    	{
    		mov eax,0h
    	Boucle:
    		inc eax
    		cmp eax,18000000h
    		jb Boucle	
    	}
    }
    qui donne le bon résultat !

    Ma nouvelle question est donc : est-ce qu'il y a un équivalent de Sleep en ring0 ?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par TheShade Voir le message
    Bonsoir à tous !

    Je voudrais créer un simple driver noyau implémentant la fonction HalMakeBeep(),
    <snip>
    Désolé d'enc* les mouches, mais cette faute, si elle est avérée, me soulève le coeur : Apparemment vu ton code posté, tu n'implémentes pas là, tu utilises...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par TheShade Voir le message
    C'est bien le bon problème puisque j'ai fait une fonction pause
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void pause()
    {
    	__asm
    	{
    		mov eax,0h
    	Boucle:
    		inc eax
    		cmp eax,18000000h
    		jb Boucle	
    	}
    }
    qui donne le bon résultat !
    Je ne crois pas que utiliser 100% de CPU pour attendre soit un bon résultat (et je ne vois pas pourquoi Sleep() ne marcherait pas en ring0), et de toute maniere, je ne crois pas non plus que le ring0 soit une bonne idée (les kmd, j'espère, seront complètement éradiqués un de ces jours).

    Mais cet avis n'engage que moi !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    pour utiliser HalMakeBeep() je dois être en ring0, et le moyen le plus simple est d'utiliser un kmd.

    Sinon je pensais que justement on ne pouvait pas utiliser les API windows en kernel mode ?!?

    En tous cas si je fais seulement , il me dit qu'il ne connait pas sleep, et si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <ntddk.h>
    #include <windows.h>
    , il ne veut pas compiler car il trouve plein de redefinitions dans windows.h

  8. #8
    Membre averti Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Points : 358
    Points
    358
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		extern "C"
    		{
    			__declspec(dllimport) void __stdcall Sleep( unsigned long );
    		}

    Essaye ça, si tu n'a besoin que de la fonction sleep, ça marchera probablement, si ton programme arrive a linker avec les bonnes .lib

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    J'ai essayé de mettre ca et de linker avec kernel32.lib :
    1- Ca ne compile pas car il ne comprend pas le extern "C"
    2- Je l'enlève, ca compile, mais ca ne fonctionne pas
    3- Je commente le sleep, je recompile, et tout fonctionne

    Au pire, si je ne peux pas utiliser Sleep, je viens de voir les fonctions KeInitializeTimer et KeSetTimer

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    C'est bon j'ai trouvé il fallait utiliser KeDelayExecutionThread()

    Merci quand même !
    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/07/2010, 14h46
  2. Besoin d'aide pour portage d'un driver windows vers QNX
    Par stef88 dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 22/08/2007, 10h21
  3. besoin d'aide pour le composant DBComboBox
    Par jane2002 dans le forum Bases de données
    Réponses: 8
    Dernier message: 28/02/2004, 19h01
  4. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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