[DCOMLAUNCH][WMISVC] Stop busy waiting shutdown

This commit is contained in:
Pierre Schweitzer 2019-03-03 23:14:07 +01:00
parent bd0a28d1e4
commit e5b0087c8e
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B
2 changed files with 18 additions and 12 deletions

View file

@ -25,6 +25,7 @@ static WCHAR ServiceName[] = L"dcomlaunch";
static SERVICE_STATUS_HANDLE ServiceStatusHandle;
static SERVICE_STATUS ServiceStatus;
static HANDLE ShutdownEvent;
/* FUNCTIONS *****************************************************************/
@ -62,7 +63,8 @@ ServiceControlHandler(DWORD dwControl,
{
case SERVICE_CONTROL_STOP:
DPRINT1(" SERVICE_CONTROL_STOP received\n");
UpdateServiceStatus(SERVICE_STOPPED);
SetEvent(ShutdownEvent);
UpdateServiceStatus(SERVICE_STOP_PENDING);
return ERROR_SUCCESS;
case SERVICE_CONTROL_PAUSE:
@ -83,7 +85,8 @@ ServiceControlHandler(DWORD dwControl,
case SERVICE_CONTROL_SHUTDOWN:
DPRINT1(" SERVICE_CONTROL_SHUTDOWN received\n");
UpdateServiceStatus(SERVICE_STOPPED);
SetEvent(ShutdownEvent);
UpdateServiceStatus(SERVICE_STOP_PENDING);
return ERROR_SUCCESS;
default :
@ -111,14 +114,14 @@ ServiceMain(DWORD argc, LPTSTR *argv)
return;
}
ShutdownEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
DealWithDeviceEvent();
UpdateServiceStatus(SERVICE_RUNNING);
do
{
Sleep(1);
} while (1);
WaitForSingleObject(ShutdownEvent, INFINITE);
CloseHandle(ShutdownEvent);
UpdateServiceStatus(SERVICE_STOPPED);
}

View file

@ -44,6 +44,7 @@ static WCHAR ServiceName[] = L"winmgmt";
static SERVICE_STATUS_HANDLE ServiceStatusHandle;
static SERVICE_STATUS ServiceStatus;
static HANDLE ShutdownEvent;
/* FUNCTIONS *****************************************************************/
@ -81,7 +82,8 @@ ServiceControlHandler(DWORD dwControl,
{
case SERVICE_CONTROL_STOP:
DPRINT1(" SERVICE_CONTROL_STOP received\n");
UpdateServiceStatus(SERVICE_STOPPED);
SetEvent(ShutdownEvent);
UpdateServiceStatus(SERVICE_STOP_PENDING);
return ERROR_SUCCESS;
case SERVICE_CONTROL_PAUSE:
@ -102,7 +104,8 @@ ServiceControlHandler(DWORD dwControl,
case SERVICE_CONTROL_SHUTDOWN:
DPRINT1(" SERVICE_CONTROL_SHUTDOWN received\n");
UpdateServiceStatus(SERVICE_STOPPED);
SetEvent(ShutdownEvent);
UpdateServiceStatus(SERVICE_STOP_PENDING);
return ERROR_SUCCESS;
default :
@ -128,12 +131,12 @@ ServiceMain(DWORD argc, LPTSTR *argv)
return;
}
ShutdownEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
UpdateServiceStatus(SERVICE_RUNNING);
do
{
Sleep(1);
} while (1);
WaitForSingleObject(ShutdownEvent, INFINITE);
CloseHandle(ShutdownEvent);
UpdateServiceStatus(SERVICE_STOPPED);
}