begin process at 2012 05 30 09:16:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

System

 > 

[ServiceWin32] Lancer une Dll grace à SVCHOST.EXE


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

[ServiceWin32] Lancer une Dll grace à SVCHOST.EXE

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

xela138

Membre Club
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

xela138

Membre Club
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
lundi 12 avril 2010 à 13:52:57 | Re : [ServiceWin32] Lancer une Dll grace à SVCHOST.EXE

racpp

Administrateur CodeS-SourceS
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

xela138

Membre Club
Merci beaucoup de ton aide, j'attend sa avec impatience.
mardi 20 avril 2010 à 21:14:59 | Re : [ServiceWin32] Lancer une Dll grace à SVCHOST.EXE

racpp

Administrateur CodeS-SourceS
Réponse acceptée !
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
jeudi 22 avril 2010 à 21:24:59 | Re : [ServiceWin32] Lancer une Dll grace à SVCHOST.EXE

xela138

Membre Club
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.




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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales