Code:
#pragma comment( lib, "advapi32.lib" )
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <lmerr.h>
void DisplayErrorMessage(DWORD dwLastError )
{
HMODULE hModule = NULL;
LPSTR MessageBuffer;
DWORD dwBufferLength;
DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM ;
if(dwLastError >= NERR_BASE && dwLastError <= MAX_NERR) {
hModule = LoadLibraryEx(
TEXT("netmsg.dll"),
NULL,
LOAD_LIBRARY_AS_DATAFILE
);
if(hModule != NULL)
dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE;
}
if(dwBufferLength = FormatMessageA(
dwFormatFlags,
hModule,
dwLastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR) &MessageBuffer,
0,
NULL
))
{
DWORD dwBytesWritten;
WriteFile(
GetStdHandle(STD_ERROR_HANDLE),
MessageBuffer,
dwBufferLength,
&dwBytesWritten,
NULL
);
LocalFree(MessageBuffer);
}
if(hModule != NULL)
FreeLibrary(hModule);
}
BOOL StopTheService(char* pName, char *pComputerName)
{
DWORD dwError, dwTimeout= 0;
SERVICE_STATUS ss;
DWORD dwStartTime = GetTickCount();
DWORD dwBytesNeeded;
SC_HANDLE schSCManager = OpenSCManager( pComputerName, NULL, SC_MANAGER_ALL_ACCESS);
if (schSCManager==0)
{
dwError = GetLastError();
DisplayErrorMessage(dwError );
}
else
{
SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS);
if (schService==0)
{
dwError = GetLastError();
DisplayErrorMessage(dwError );
}
else
{
// check to determine if service is not already stopped
QueryServiceStatusEx(
schService,
SC_STATUS_PROCESS_INFO,
(LPBYTE)&ss,
sizeof(SC_STATUS_PROCESS_INFO),
&dwBytesNeeded );
if ( ss.dwCurrentState == SERVICE_STOPPED )
return TRUE;
// stop pending, wait for it
while ( ss.dwCurrentState == SERVICE_STOP_PENDING )
{
Sleep( ss.dwWaitHint );
if ( !QueryServiceStatusEx(
schService,
SC_STATUS_PROCESS_INFO,
(LPBYTE)&ss,
sizeof(SC_STATUS_PROCESS_INFO),
&dwBytesNeeded ) )
return FALSE;
if ( ss.dwCurrentState == SERVICE_STOPPED )
return TRUE;
if ( GetTickCount() - dwStartTime > dwTimeout )
return FALSE;
}
// call ControlService to stop the service
SERVICE_STATUS status;
if(ControlService(schService,SERVICE_CONTROL_STOP,&status))
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
printf(_T("%s stopped\n"),pName);
return TRUE;
}
else
{
dwError = GetLastError();
DisplayErrorMessage(dwError );
}
CloseServiceHandle(schService);
}
CloseServiceHandle(schSCManager);
}
return FALSE;
}
BOOL StartTheService(char* pName, int nArg, char** pArg, char *pComputerName)
{
DWORD dwError = 0l;
SC_HANDLE schSCManager = OpenSCManager( pComputerName, NULL, SC_MANAGER_ALL_ACCESS);
if (schSCManager==0)
{
dwError = GetLastError();
DisplayErrorMessage(dwError );
}
else
{
SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS);
if (schService==0)
{
dwError = GetLastError();
DisplayErrorMessage(dwError );
}
else
{
if(StartService(schService,nArg,(const char**)pArg))
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
printf(_T("%s has succesfully started"), pName);
return TRUE;
}
else
{
dwError = GetLastError();
DisplayErrorMessage(dwError );
}
CloseServiceHandle(schService);
}
CloseServiceHandle(schSCManager);
}
return FALSE;
}
int main(int argc, char **argv)
{
if(argc > 1)
{
if(strcmp(strupr(argv[1]), "START") == 0)
StartTheService("Messenger",0,NULL, NULL);
else if(strcmp(strupr(argv[1]), "STOP") == 0)
StopTheService("Messenger", NULL);
else printf("Invalid command line parms\n");
}
else printf(" Enter START or STOP on command line\n");
return 0;
}