Accueil > Forum > > > > [ServiceWin32] Lancer une Dll grace à SVCHOST.EXE
[ServiceWin32] Lancer une Dll grace à SVCHOST.EXE
mardi 6 avril 2010 à 15:43:16 |
[ServiceWin32] Lancer une Dll grace à SVCHOST.EXE

xela138
|
Bonjour,
Je souhaiterai obtenir de l'aide, je n'arrive pas à lancer un service de ma conception. Il s'installe à priori sans probleme, mais quand le system se lance le service reste en démarrage mais ne démarre pas. Je tourne en rond aidez moi s'il vous plait.
Le loader(.exe) fait un LoadLibrary sur la DLL donc elle s'install grace à setup, ensuite au redemarage le service reste figé avec le message "démarrage", ProcessExplorer affiche bien svchost.exe avec MyService.dll chargé, je voit pas ou est le probleme. le meme service fonctionne en version normal (.exe)...je suis vraiment perdu, les seules infos que j'ai trouvés sont là:
Writing a service that runs under svchost
SVCHOST
Code C/C++ :
#include <Winsvc.h>
#include <stdlib.h>
#include <stdio.h>
//link...
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "user32.lib")
//prototype
__declspec(dllexport) void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
__declspec(dllexport) void WINAPI ServiceCtrlHandler(DWORD Opcode);
BOOL InstallService(LPCSTR lpszBinPath, LPCTSTR lpszBinaryPathName, LPCSTR lpszServiceGroup, LPCSTR lpszServiceName, LPCSTR lpszDisplayName);
BOOL DeleteService(LPCSTR lpszServiceName);
int Setup(void);
BOOL bRunning = true;
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
char ServiceGroup[MAX_PATH] = "ServiceGroup";// instance de svchost
char ServiceName[MAX_PATH] = "MyService";
char ServiceDisplayName[MAX_PATH] = "MyServiceDisplayedName";
char ServiceBinName[MAX_PATH] = "MyService.dll";
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ) // reserved
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
Setup();
break;
case DLL_THREAD_ATTACH:
Setup();
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
int Setup(void)
{
//start the service
// SERVICE_TABLE_ENTRY Table[]={{ServiceName,ServiceMain},{NULL,NULL}};
// StartServiceCtrlDispatcher(Table);
//SVCHOST charge directement ServiceMain
// donc pas bessoin de StartServiceCtrlDispatcher
//install service
char lpszRunPath[MAX_PATH] = "%SYSTEMROOT%\\System32";
char lpszBinaryPath[MAX_PATH] = "%SYSTEMROOT%\\System32";
strcat(lpszRunPath, "\\svchost.exe -k ");
strcat(lpszRunPath, ServiceGroup);
strcat(lpszBinaryPath, "\\");
strcat(lpszBinaryPath, ServiceBinName);
//install service
if (!InstallService(lpszBinaryPath, lpszRunPath, ServiceGroup, ServiceName, ServiceDisplayName)){
MessageBox(GetFocus(),"Can't install Service","Info",S_OK|MB_ICONINFORMATION);
return -1;
}
//exit
return 0;
}
__declspec(dllexport) void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
DWORD status;
DWORD specificError;
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
m_ServiceStatusHandle = RegisterServiceCtrlHandler("MyService", ServiceCtrlHandler);
if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
{
return;
}
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
{
}
bRunning=true;
while(bRunning)
{
Sleep(10000);
FILE* pfile;
pfile = fopen("bla.txt","a");
fputs("blabla\n",pfile);
fclose(pfile);
}
return;
}
__declspec(dllexport) void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
bRunning=false;
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
return;
}
BOOL InstallService(LPCSTR lpszBinPath, LPCTSTR lpszBinaryPathName, LPCSTR lpszServiceGroup, LPCSTR lpszServiceName, LPCSTR lpszDisplayName)
{
SC_HANDLE schSCManager,schService;
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
return false;
schService = CreateService(schSCManager,lpszServiceName,
lpszDisplayName, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
// SERVICE_DEMAND_START, // start type
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL, // error control type
//SERVICE_ERROR_IGNORE,
lpszBinaryPathName, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
if (schService == NULL)
return false;
CloseServiceHandle(schService);
//Add the service path and some stuff
//install svchost startup
HKEY hservice;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\Svchost", (DWORD)NULL,KEY_ALL_ACCESS, &hservice);
RegSetValueEx(hservice,lpszServiceGroup, (DWORD)NULL, REG_MULTI_SZ, (const BYTE *)lpszServiceName, strlen(lpszServiceName));
RegCloseKey(hservice);
char szRegpath[MAX_PATH] = "";
sprintf(szRegpath, "SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters", lpszServiceName);
//RegOpenKeyEx(HKEY_LOCAL_MACHINE, regpath, (DWORD)NULL,KEY_ALL_ACCESS, &hservice);
if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, szRegpath, 0, 0, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, 0, &hservice, 0))
return false;
RegSetValueEx(hservice,"ServiceDLL", (DWORD)NULL, REG_EXPAND_SZ, (const BYTE *)lpszBinPath, strlen(lpszBinPath));
DWORD val = 0;
RegSetValueEx(hservice,"ServiceDllUnloadOnStop", (DWORD)NULL, REG_DWORD, (const BYTE *)&val, sizeof(val));
RegSetValueEx(hservice,"ServiceMain", (DWORD)NULL, REG_SZ, (const BYTE *)"ServiceMain", strlen("ServiceMain"));
RegCloseKey(hservice);
return true;
}
BOOL DeleteService(LPCSTR lpszServiceName)
{
SC_HANDLE schSCManager;
SC_HANDLE hService;
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
return false;
hService=OpenService(schSCManager,lpszServiceName,SERVICE_ALL_ACCESS);
if (hService == NULL)
return false;
if(DeleteService(hService)==0)
return false;
if(CloseServiceHandle(hService)==0)
return false;
return true;
}
La compilation ne genere aucune erreures, j'ai aussi essayé de rajouter un .def pour exporter ServiceMain()...sans succes.
Merci d'avance pour votre aide!
|
|
mercredi 7 avril 2010 à 10:16:41 |
Re : [ServiceWin32] Lancer une Dll grace à SVCHOST.EXE
|
lundi 12 avril 2010 à 13:52:57 |
Re : [ServiceWin32] Lancer une Dll grace à SVCHOST.EXE

