Спасибо, но сервиса мало
То есть понять какой сервис есть какой фаерволл я сумел быстро, и даже врубать / вырубать сервис по требованию, только чтобы были права администратора.
Код:
CString CfgUtil::ServiceIsPresent(CString sServiceName)
{
const int res_stopped = 0;
const int res_started = 1;
const int res_unavail = 2;
SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
if (schSCManager == NULL)
{
// return "res_unavail";
return "unavailable";
}
SC_HANDLE schService = OpenService(schSCManager,sServiceName,SC_MANAGER_ENUMERATE_SERVICE);
if (schService == NULL)
{
CloseServiceHandle(schSCManager);
// return res_unavail;
return "unavailable";
}
bool bServiceRunning = false;
SERVICE_STATUS ServiceStatus;
QueryServiceStatus(schService,&ServiceStatus);
bServiceRunning = (ServiceStatus.dwCurrentState == SERVICE_RUNNING);
CloseServiceHandle(schSCManager);
CloseServiceHandle(schService);
// return (bServiceRunning) ? res_started : res_stopped ;
return (bServiceRunning) ? "started" : "stopped";
}
bool CfgUtil::ServiceStart(CString sServiceName)
{
SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
return false;
SC_HANDLE schService = OpenService(schSCManager,sServiceName,SC_MANAGER_ALL_ACCESS);
if (schService == NULL)
{
CloseServiceHandle(schService);
return false;
}
bool bServiceRunning = false;
SERVICE_STATUS ServiceStatus;
QueryServiceStatus(schService,&ServiceStatus);
bServiceRunning = (ServiceStatus.dwCurrentState == SERVICE_RUNNING);
if (!bServiceRunning)
{
if (StartService(schService,0,NULL))
{
int count=0, max_count = 100; // TIME LIMIT for pending:
// 100 times by 100 msec = 10,000 msec = 10 sec
do
{
count++;
Sleep(100);
QueryServiceStatus(schService, &ServiceStatus);
bServiceRunning = (ServiceStatus.dwCurrentState == SERVICE_RUNNING);
}
while (count<max_count && !bServiceRunning && ServiceStatus.dwCurrentState == SERVICE_START_PENDING);
}
}
CloseServiceHandle(schSCManager);
CloseServiceHandle(schService);
return bServiceRunning;
}
bool CfgUtil::ServiceStop(CString sServiceName)
{
SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
return false;
SC_HANDLE schService = OpenService(schSCManager,sServiceName,SC_MANAGER_ALL_ACCESS);
if (schService == NULL)
{
CloseServiceHandle(schService);
return false;
}
bool bServiceStopped = false;
SERVICE_STATUS ServiceStatus;
QueryServiceStatus(schService,&ServiceStatus);
bServiceStopped = (ServiceStatus.dwCurrentState == SERVICE_STOPPED);
if (!bServiceStopped)
{
if (ControlService(schService,SERVICE_CONTROL_STOP,&ServiceStatus))
{
int count=0, max_count = 100; // TIME LIMIT for pending:
// 100 times by 100 msec = 10,000 msec = 10 sec
do
{
count++;
Sleep(100);
QueryServiceStatus(schService, &ServiceStatus);
bServiceStopped = (ServiceStatus.dwCurrentState == SERVICE_STOPPED);
}
while (count<max_count && !!bServiceStopped && ServiceStatus.dwCurrentState == SERVICE_START_PENDING);
}
}
CloseServiceHandle(schSCManager);
CloseServiceHandle(schService);
return bServiceStopped;
}
Но задачу не выполнил. Вот пару примеров чего происходит:
* Виндовсовская стенка - сервис убил а "птичка" о том что стенка работает - осталась. Сервис поднял - а порты которые он должен был закрывать - открыты.
* БлэкАЙС - сервис убил - вроде молчит, сервис поднял - крэш эксэпшн
* Аутпост - сервис убил - а стенка живёт

сервис на свою остановку вызывает апликацию которая делает повторный запуск сервиса, стирать её что ли ?
Есть ещё идеи ?