begin process at 2012 05 27 19:15:17
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > SERVICE WINDOWS DANS UNE DLL LANCÉ PAR SVCHOST.EXE

SERVICE WINDOWS DANS UNE DLL LANCÉ PAR SVCHOST.EXE


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :Service, Dll, svchost, netsvcs, CreateTimerQueueTimer Niveau :Débutant Date de création :20/04/2010 Vu / téléchargé :3 786 / 210

Auteur : racpp

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce code source montre comment implémenter un service Windows dans une DLL afin qu'il soit exécuté par un processus hôte svchost.exe. Au démarrage de Windows, le système examine une clé de la base de registres pour grouper des services dans diférentes instances de svchost.exe. Notre service fera partie du groupe netsvcs. Ce dernier présente l'avantage de s'exécuter en LocalSystem. Notre DLL exporte trois fonctions : ServiceMain(), obligatoire, InstallService() et RemoveService(). Les deux dernières servent à installer/désinstaller le service  grâce à l'utilisation de RunDll32 en ligne de commandes. A noter que l'invite de commandes doit être lancé en mode administrateur. On peut mettre le fichier RacppService.dll dans le dossier System32 puis, pour installer le service, taper la ligne suivante:
rundll32 racppservice.dll InstallService
Pour supprimer le service on tape:
rundll32 racppservice.dll RemoveService
Si on choisit un autre emplacement que System32, il faudra taper le chemin complet de la dll. L'installation ou la suppression de notre service nécessite un redémarrage de Windows.
Tous les détails de l'installation et de la configuration de notre service figurent dans le code de la fonction InstallService().
Notre service utilise un timer pour écrire, toutes les minutes, dans un fichier log c:\racppservice.log, la date et l'heure du déclenchement du timer. Ceci est juste pour montrer le bon fonctionnement du service. Pour tous les détails, regarder le code source.
Le code est réalisé en c sous Visual C/C++ 2005 mais il est facilement adaptable pour les autres outils.
Pour préserver la clarté du code, la gestion des erreurs est minimale.
Le service a tété testé sans aucun problème sous Windows XP, Vista et 7.
La dll RacppService.dll est fournie dans le zip si vous vouler tester.
Voilà, j'espère n'avoir rien oublié.
Tous les commentaires ou remarques sont les bienvenus.