racpp
|
Salut,
C'est vrai qu'il y a peu d'informations à ce sujet sur le net. J'avais une fois besoin de faire un truc pareil pour une application sous XP. Après avoir creusé un peu j'ai réussi à tout faire fonctionner comme voulu. Finalement, ce n'est pas très compliqué. Je vais essayer, dès que possible, d'adapter mon code pour pouvoir le poster sur cppfrance en espérant que ce sera utile.
|
|
lundi 12 avril 2010 à 14:20:28 |
Re : [ServiceWin32] Lancer une Dll grace à SVCHOST.EXE
|
mardi 20 avril 2010 à 21:14:59 |
Re : [ServiceWin32] Lancer une Dll grace à SVCHOST.EXE
|
jeudi 22 avril 2010 à 21:24:59 |
Re : [ServiceWin32] Lancer une Dll grace à SVCHOST.EXE
|
Cette discussion est classée dans : service, return, dword, servicestatus, hservice
Répondre à ce message
Sujets en rapport avec ce message
Savoir le Nombre de copies àimprimées par MS Office WORD [ par Redhouane_KM ]
Salue, J’ai réalisé un programme pour surveiller et sauvegarder tous les taches de l’imprimante dans un fichier LOG, (nom du document, nombre de pages
Timer & service [ par deck_bsd ]
Bonjour à tous.Voici mon problème,J'ai crée un timer dans mon service, mais celui-ci ne fonctionne pas (je suis certain que c'est le timer car j'ai te
Erreur StartService [ par Taron31 ]
Bonjour, je souhaiterais créer un service (Driver) ainsi que le lancer, voici mon code, l'erreur se situe au niveau de l'appel StartService avec le co
Lecteur secteur disque [ par akalys ]
Bonjour à tous,Je désire créer un petit prog pour lire les secteur d'un dique.(en hexa)Voici mon code :#include #include #include using namespace s
HOOK PROBLEME DLL [ par wxccxw ]
hello, je vais une dll de hook et j'obtient sa :MON CODE :#include FARPROC fpRegQueryValueEx; // Buffer de l'adresse de la fonctionFARPROC fpRegOpenKe
Un problème de registre [ par nightlord666 ]
Bonjour ! J'ai fait un code me permettant de lister des préférences de mon application. Elles sont contenues dans la clé HKCU/Software/Test/Preference
Service Windows [ par Ombitious_Developper ]
Salut :Comment peut-on créer un service WINDOWS en C/C++?Je veux créer un programme qui s'exécute en arrière plan.Et Merci ...
probleme avec les if et else [ par alexfr34 ]
alexfr34 Bonjour, j'ai perdu le fil avec le chat je ne comprends pas trop le mode d'emploi quelqu'un
Envoyer un message WM_USER à un service ? [ par spectrobob ]
Comment fait-on pour envoyer un message de type WM_USER d'un exécutable console (MFC) vers un service windows (MFC) donc sans handle de fenêtre ?Merc
Service: compte LocalSystem -> voir processus de tout les comptes [ par Willi ]
Bonjour,Je rencontre un petit soucis.Voila j'ai fait un petit service Windows s'executant sous le compte LocalSystem qui tout les x secondes doit véri
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|