HeavenForsaker
Messages postés223Date d'inscriptionmercredi 13 juillet 2005StatutMembreDernière intervention 8 août 2011
-
2 mai 2006 à 21:35
HeavenForsaker
Messages postés223Date d'inscriptionmercredi 13 juillet 2005StatutMembreDerniè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();
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
HeavenForsaker
Messages postés223Date d'inscriptionmercredi 13 juillet 2005StatutMembreDerniè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 :
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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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++
Vous n’avez pas trouvé la réponse que vous recherchez ?
HeavenForsaker
Messages postés223Date d'inscriptionmercredi 13 juillet 2005StatutMembreDerniè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...