Source

  • #define _WIN32_WINNT 0x0500 // Pour Windows 2000 et supérieur
  • #include <windows.h>
  • // Déclarations globales:
  • HINSTANCE hDll;
  • SERVICE_STATUS_HANDLE hServiceStatusHandle;
  • SERVICE_STATUS ServiceStatus;
  • HANDLE hEvent,hFile;
  • char buff[MAX_PATH];
  • // Fonction d'installation du service:
  • int WINAPI InstallService()
  • {
  • HKEY hkService,hkSvchost;
  • SC_HANDLE schScm ,schService;
  • char* pData;
  • DWORD dwError=0, dwLen,dwSize = 0;
  • // Ouvrir le gestionnaire de services:
  • schScm = OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS);
  • if(schScm)
  • {
  • // Créer notre service:
  • schService = CreateService(schScm, "RacppService", 0, SERVICE_ALL_ACCESS, SERVICE_WIN32_SHARE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, "%SystemRoot%\\System32\\svchost.exe -k netsvcs", 0, 0, 0, 0, 0);
  • if(schService)
  • {
  • // Ajouter une description à notre service:
  • SERVICE_DESCRIPTION sd;
  • sd.lpDescription = "Service dans une DLL lancé par svchost.exe";
  • ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION, &sd);
  • // Ajouter la sous-clé Parameters à la clé de notre service:
  • RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\RacppService\\Parameters", 0, 0, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, 0, &hkService, 0);
  • // Récupérer le chemin complet de notre Dll:
  • GetModuleFileName(hDll, buff, sizeof(buff));
  • // Affecter le chemin de la Dll à la sous-clé Parameters sous le nom ServiceDll:
  • RegSetValueEx(hkService, "ServiceDll", 0, REG_EXPAND_SZ, (BYTE*)buff, lstrlen(buff)+1);
  • // Fermer la clé de notre service:
  • RegCloseKey(hkService);
  • // Ouvrir la clé indiquant la liste des groupes d'instances de svchost.exe:
  • RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost", 0, KEY_ALL_ACCESS, &hkSvchost);
  • // Obtenir la longueur du contenu du groupe netsvcs:
  • RegQueryValueEx(hkSvchost, "netsvcs", 0, 0, 0, &dwSize);
  • // Fixer le nom de notre service pour la liste des services du groupe netsvcs:
  • lstrcpy(buff,"RacppService");
  • dwLen=lstrlen(buff);
  • // Allouer la mémoire nécessaire pour la nouvelle liste des noms de services du groupe netsvcs:
  • pData=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSize + dwLen + 1);
  • if(pData)
  • {
  • char *pNames;
  • // Récupérer la liste des noms de services du groupe netsvcs:
  • RegQueryValueEx(hkSvchost, "netsvcs", 0, 0, (BYTE*)pData, &dwSize);
  • // Vérifier si le nom existe
  • for (pNames = pData; *pNames; pNames=strchr(pNames,0)+1) if(!lstrcmpi(pNames, buff)) break;
  • // L'ajouter s'il n'existe pas:
  • if (*pNames == 0)
  • {
  • memcpy(pData + dwSize - 1, buff, dwLen + 1);
  • RegSetValueEx(hkSvchost, "netsvcs", 0, REG_MULTI_SZ, (BYTE*)pData, dwSize + dwLen + 1);
  • }
  • else dwError=ERROR_ALREADY_EXISTS;
  • // Libérer la mémoire allouée:
  • HeapFree(GetProcessHeap(),0,pData);
  • }
  • else dwError=ERROR_NOT_ENOUGH_MEMORY;
  • // Fermer la clé svchost:
  • RegCloseKey(hkSvchost);
  • // Fermer le handle de notre service:
  • CloseServiceHandle(schService);
  • }
  • // Fermer le handle du gestionnaire de services:
  • CloseServiceHandle(schScm);
  • }
  • // Retourner dwError si non nul, sinon GetLastError():
  • return dwError? dwError : GetLastError();
  • }
  • // Fonction de désinstallation du service:
  • DWORD WINAPI RemoveService()
  • {
  • HKEY hkSvchost;
  • SC_HANDLE schScm ,schService;
  • char* pData;
  • DWORD dwError=0,dwSize = 0;
  • // Ouvrir le gestionnaire de services:
  • schScm = OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS);
  • if(schScm)
  • {
  • // Ouvrir notre service:
  • schService=OpenService(schScm,"RacppService",SERVICE_ALL_ACCESS);
  • if(schService)
  • {
  • // Supprimer le service:
  • if(DeleteService(schService))
  • {
  • // Ouvrir la clé indiquant la liste des groupes d'instances de svchost.exe:
  • RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost", 0, KEY_ALL_ACCESS, &hkSvchost);
  • // Obtenir la longueur du contenu du groupe netsvcs:
  • RegQueryValueEx(hkSvchost, "netsvcs", 0, 0, 0, &dwSize);
  • // Fixer le nom de notre service pour la liste des services du groupe netsvcs:
  • lstrcpy(buff,"RacppService");
  • // Allouer la mémoire nécessaire pour tous les noms de services du groupe netsvcs:
  • pData=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSize);
  • if(pData)
  • {
  • char *pNames;
  • // Récupérer la liste des noms de services du groupe netsvcs:
  • RegQueryValueEx(hkSvchost, "netsvcs", 0, 0, (BYTE*)pData, &dwSize);
  • // Vérifier si le nom existe:
  • for (pNames = pData; *pNames; pNames=strchr(pNames,0)+1) if(!lstrcmpi(pNames,buff)) break;
  • // Le supprimer s'il existe:
  • if (*pNames)
  • {
  • char* pNext;
  • pNext=strchr(pNames,0)+1;
  • memcpy(pNames,pNext,dwSize-(pNext-pData));
  • RegSetValueEx(hkSvchost, "netsvcs", 0, REG_MULTI_SZ, (BYTE*)pData, dwSize -(lstrlen(buff)+1));
  • }
  • else dwError=ERROR_NO_SUCH_MEMBER;
  • // Libérer la mémoire allouée:
  • HeapFree(GetProcessHeap(),0,pData);
  • }
  • else dwError=ERROR_NOT_ENOUGH_MEMORY;
  • // Fermer la clé svchost:
  • RegCloseKey(hkSvchost);
  • }
  • // Fermer le handle de notre service:
  • CloseServiceHandle(schService);
  • }
  • // Fermer le handle du gestionnaire de services:
  • CloseServiceHandle(schScm);
  • }
  • // Retourner dwError si non nul, sinon GetLastError():
  • return dwError? dwError : GetLastError();
  • }
  • // Fonction HandlerEx communiquant avec le gestionnaire de services:
  • DWORD WINAPI HandlerEx(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
  • {
  • switch(dwControl)
  • {
  • case SERVICE_CONTROL_STOP:
  • case SERVICE_CONTROL_SHUTDOWN:
  • // Mettre le service à l'état "En cours d'arrêt":
  • ServiceStatus.dwWaitHint = 1000;
  • ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
  • SetServiceStatus(hServiceStatusHandle, &ServiceStatus );
  • // Mettre l'Event à l'état signalé:
  • SetEvent(hEvent);
  • return NO_ERROR;
  • default:
  • ServiceStatus.dwWaitHint = 0;
  • break;
  • }
  • SetServiceStatus(hServiceStatusHandle, &ServiceStatus);// Obligatoire selon MSDN
  • return NO_ERROR;
  • }
  • // Fonction Callback appelée toutes les minutes notre timer:
  • VOID CALLBACK TimerProc( LPVOID lpParameter,BOOLEAN TimerOrWaitFired)
  • {
  • SYSTEMTIME st;
  • DWORD dwLen;
  • // Se positionner à la fin du fichier log:
  • SetFilePointer(hFile,0,0,FILE_END);
  • // Former la ligne à écrire dans le fichier log:
  • lstrcpy(buff,"Le timer de RacppService a été déclenché le ");
  • GetLocalTime(&st);
  • GetDateFormat(0,0,&st,"dd/MM/yyyy",buff+lstrlen(buff),12);
  • lstrcat(buff," à ");
  • GetTimeFormat(0,0,&st,"HH:mm:ss",buff+lstrlen(buff),12);
  • lstrcat(buff,"\r\n");
  • // Ecrire la ligne formée dans le fichier log:
  • WriteFile(hFile,buff,lstrlen(buff),&dwLen,0);
  • return;
  • }
  • // ServiceMain
  • VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
  • {
  • hServiceStatusHandle = RegisterServiceCtrlHandlerEx("RacppService", HandlerEx, NULL);
  • if (hServiceStatusHandle)
  • {
  • // Initialiser notre structure SERVICE_STATUS:
  • ServiceStatus.dwServiceType = SERVICE_WIN32;
  • ServiceStatus.dwControlsAccepted = 0;
  • ServiceStatus.dwWin32ExitCode = 0;
  • ServiceStatus.dwServiceSpecificExitCode = 0;
  • ServiceStatus.dwCheckPoint = 0;
  • // Mettre le service dans l'état "En cours de démarrage":
  • ServiceStatus.dwWaitHint = 1000;
  • ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
  • SetServiceStatus(hServiceStatusHandle, &ServiceStatus);
  • // Créer un Event avec "non signalé" comme état initial:
  • hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  • if (hEvent)
  • {
  • // Ouvrir notre fichier log ou le créer si inexistant:
  • hFile=CreateFile("C:\\racppservice.log", GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_ALWAYS, 0, 0);
  • if(hFile!=INVALID_HANDLE_VALUE)
  • {
  • // Créer et lancer notre timer:
  • HANDLE hTimerQueue,hTimer;
  • hTimerQueue=CreateTimerQueue();
  • CreateTimerQueueTimer(&hTimer,hTimerQueue,TimerProc,0,0,60000,WT_EXECUTEINTIMERTHREAD);
  • // Mettre le service dans l'état "Démarré":
  • ServiceStatus.dwWaitHint = 0;
  • ServiceStatus.dwCurrentState = SERVICE_RUNNING;
  • ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN ;
  • SetServiceStatus(hServiceStatusHandle, &ServiceStatus);
  • // Attendre que l'Event soit à l'état signalé:
  • WaitForSingleObject(hEvent, INFINITE);
  • // Détruire notre timer:
  • DeleteTimerQueueTimer(hTimerQueue,hTimer,0);
  • DeleteTimerQueueEx(hTimerQueue,0);
  • // Fermer le handle de notre fichier log:
  • CloseHandle(hFile);
  • }
  • // Fermer le handle de l'Event:
  • CloseHandle(hEvent);
  • }
  • // Mettre le service dans l'état "Arrêté":
  • ServiceStatus.dwWaitHint = 0;
  • ServiceStatus.dwCurrentState = SERVICE_STOPPED;
  • SetServiceStatus(hServiceStatusHandle, &ServiceStatus);
  • }
  • return;
  • }
  • // DllMain
  • BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)
  • {
  • // Obtenir le HINSTANCE de notre dll:
  • hDll=hInst;
  • return TRUE;
  • }
