Author: gedmurphy Date: Tue Jan 5 22:14:10 2010 New Revision: 44963
URL: http://svn.reactos.org/svn/reactos?rev=44963&view=rev Log: Clean up the start code
Modified: trunk/reactos/base/applications/mscutils/servman/start.c
Modified: trunk/reactos/base/applications/mscutils/servman/start.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils/... ============================================================================== --- trunk/reactos/base/applications/mscutils/servman/start.c [iso-8859-1] (original) +++ trunk/reactos/base/applications/mscutils/servman/start.c [iso-8859-1] Tue Jan 5 22:14:10 2010 @@ -3,7 +3,7 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: base/applications/mscutils/servman/start.c * PURPOSE: Start a service - * COPYRIGHT: Copyright 2005-2009 Ged Murphy gedmurphy@reactos.org + * COPYRIGHT: Copyright 2005-2010 Ged Murphy gedmurphy@reactos.org * */
@@ -11,7 +11,7 @@
static BOOL DoStartService(PMAIN_WND_INFO Info, - HWND hProgDlg) + HWND hProgress) { SC_HANDLE hSCManager; SC_HANDLE hService; @@ -25,72 +25,86 @@
hSCManager = OpenSCManager(NULL, NULL, - SC_MANAGER_ALL_ACCESS); - if (!hSCManager) + SC_MANAGER_CONNECT); + if (hSCManager) { - return FALSE; - } + hService = OpenService(hSCManager, + Info->pCurrentService->lpServiceName, + SERVICE_START | SERVICE_QUERY_STATUS); + if (hService) + { + if (hProgress) + { + /* Increment the progress bar */ + IncrementProgressBar(hProgress, DEFAULT_STEP); + }
- hService = OpenService(hSCManager, - Info->pCurrentService->lpServiceName, - SERVICE_START | SERVICE_QUERY_STATUS); - if (hService) - { - bRet = StartService(hService, - 0, - NULL); - if (!bRet && GetLastError() == ERROR_SERVICE_ALREADY_RUNNING) - { - bRet = TRUE; - } - else if (bRet) - { - bRet = FALSE; + bRet = StartService(hService, + 0, + NULL); + if (!bRet && GetLastError() == ERROR_SERVICE_ALREADY_RUNNING) + { + /* If it's already running, just return TRUE */ + bRet = TRUE; + } + else if (bRet) + { + bRet = FALSE;
- if (QueryServiceStatusEx(hService, - SC_STATUS_PROCESS_INFO, - (LPBYTE)&ServiceStatus, - sizeof(SERVICE_STATUS_PROCESS), - &BytesNeeded)) - { - dwStartTickCount = GetTickCount(); - dwOldCheckPoint = ServiceStatus.dwCheckPoint; - dwMaxWait = 30000; // 30 secs + /* Get the service status to check if it's running */ + if (QueryServiceStatusEx(hService, + SC_STATUS_PROCESS_INFO, + (LPBYTE)&ServiceStatus, + sizeof(SERVICE_STATUS_PROCESS), + &BytesNeeded)) + { + /* We don't want to wait for more than 30 seconds */ + dwMaxWait = 30000; + dwStartTickCount = GetTickCount();
- while (ServiceStatus.dwCurrentState != SERVICE_RUNNING) - { - dwWaitTime = ServiceStatus.dwWaitHint / 10; + /* Loop until it's running */ + while (ServiceStatus.dwCurrentState != SERVICE_RUNNING) + { + dwOldCheckPoint = ServiceStatus.dwCheckPoint; + dwWaitTime = ServiceStatus.dwWaitHint / 10;
- if (!QueryServiceStatusEx(hService, - SC_STATUS_PROCESS_INFO, - (LPBYTE)&ServiceStatus, - sizeof(SERVICE_STATUS_PROCESS), - &BytesNeeded)) - { - break; - } - - if (ServiceStatus.dwCheckPoint > dwOldCheckPoint) - { - /* The service is making progress*/ - dwStartTickCount = GetTickCount(); - dwOldCheckPoint = ServiceStatus.dwCheckPoint; - } - else - { - if (GetTickCount() >= dwStartTickCount + dwMaxWait) + /* Get the latest status info */ + if (!QueryServiceStatusEx(hService, + SC_STATUS_PROCESS_INFO, + (LPBYTE)&ServiceStatus, + sizeof(SERVICE_STATUS_PROCESS), + &BytesNeeded)) { - /* We exceeded our max wait time, give up */ + /* Something went wrong... */ break; } + + /* Is the service making progress? */ + if (ServiceStatus.dwCheckPoint > dwOldCheckPoint) + { + /* It is, get the latest tickcount to reset the max wait time */ + dwStartTickCount = GetTickCount(); + dwOldCheckPoint = ServiceStatus.dwCheckPoint; + } + else + { + /* It's not, make sure we haven't exceeded our wait time */ + if (GetTickCount() >= dwStartTickCount + dwMaxWait) + { + /* We have, give up */ + break; + } + } + + /* Adjust the wait hint times */ + if (dwWaitTime < 200) + dwWaitTime = 200; + else if (dwWaitTime > 10000) + dwWaitTime = 10000; + + /* Wait before trying again */ + Sleep(dwWaitTime); } - - if (dwWaitTime < 200) - dwWaitTime = 200; - else if (dwWaitTime > 10000) - dwWaitTime = 10000; - - Sleep(dwWaitTime); }
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING) @@ -98,13 +112,12 @@ bRet = TRUE; } } + + CloseServiceHandle(hService); }
- CloseServiceHandle(hService); + CloseServiceHandle(hSCManager); } - - CloseServiceHandle(hSCManager); -
return bRet; } @@ -112,31 +125,22 @@ BOOL DoStart(PMAIN_WND_INFO Info) { - HWND hProgDlg; + HWND hProgress; BOOL bRet = FALSE;
- hProgDlg = CreateProgressDialog(Info->hMainWnd, - IDS_PROGRESS_INFO_START); + /* Create a progress window to track the progress of the stopping service */ + hProgress = CreateProgressDialog(Info->hMainWnd, + IDS_PROGRESS_INFO_START); + if (hProgress) + { + /* Set the service name and reset the progress bag */ + InitializeProgressDialog(hProgress, Info->pCurrentService->lpServiceName);
- if (hProgDlg) - { - InitializeProgressDialog(hProgDlg, Info->pCurrentService->lpServiceName); + /* Start the requested service */ + bRet = DoStartService(Info, hProgress);
- bRet = DoStartService(Info, - hProgDlg); - - if (bRet) - { - CompleteProgressBar(hProgDlg); - Sleep(500); - bRet = TRUE; - } - else - { - GetError(); - } - - DestroyWindow(hProgDlg); + /* Complete and destroy the progress bar */ + DestroyProgressDialog(hProgress, bRet); }
return bRet;