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

Signaler
Messages postés
10
Date d'inscription
mardi 26 octobre 2004
Statut
Membre
Dernière intervention
22 avril 2010
-
xela138
Messages postés
10
Date d'inscription
mardi 26 octobre 2004
Statut
Membre
Dernière intervention
22 avril 2010
-
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!

5 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
8
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
Messages postés
10
Date d'inscription
mardi 26 octobre 2004
Statut
Membre
Dernière intervention
22 avril 2010

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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
8
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.
Messages postés
10
Date d'inscription
mardi 26 octobre 2004
Statut
Membre
Dernière intervention
22 avril 2010

Merci beaucoup de ton aide, j'attend sa avec impatience.
Messages postés
10
Date d'inscription
mardi 26 octobre 2004
Statut
Membre
Dernière intervention
22 avril 2010

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.