#define  _WIN32_WINNT 0x0500 // Pour Windows 2000 et supérieur
#include <windows.h>

// Déclarations globales:
HINSTANCE hDll;
SERVICE_STATUS_HANDLE   hServiceStatusHandle; 
SERVICE_STATUS          ServiceStatus; 
HANDLE                  hEvent,hFile;
char buff[MAX_PATH]; 

// Fonction d'installation du service:
int WINAPI InstallService()
{
	HKEY hkService,hkSvchost;
	SC_HANDLE schScm ,schService;
	char* pData;
	DWORD dwError=0, dwLen,dwSize = 0;   
	// Ouvrir le gestionnaire de services:
	schScm = OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS);
	if(schScm)
	{
		// Créer notre service:
		schService = CreateService(schScm, "RacppService", 0, SERVICE_ALL_ACCESS, SERVICE_WIN32_SHARE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, "%SystemRoot%\\System32\\svchost.exe -k netsvcs", 0, 0, 0, 0, 0); 
		if(schService)
		{
			// Ajouter une description à notre service:
			SERVICE_DESCRIPTION sd;
			sd.lpDescription = "Service dans une DLL lancé par svchost.exe";
			ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION, &sd);
			// Ajouter la sous-clé Parameters à la clé de notre service:
			RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\RacppService\\Parameters", 0, 0, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, 0, &hkService, 0);   
			// Récupérer le chemin complet de notre Dll:
			GetModuleFileName(hDll, buff, sizeof(buff));
			// Affecter le chemin de la Dll à la sous-clé Parameters sous le nom ServiceDll:
			RegSetValueEx(hkService, "ServiceDll", 0, REG_EXPAND_SZ, (BYTE*)buff, lstrlen(buff)+1);
			// Fermer la clé de notre service:
			RegCloseKey(hkService);
			// Ouvrir la clé indiquant la liste des groupes d'instances de svchost.exe:
			RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost", 0, KEY_ALL_ACCESS, &hkSvchost); 
			// Obtenir la longueur du contenu du groupe netsvcs:
			RegQueryValueEx(hkSvchost, "netsvcs", 0, 0, 0, &dwSize); 
			// Fixer le nom de notre service pour la liste des services du groupe netsvcs:
			lstrcpy(buff,"RacppService");
			dwLen=lstrlen(buff);
			// Allouer la mémoire nécessaire pour la nouvelle liste des noms de services du groupe netsvcs:
			pData=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSize + dwLen + 1);
			if(pData)
			{
				char *pNames;
				// Récupérer la liste des noms de services du groupe netsvcs:
				RegQueryValueEx(hkSvchost, "netsvcs", 0, 0, (BYTE*)pData, &dwSize);
				// Vérifier si le nom existe
				for (pNames = pData; *pNames; pNames=strchr(pNames,0)+1) if(!lstrcmpi(pNames, buff)) break;   
				// L'ajouter s'il n'existe pas:
				if (*pNames == 0)
				{
					memcpy(pData + dwSize - 1, buff, dwLen + 1);
					RegSetValueEx(hkSvchost, "netsvcs", 0, REG_MULTI_SZ, (BYTE*)pData, dwSize + dwLen + 1);
				}
				else dwError=ERROR_ALREADY_EXISTS;
				// Libérer la mémoire allouée:
				HeapFree(GetProcessHeap(),0,pData);
			}
			else dwError=ERROR_NOT_ENOUGH_MEMORY;
			// Fermer la clé svchost:
			RegCloseKey(hkSvchost);
			// Fermer le handle de notre service:
			CloseServiceHandle(schService); 
		}
		// Fermer le handle du gestionnaire de services:
		CloseServiceHandle(schScm);
	}
	// Retourner dwError si non nul, sinon GetLastError():
	return dwError? dwError : GetLastError();
}

