From e5b0087c8ea87c1952a1edd4daee29839198d33c Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 3 Mar 2019 23:14:07 +0100 Subject: [PATCH] [DCOMLAUNCH][WMISVC] Stop busy waiting shutdown --- base/services/dcomlaunch/dcomlaunch.c | 15 +++++++++------ base/services/wmisvc/wmisvc.c | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/base/services/dcomlaunch/dcomlaunch.c b/base/services/dcomlaunch/dcomlaunch.c index 280dbff3ebb..49c8541c0c7 100644 --- a/base/services/dcomlaunch/dcomlaunch.c +++ b/base/services/dcomlaunch/dcomlaunch.c @@ -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); } diff --git a/base/services/wmisvc/wmisvc.c b/base/services/wmisvc/wmisvc.c index 8ac9d9b7339..042ff84e3df 100644 --- a/base/services/wmisvc/wmisvc.c +++ b/base/services/wmisvc/wmisvc.c @@ -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); } -- 2.17.1