Hook incompatible avec service windows ?

HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 2 mai 2006 à 21:35
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 4 mai 2006 à 13:30
J'ai codé un hook qui fonctionne quand on lance la fonction SetWindowsHookEx() depuis un exécutable (l'exécutable charge la DLL par la suite). Ensuite j'ai essayé de lancer ce hook avec un exécutable mais cette fois en tant que service windows et la ça se lance correctement, j'ai testé en debuggage la fonction de hook est belle et bien exécutée sans erreur mais le hook n'a aucun effet.

La question est la suivante, peut on lancer un hook à partir d'un service windows ?

Parce que je veux juste faire un launcher(lancer mon hook) au démarrage du service, c'est le seul traitement à effectuer. Et désactiver le hook en arrêtant le service biensur.
Pour info je lance mon hook à la fin de la fonction ServiceMain() :

//------------------------------------------------------------------------------------
    //On signal au SCM que le service est démarré.
    MyServiceStatus.dwCurrentState       = SERVICE_RUNNING;
    MyServiceStatus.dwCheckPoint         = 0;
    MyServiceStatus.dwWaitHint           = 0;

    /*On transmet au SCM le status actuel du service,
    à chaque changement de status il faut renvoyer la structure SERVICE_STATUS au SCM.*/
    SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus);

    //Placer ici le code que le service doit exécuter.
    //C'est ici que je lance mon hook.
    StartHook();

    return;
//------------------------------------------------------------------------------------

Voila merci d'avance

5 réponses

HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
3 mai 2006 à 13:10
BRUNEWS, ARNOTIC !!!! A L'AIDEEEEEEEEEEEE !
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 mai 2006 à 14:19
Désolé mais en ce moment, j'hésite à entrer dans un topic si je le sens un peu long, j'ai très peu de temps dispo.

Un hook est associé à un desktop, faut donc une synchro pour vérifier qu'un user est loggé et que ton service soit interactif avec le desktop.
Le plus simple est d'inscrire ton prog (non service) dans HKLM\....\run, il sera ainsi lancé pour chaque user.

ciao...
BruNews, MVP VC++
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
3 mai 2006 à 14:59
Ok, merci BruNews d'avoir pris le temps de répondre,

ben pour l'interaction avec le bureau il suffit de rajouter SERVICE_INTERACTIVE_PROCESS à la fonction CreateService() ?
parce que j'ai essayé et ça ne fonctionne toujours pas :

hService = CreateService(hSCManager, szServiceName, szServiceName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, szBinaryPathName, 0, 0, 0, 0, 0);

Ok si j'ai bien compris, il faudrai que je lance mon hook après que l'utilisateur se soit loggé, et le hook ne fonctionnera que sur la session de cet utilisateur. La je suis un peu perplex parce que justement j'ai testé en lançant mon service non pas au démarrage mais manuellement durant ma session et ça n'a toujours pas fonctionné.

Sinon au départ j'avais mis mon prog au démarrage, comme tu dit dans la BDR,  mais j'ai envie qu'il puisse être arrêté facilement sans passer par les lignes de commande, c'est pour ça que j'ai voulu le passer en services windows.

En tout cas merci encore.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 mai 2006 à 11:03
Je reste persuadé que ton service n'est pas attaché à un desktop, le thread de ton service lançant SetWindowsKookEx doit l'être par force.
Regarde SetThreadDesktop() dans MSDN.

ciao...
BruNews, MVP VC++
0

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

Posez votre question
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
4 mai 2006 à 13:30
Ok, ta surement raison man, j'ai fait 2-3 tests la dans ma fonction ServiceMain() qui lance le hook :

HDESK hDesk = GetThreadDesktop(GetCurrentThreadId());
Pour récuperer le handle du desktop associé au thread du service qui lance mon hook, et il me renvoi un handle qui ne correspond pas à mon bureau actuel !

J'ai donc essayé de changer tout ça :

HDESK hDesk = (HDESK)GetDesktopWindow();
BOOL bRes = SetThreadDesktop(hDesk);
bRes me renvoi ERROR_INVALID_HANDLE alors que hDesk contient bien le handle de mon bureau actuel.

De toute façon ça commence a me saouler ce truc la je crois que je vais abandonner l'idée du service et retourner à la solution de départ...

Merci encore BruNews
0
Rejoignez-nous