// Fonction de désinstallation du service:
DWORD WINAPI RemoveService()
{
	HKEY hkSvchost;
	SC_HANDLE schScm ,schService;
	char* pData;
	DWORD dwError=0,dwSize = 0;   
	// Ouvrir le gestionnaire de services:
	schScm = OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS);
	if(schScm)
	{
		// Ouvrir notre service:
		schService=OpenService(schScm,"RacppService",SERVICE_ALL_ACCESS);
		if(schService)
		{
			// Supprimer le service:
			if(DeleteService(schService))
			{
				// Ouvrir la clé indiquant la liste des groupes d'instances de svchost.exe:
				RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost", 0, KEY_ALL_ACCESS, &hkSvchost); 
				// Obtenir la longueur du contenu du groupe netsvcs:
				RegQueryValueEx(hkSvchost, "netsvcs", 0, 0, 0, &dwSize); 
				// Fixer le nom de notre service pour la liste des services du groupe netsvcs:
				lstrcpy(buff,"RacppService");
				// Allouer la mémoire nécessaire pour tous les noms de services du groupe netsvcs:
				pData=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSize);
				if(pData)
				{
					char *pNames;
					// Récupérer la liste des noms de services du groupe netsvcs:
					RegQueryValueEx(hkSvchost, "netsvcs", 0, 0, (BYTE*)pData, &dwSize);
					// Vérifier si le nom existe:
					for (pNames = pData; *pNames; pNames=strchr(pNames,0)+1) if(!lstrcmpi(pNames,buff)) break;   
					// Le supprimer s'il existe:
					if (*pNames)
					{
						char* pNext;
						pNext=strchr(pNames,0)+1;
						memcpy(pNames,pNext,dwSize-(pNext-pData));
						RegSetValueEx(hkSvchost, "netsvcs", 0, REG_MULTI_SZ, (BYTE*)pData, dwSize -(lstrlen(buff)+1));
					}
					else dwError=ERROR_NO_SUCH_MEMBER;
					// Libérer la mémoire allouée:
					HeapFree(GetProcessHeap(),0,pData);
				}
				else dwError=ERROR_NOT_ENOUGH_MEMORY;
				// Fermer la clé svchost:
				RegCloseKey(hkSvchost);
			}
			// Fermer le handle de notre service:
			CloseServiceHandle(schService); 
		}
		// Fermer le handle du gestionnaire de services:
		CloseServiceHandle(schScm);
	}
	// Retourner dwError si non nul, sinon GetLastError():
	return dwError? dwError : GetLastError();
}

