mardi 19 février 2008

Gestionnaire des services windows

Hi all :)
Bon en ce moment je sais pas trop quoi faire alors me suis codé un petit prog pour gérer les services win. Ce prog se décompose en 5 fonctions à savoir :

-Enumération des service. Il suffit d'utiliser l'API EnumServicesStatusEx :


BOOL WINAPI EnumServicesStatusEx(
__in SC_HANDLE hSCManager,
__in SC_ENUM_TYPE InfoLevel,
__in DWORD dwServiceType,
__in DWORD dwServiceState,
__out_opt LPBYTE lpServices,
__in DWORD cbBufSize,
__out LPDWORD pcbBytesNeeded,
__out LPDWORD lpServicesReturned,
__inout_opt LPDWORD lpResumeHandle,
__in_opt LPCTSTR pszGroupName
);


Référence : http://msdn2.microsoft.com/en-us/library/ms682640(VS.85).aspx

On remplie ensuite la structure ENUM_SERVICE_STATUS_PROCESS dont voici la définition :


typedef struct _ENUM_SERVICE_STATUS_PROCESS {
LPTSTR lpServiceName;
LPTSTR lpDisplayName;
SERVICE_STATUS_PROCESS ServiceStatusProcess;
} ENUM_SERVICE_STATUS_PROCESS,
*LPENUM_SERVICE_STATUS_PROCESS;


Référence : http://msdn2.microsoft.com/en-us/library/ms682648(VS.85).aspx
On s'aperçoit de la présence de la structure SERVICE_STATUS_PROCESS :


typedef struct _SERVICE_STATUS_PROCESS {
DWORD dwServiceType;
DWORD dwCurrentState;
DWORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
DWORD dwProcessId;
DWORD dwServiceFlags;
} SERVICE_STATUS_PROCESS,
*LPSERVICE_STATUS_PROCESS;


Référence : http://msdn2.microsoft.com/en-us/library/ms685992(VS.85).aspx

A l'aide de ces deux structures on peut déjà en connaitre pas mal sur les services.



-Démarrage d'un service. Ici on a besoin de récupérer un handle sur le service avec la fonction OpenService() puis d'utiliser la fonction StartService() pour le démarrer. Quelque fois certains services refusent d'être démarrer par n'importe quel processus. Vous risquez donc d'avoir des erreurs avec la fonction. Les prototypes des fonctions :


SC_HANDLE WINAPI OpenService(
__in SC_HANDLE hSCManager,
__in LPCTSTR lpServiceName,
__in DWORD dwDesiredAccess
);


Référence : http://msdn2.microsoft.com/en-us/library/ms684330(VS.85).aspx


BOOL WINAPI StartService(
__in SC_HANDLE hService,
__in DWORD dwNumServiceArgs,
__in_opt LPCTSTR* lpServiceArgVectors
);


Référence : http://msdn2.microsoft.com/en-us/library/ms686321(VS.85).aspx

-Arrêt d'un service. Pour celà on récupère un handle sur le service et on l'arrête avec ControlService() :


BOOL WINAPI ControlService(
__in SC_HANDLE hService,
__in DWORD dwControl,
__out LPSERVICE_STATUS lpServiceStatus
);


Référence : http://msdn2.microsoft.com/en-us/library/ms682108(VS.85).aspx

-Création d'un service. On a juste besoin de l'API CreateService() et le tour est joué :


SC_HANDLE WINAPI CreateService(
__in SC_HANDLE hSCManager,
__in LPCTSTR lpServiceName,
__in_opt LPCTSTR lpDisplayName,
__in DWORD dwDesiredAccess,
__in DWORD dwServiceType,
__in DWORD dwStartType,
__in DWORD dwErrorControl,
__in_opt LPCTSTR lpBinaryPathName,
__in_opt LPCTSTR lpLoadOrderGroup,
__out_opt LPDWORD lpdwTagId,
__in_opt LPCTSTR lpDependencies,
__in_opt LPCTSTR lpServiceStartName,
__in_opt LPCTSTR lpPassword
);


Référence : http://msdn2.microsoft.com/en-us/library/ms682450(VS.85).aspx

-Effacer un service. On récupère un handle sur le service, on l'arrête et on l'efface avec DeleteService().

Voilà, rien de bien compliqué.



Le code : gerstionnaire_services.cpp

Le code + binaire : gestionnaire_services.zip

PS: Ceci peut par exemple servir à installer un driver :)

PS2: Au passage j'en profite pour vous faire remarquer mon nouveau repo à l'adresse http://lilxam.free.fr/

Have Fun :)
lilxam.

Aucun commentaire: