[ServiceWin32] Lancer une Dll grace à SVCHOST.EXE [Résolu]

Messages postés
10
Date d'inscription
mardi 26 octobre 2004
Dernière intervention
22 avril 2010
- - Dernière réponse : xela138
Messages postés
10
Date d'inscription
mardi 26 octobre 2004
Dernière intervention
22 avril 2010
- 22 avril 2010 à 21:24
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

#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!
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Dernière intervention
14 novembre 2014
7
3
Merci
Salut,
Je viens de déposer le code source en espérant que tu y trouveras tout ce que tu cherches.
SERVICE-WINDOWS-DANS-DLL-LANCE-SVCHOST-EXE

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 112 internautes nous ont dit merci ce mois-ci

Commenter la réponse de racpp
Messages postés
10
Date d'inscription
mardi 26 octobre 2004
Dernière intervention
22 avril 2010
0
Merci
S'il vous plait aidez moi, je sais que la fonction n'est pas documénté, mais quelqu'un à forcement la solution, asus, hp, ... font tourner leurs services de cette maniére. BruNews aide moi
Commenter la réponse de xela138
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Dernière intervention
14 novembre 2014
7
0
Merci
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.
Commenter la réponse de racpp
Messages postés
10
Date d'inscription
mardi 26 octobre 2004
Dernière intervention
22 avril 2010
0
Merci
Merci beaucoup de ton aide, j'attend sa avec impatience.
Commenter la réponse de xela138
Messages postés
10
Date d'inscription
mardi 26 octobre 2004
Dernière intervention
22 avril 2010
0
Merci
Merci beaucoup à toi, sa marche parfaitement! Je te remercie du temps que tu as pris, et te souhaite une bonne continuation. En faite mon problème venait bel et bien du ServiveMain...arf.
Commenter la réponse de xela138

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.