// Fonction HandlerEx communiquant avec le gestionnaire de services:
DWORD WINAPI HandlerEx(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
{
	switch(dwControl) 
	{
	case SERVICE_CONTROL_STOP:
	case SERVICE_CONTROL_SHUTDOWN:
		// Mettre le service à l'état "En cours d'arrêt":
		ServiceStatus.dwWaitHint      = 1000;
		ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
		SetServiceStatus(hServiceStatusHandle, &ServiceStatus );
		// Mettre l'Event à l'état signalé:
		SetEvent(hEvent);
		return NO_ERROR;
	default:
		ServiceStatus.dwWaitHint = 0;
		break;
	}
	SetServiceStatus(hServiceStatusHandle,  &ServiceStatus);// Obligatoire selon MSDN
	return NO_ERROR;
}

// Fonction Callback appelée toutes les minutes notre timer:
VOID CALLBACK TimerProc( LPVOID lpParameter,BOOLEAN TimerOrWaitFired)
{
	SYSTEMTIME st;
	DWORD dwLen;
	// Se positionner à la fin du fichier log:
	SetFilePointer(hFile,0,0,FILE_END);
	// Former la ligne à écrire dans le fichier log:
	lstrcpy(buff,"Le timer de RacppService a été déclenché le ");
	GetLocalTime(&st);
	GetDateFormat(0,0,&st,"dd/MM/yyyy",buff+lstrlen(buff),12);
	lstrcat(buff," à ");
	GetTimeFormat(0,0,&st,"HH:mm:ss",buff+lstrlen(buff),12);
	lstrcat(buff,"\r\n");
	// Ecrire la ligne formée dans le fichier log:
	WriteFile(hFile,buff,lstrlen(buff),&dwLen,0);
	return;
}

// ServiceMain
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
	hServiceStatusHandle = RegisterServiceCtrlHandlerEx("RacppService", HandlerEx, NULL); 
	if (hServiceStatusHandle)
	{
		// Initialiser notre structure SERVICE_STATUS:
		ServiceStatus.dwServiceType        = SERVICE_WIN32;
		ServiceStatus.dwControlsAccepted   = 0;
		ServiceStatus.dwWin32ExitCode      = 0; 
		ServiceStatus.dwServiceSpecificExitCode = 0; 
		ServiceStatus.dwCheckPoint         = 0;
		// Mettre le service dans l'état "En cours de démarrage":
		ServiceStatus.dwWaitHint           = 1000;
		ServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
		SetServiceStatus(hServiceStatusHandle, &ServiceStatus);
		// Créer un Event avec "non signalé" comme état initial: 
		hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
		if (hEvent)
		{  
			// Ouvrir notre fichier log ou le créer si inexistant:
			hFile=CreateFile("C:\\racppservice.log", GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_ALWAYS, 0, 0);
			if(hFile!=INVALID_HANDLE_VALUE)
			{
				// Créer et lancer notre timer:
				HANDLE hTimerQueue,hTimer;
				hTimerQueue=CreateTimerQueue();
				CreateTimerQueueTimer(&hTimer,hTimerQueue,TimerProc,0,0,60000,WT_EXECUTEINTIMERTHREAD);
				// Mettre le service dans l'état "Démarré":
				ServiceStatus.dwWaitHint           = 0;  
				ServiceStatus.dwCurrentState       = SERVICE_RUNNING; 
				ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN ;
				SetServiceStatus(hServiceStatusHandle, &ServiceStatus);
				// Attendre que l'Event soit à l'état signalé:
				WaitForSingleObject(hEvent, INFINITE);
				// Détruire notre timer:
				DeleteTimerQueueTimer(hTimerQueue,hTimer,0);
				DeleteTimerQueueEx(hTimerQueue,0);
				// Fermer le handle de notre fichier log:
				CloseHandle(hFile);
			}
			// Fermer le handle de l'Event:
			CloseHandle(hEvent);
		}
		// Mettre le service dans l'état "Arrêté":
		ServiceStatus.dwWaitHint = 0; 
		ServiceStatus.dwCurrentState = SERVICE_STOPPED;
		SetServiceStatus(hServiceStatusHandle, &ServiceStatus);
	}
	return;
}

// DllMain
BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)
{
	// Obtenir le HINSTANCE de notre dll:
	hDll=hInst;
	return TRUE;
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   RacppService
    •   Release
      • RacppService.dllTélécharger ce fichier [Réservé aux membres club]53 248 octets
    • RacppService.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier9 175 octets
    • RacppService.defTélécharger ce fichier [Réservé aux membres club]171 octets
    • RacppService.slnTélécharger ce fichier [Réservé aux membres club]Voir ce fichier888 octets
    • RacppService.vcprojTélécharger ce fichier [Réservé aux membres club]4 194 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture SOUS-CLASSEMENT DE FENÊTRE D'UN AUTRE PROCESS PAR INJECTION ...
Source avec Zip Source avec une capture FENÊTRE FLOTTANTE SANS FOCUS (WIN32 API)
Source avec Zip Source avec une capture IMPRESSION EN WIN32 API AVEC OPTIONS
Source avec Zip Source avec une capture INFOTIP SHELL EXTENSION (BULLE DE L'EXPLORATEUR WINDOWS) (WI...
Source avec Zip Source avec une capture APPLICATION MULTILINGUE UTILISANT UNICODE (WIN32)

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SOUS-CLASSEMENT DE FENÊTRE D'UN AUTRE PROCESS PAR INJECTION ... par racpp
Source avec Zip DLLMAKER V2.0 par Altaris
Source avec Zip Source avec une capture [C/WIN32] INJECTION DE DLL 2 MÉTHODES (REMOTETHREAD PROPRE &... par deck_bsd
Source avec Zip Source avec une capture ALGO DE PATHFINDING AVEC PETIT JEU par kts_system
Source avec Zip FRACTIONS_DLL, UNE DLL QUI CALCULE DES FRACTIONS par ghuysmans99

Commentaires et avis

Commentaire de Zestyr le 21/04/2010 00:26:14 10/10

Mouchas gracia ! (Y)

Commentaire de nanonavich le 23/04/2010 00:56:50

on peut demarer le service sans rebouter avec la commande


nReturn = StartServiceA( schService, NULL, NULL );  

// if( nReturn == 0 )  not start

Commentaire de racpp le 23/04/2010 03:05:32 administrateur CS

Salut,
Merci Zestyr pour la note.
Nanonavich >> Oui ça tout le monde le sait mais ça ne marche pas avec tous les services. Le genre de service traité dans ce code source est implémenté dans une dll qui a besoin d'être chargée par une instance du processus svchost.exe. Ce n'est donc pas un service autonome. Normalement, on ne peut pas ajouter un service à un groupe comme netsvcs après le démarrage de Windows puisque l'instance svchost qui lui est associée est déjà lancée. Le groupement des services dans des instances différentes se fait donc au démarrage de Windows d'où la nécessité d'un redémarrage pour que notre service soit inclus au groupe voulu. Il est bien sûr possible de lancer notre service dans une nouvelle instance de svchost.exe, dans ce cas le redémarrage n'est pas nécessaire. Ce qui n'a aucun intérêt car svchost n'est pas prévu pour ça.  Il a été plutôt conçu pour contenir un groupe de services implémentés dans des dlls. Si tu essaies de démarrer ce genre de service sans redémarrage tu auras un joli message d'erreur. Je suis sûr que tu n'as pas fait le test. Pour avoir une idée sur le groupement des services dans une instance de svchost.exe tu peux ouvrir l'invite de commandes et taper:
tasklist /svc

Commentaire de belleney le 28/04/2010 16:07:09

ce n'est pas un peu craignos ce genre de petite chose ?
enfin bon.... j'utilise de moins en moins win.

Commentaire de racpp le 30/04/2010 22:35:09 administrateur CS

Belleney >> Il parait que tu ne connais pas assez Windows. En tant qu'administrateur, on peut tout faire que ce soit sur Windows ou autre. La plus grande faille de sécurité, qui concerne tous les systèmes sans exception, est de laisser un PC en mode administrateur entre les mains d'un néophyte. Seul un administrateur devrait avoir le droit d'installer ce genre de chose. Un utilisateur ayant un compte avec droits restreints ne pourra rien faire d'autre que ce que l'administrateur lui a préalablement installé.

Commentaire de belleney le 03/05/2010 20:28:59

RACPP >> Je fréquente Win depuis avant win si tu veux tout savoir. Dos 6 a été mon premier système. puis j'ai fais un assez court passage à PC GeOS et j'ai embrayé sur 3.1. Je viens d'achever mon parcours win avec windows 7 RC.
J'utilise encore accessoirement XP SP3.et j'ai aussi laissé tombé mes bricolages Bart PE parce que, tout compte fait, tout cela ne rimait à rien.
Administrer oui... mais un OS qui est suffisamment transparent pour avancer en connaissances.
Donc, petit à petit (j'ai dû commencer il y a une dizaine d'années) je suis passé à Linux. Voilà donc pour ce qui est des mains de néophyte... et je suis entièrement d'accord avec toi pour dire que le pire qui puisse arriver à un OS c'est qu'il permette à quiconque d'être, en permanence, utilisateur privilégié.
Je te prie de m'accorder le fait que je n'ai jamais autrement avancé que par une pratique quotidienne et non par des acquis théoriques qui, il faut le reconnaître, sont utiles pour moins perdre de temps.

Commentaire de racpp le 03/05/2010 23:47:10 administrateur CS

Belleney >> C'est bien, d'ailleurs pour "néophyte" je ne parlais pas de toi. Mais j'espère que tu n'as pas loupé la série Windows NT à partir de 1993 ( NT 3.1, NT 3.51, NT 4, Win 2000) qui permettait de voir Windows autrement. On comparait souvent, à tort, Linux à Windows 3.xx, 9x et Me. Ces derniers étaient sur le point d'être abandonnés au profit de la technologie NT reprise dans XP, Vista et Seven. Pareil pour toutes les versions Win serveur. D'ailleurs, j'aime beaucoup les versions Linux serveur. Mais en tant que programmeur, je trouve plus intéressant et plus profitable de travailler sur un système utilisé par 90% que sur un autre utilisé par seulement 1%. Les acquis théoriques, mis en pratique, permettent, en plus du gain de temps, de chasser certains préjugés ou les fausses impressions et de voir les choses telles qu'elles sont. C'est vrai que, même si Windows est abondamment documenté il reste quand même certains points sombres que Microsoft ne peut ou ne veut mettre en lumière. C'est justement le but de ce genre de code source proposant de petites trouvailles qui divulguent certaines fonctionnalités pas assez documentées.

Commentaire de belleney le 06/05/2010 12:02:52

Pour NT oui aussi; je ne sais pas pourquoi j'ai zappé dans l'énumération !
Mon expérience NT 4 a été très intéressante car je l'ai faite avec un HDD de récupération (provenant d'un poste client) qui n'avait pas été formaté et sortait d'un lot venant d'une grosse entreprise que je ne nommerai pas.
Par un coup de hasard extraordinaire, il se trouvait que ma machine avait la même config hard que la machine d'où provenait le HDD.
Ce qui fait que, mettant tout cela en marche, j'ai eu la bonne surprise de constater que NT se lançait !!!
J'en ai donc profité pour tenter le coup de prendre la main sur le login et sur l'administration. Et j'y suis arrivé relativement assez vite....
en restant évidemment hors connexion... J'ai aussi utilisé win 2000 pro sur poste client. Il est encore installé sur une machine que je mets en marche de temps en temps mais que je n'utilise pas vraiment.
Moralité : la meilleure façon de formater un HDD déclassé... c'est la massette !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Problème de hook clavier [ par Oeil_de_taupe ] Bonjour tout le monde, Je suis en train de créer un programme me permettant d'utiliser qu'un seul clavier sur deux ordinateurs (grâce à une connectio je veut créer une dll non managé en c++ qui utilise un service web [ par vboussema ] salutj'ai une dll qui dois contenir une methode qui retourne un boolean cette dll est ecrite en c++ non managé pour qu'un autre programme (exe )va uti DLL appel Web service [ par pcorbella ] Hello Everybody, J'ai une appli en smalltalk VSE 3.2 sous windows ... autant dire que c'est pas tout jeune qui sais activer des dll. Est il possible espionner une dll [ par 01Dawi ] Bon je sais ca va faire bondir beaucoup d'entre vous mais on sait jamais.Est ce que quelqu'un sait si ya moyen d'espionner (&#224; l'aide d'une applic comment faire une src [ par zackman ] Voila, en premier tps je me presente, zackman, je suis joueur de sof2 sur un server de aimbots, je vous expliques pas c'est pas la peine je pense ;).D Appel Dll Visual Basic en C++ [ par Cako19 ] Bonjour, Comment fait-on pour appeler les fonctions d'une dll Visual Basic en C ++?Si qqun le sait, je suis preneuse !Merci d'avance,Cako19 Aide en "api hooking" URGENT !!! [ par Kangourou_Nomade ] Pour faire un logiciel api hooking, sachant la difficult&#233; du truc je voulais savoir si quelqu'un pouvait me filer une dll avec les fonctions appr Comment utiliser SetPixel dans ma DLL ? [ par YoYoDev21 ] Bonjour,Je d&#233;veloppe une DLL en C afin d'acc&#233;l&#233;rer certain traitement fait dans un programme VB6.Entre autre, je voudrais que la DLL re intercepter les messages d'un programme avec une dll [ par cyber_al ] bonjours a tous voila voila !je souhaiterait "hooker" un programme qui utilise les fonctions MDI ,en fait le but est de filtrer les messages de ce pro DLL faite en C++ avec VB [ par Sniper_Vgaerr ] Je fais un programme de cryptage avec cl&#233; priv&#233;e et publique et je prefere l'interface de VB que celle du C, mais comme le C va plus vite je


Nos sponsors


Sondage...

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,109 sec (4)

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