[SERVMAN] UI update and Error Management (#2653)

Purpose
=======
- Current design does not warn user nor logs DEBUG traces when Service Start/Stop command fails or reach timeout.
- Current Service Start/Stop progress window are WS_EX_TOOLWINDOW which reduce lisibility, is a ReactOS specificity without good reason.

Proposed changes
================
- DPRINT1 traces added on failure cases.
- Error Message box presented to user upon failure with explicit root cause identification.
- Change Dialog definition to standard window.
This commit is contained in:
Kyle Katarn 2020-05-01 19:01:59 +02:00 committed by GitHub
parent 140ec9d037
commit b3947d5283
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 138 additions and 67 deletions

View file

@ -9,9 +9,12 @@
#include "precomp.h" #include "precomp.h"
#define NDEBUG
#include <debug.h>
#define MAX_WAIT_TIME 30000 #define MAX_WAIT_TIME 30000
BOOL DWORD
DoControlService(LPWSTR ServiceName, DoControlService(LPWSTR ServiceName,
HWND hProgress, HWND hProgress,
DWORD Control) DWORD Control)
@ -27,6 +30,7 @@ DoControlService(LPWSTR ServiceName,
DWORD MaxWait; DWORD MaxWait;
DWORD ReqState, i; DWORD ReqState, i;
BOOL Result; BOOL Result;
DWORD dwResult = ERROR_SUCCESS;
/* Set the state we're interested in */ /* Set the state we're interested in */
switch (Control) switch (Control)
@ -39,21 +43,23 @@ DoControlService(LPWSTR ServiceName,
break; break;
default: default:
/* Unhandled control code */ /* Unhandled control code */
return FALSE; DPRINT1("Unknown control command: 0x%X\n", Control);
return ERROR_INVALID_SERVICE_CONTROL;
} }
hSCManager = OpenSCManagerW(NULL, hSCManager = OpenSCManagerW(NULL,
NULL, NULL,
SC_MANAGER_CONNECT); SC_MANAGER_CONNECT);
if (!hSCManager) return FALSE; if (!hSCManager) return GetLastError();
hService = OpenServiceW(hSCManager, hService = OpenServiceW(hSCManager,
ServiceName, ServiceName,
SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_QUERY_STATUS); SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_QUERY_STATUS);
if (!hService) if (!hService)
{ {
dwResult = GetLastError();
CloseServiceHandle(hSCManager); CloseServiceHandle(hSCManager);
return FALSE; return dwResult;
} }
/* Send the control message to the service */ /* Send the control message to the service */
@ -109,6 +115,8 @@ DoControlService(LPWSTR ServiceName,
&BytesNeeded)) &BytesNeeded))
{ {
/* Something went wrong... */ /* Something went wrong... */
dwResult = GetLastError();
DPRINT1("QueryServiceStatusEx failed: %d\n", dwResult);
break; break;
} }
@ -123,23 +131,33 @@ DoControlService(LPWSTR ServiceName,
else else
{ {
/* It's not, make sure we haven't exceeded our wait time */ /* It's not, make sure we haven't exceeded our wait time */
if(GetTickCount() >= StartTickCount + MaxWait) if (GetTickCount() >= StartTickCount + MaxWait)
{ {
/* We have, give up */ /* We have, give up */
DPRINT1("Timeout\n");
dwResult = ERROR_SERVICE_REQUEST_TIMEOUT;
break; break;
} }
} }
} }
} }
else
{
dwResult = GetLastError();
}
if (ServiceStatus.dwCurrentState == ReqState) if (ServiceStatus.dwCurrentState == ReqState)
{ {
Result = TRUE; dwResult = ERROR_SUCCESS;
} }
} }
else
{
dwResult = GetLastError();
}
CloseServiceHandle(hService); CloseServiceHandle(hService);
CloseServiceHandle(hSCManager); CloseServiceHandle(hSCManager);
return Result; return dwResult;
} }

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Управление на услугите" CAPTION "Управление на услугите"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Ovldání služeb" CAPTION "Ovldání služeb"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Dienststeuerung" CAPTION "Dienststeuerung"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Service Control" CAPTION "Service Control"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Service Control" CAPTION "Service Control"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -235,7 +235,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Control de servicios" CAPTION "Control de servicios"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Contrôle du Service" CAPTION "Contrôle du Service"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "בקרת שירות" CAPTION "בקרת שירות"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Kontrol Layanan" CAPTION "Kontrol Layanan"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Controllo dei servizi" CAPTION "Controllo dei servizi"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "サービス コントロール" CAPTION "サービス コントロール"
FONT 9, "MS UI Gothic", 0, 0 FONT 9, "MS UI Gothic", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -234,7 +234,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "서비스 컨트롤" CAPTION "서비스 컨트롤"
FONT 9, "굴림", 0, 0 FONT 9, "굴림", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Tjeneste kontroll" CAPTION "Tjeneste kontroll"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -242,7 +242,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Usługa kontrolna" CAPTION "Usługa kontrolna"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -237,7 +237,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Control servicii" CAPTION "Control servicii"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -232,7 +232,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Управление службами" CAPTION "Управление службами"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -237,7 +237,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Service Control" CAPTION "Service Control"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -237,7 +237,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Kontrolli i shërbimeve" CAPTION "Kontrolli i shërbimeve"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -239,7 +239,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Tjänst kontroll" CAPTION "Tjänst kontroll"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -240,7 +240,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "ตัวควบคุมบริการ" CAPTION "ตัวควบคุมบริการ"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -234,7 +234,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Hizmet Denetimi" CAPTION "Hizmet Denetimi"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -240,7 +240,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "Управління службами" CAPTION "Управління службами"
FONT 8, "MS Shell Dlg", 0, 0 FONT 8, "MS Shell Dlg", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -234,7 +234,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "服务控制" CAPTION "服务控制"
FONT 9, "宋体", 0, 0 FONT 9, "宋体", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -234,7 +234,6 @@ IDD_DLG_PROGRESS DIALOGEX 6, 6, 255, 89
CAPTION "服務控制" CAPTION "服務控制"
FONT 9, "新細明體", 0, 0 FONT 9, "新細明體", 0, 0
STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME
EXSTYLE WS_EX_TOOLWINDOW
BEGIN BEGIN
CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13 CONTROL "", IDC_SERVCON_PROGRESS, "msctls_progress32", 0x50000000, 8, 46, 238, 13
LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11 LTEXT "", IDC_SERVCON_INFO, 8, 5, 236, 11

View file

@ -7,9 +7,11 @@
#include <windef.h> #include <windef.h>
#include <winbase.h> #include <winbase.h>
#include <winerror.h>
#include <wingdi.h> #include <wingdi.h>
#include <winsvc.h> #include <winsvc.h>
#include <wincon.h> #include <wincon.h>
#include <shlobj.h> #include <shlobj.h>
#include <commdlg.h> #include <commdlg.h>
#include <strsafe.h> #include <strsafe.h>
@ -100,9 +102,9 @@ VOID ListViewSelectionChanged(PMAIN_WND_INFO Info, LPNMLISTVIEW pnmv);
BOOL CreateListView(PMAIN_WND_INFO Info); BOOL CreateListView(PMAIN_WND_INFO Info);
/* start / stop / control */ /* start / stop / control */
BOOL DoStartService(LPWSTR ServiceName, HANDLE hProgress, LPWSTR lpStartParams); DWORD DoStartService(LPWSTR ServiceName, HANDLE hProgress, LPWSTR lpStartParams);
BOOL DoStopService(LPWSTR ServiceName, HANDLE hProgress); DWORD DoStopService(LPWSTR ServiceName, HANDLE hProgress);
BOOL DoControlService(LPWSTR ServiceName, HWND hProgress, DWORD Control); DWORD DoControlService(LPWSTR ServiceName, HWND hProgress, DWORD Control);
/* progress.c */ /* progress.c */
#define DEFAULT_STEP 0 #define DEFAULT_STEP 0
@ -122,7 +124,6 @@ BOOL RefreshServiceList(PMAIN_WND_INFO Info);
BOOL UpdateServiceStatus(ENUM_SERVICE_STATUS_PROCESS* pService); BOOL UpdateServiceStatus(ENUM_SERVICE_STATUS_PROCESS* pService);
BOOL GetServiceList(PMAIN_WND_INFO Info); BOOL GetServiceList(PMAIN_WND_INFO Info);
/* propsheet.c */ /* propsheet.c */
typedef struct _SERVICEPROPSHEET typedef struct _SERVICEPROPSHEET
{ {

View file

@ -26,6 +26,25 @@ typedef struct _PROGRESS_DATA
} PROGRESS_DATA, *PPROGRESS_DATA; } PROGRESS_DATA, *PPROGRESS_DATA;
VOID ShowError(DWORD dwLastError)
{
LPWSTR lpMsg;
if (!FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwLastError,
LANG_USER_DEFAULT,
(LPWSTR)&lpMsg,
0, NULL))
{
return;
}
MessageBoxW(NULL, lpMsg, NULL, MB_OK | MB_ICONERROR);
LocalFree(lpMsg);
}
static VOID static VOID
ResetProgressDialog(HWND hDlg, ResetProgressDialog(HWND hDlg,
@ -67,6 +86,7 @@ ResetProgressDialog(HWND hDlg,
unsigned int __stdcall ActionThread(void* Param) unsigned int __stdcall ActionThread(void* Param)
{ {
PPROGRESS_DATA ProgressData = (PPROGRESS_DATA)Param; PPROGRESS_DATA ProgressData = (PPROGRESS_DATA)Param;
DWORD dwResult;
if (ProgressData->Action == ACTION_START) if (ProgressData->Action == ACTION_START)
{ {
@ -76,13 +96,18 @@ unsigned int __stdcall ActionThread(void* Param)
IDS_PROGRESS_INFO_START); IDS_PROGRESS_INFO_START);
/* Start the service */ /* Start the service */
if (DoStartService(ProgressData->ServiceName, dwResult = DoStartService(ProgressData->ServiceName,
ProgressData->hProgress, ProgressData->hProgress,
ProgressData->Param)) ProgressData->Param);
if (dwResult == ERROR_SUCCESS)
{ {
/* We're done, slide the progress bar up to the top */ /* We're done, slide the progress bar up to the top */
CompleteProgressBar(ProgressData->hProgress); CompleteProgressBar(ProgressData->hProgress);
} }
else
{
ShowError(dwResult);
}
} }
else if (ProgressData->Action == ACTION_STOP || ProgressData->Action == ACTION_RESTART) else if (ProgressData->Action == ACTION_STOP || ProgressData->Action == ACTION_RESTART)
{ {
@ -108,11 +133,16 @@ unsigned int __stdcall ActionThread(void* Param)
IDS_PROGRESS_INFO_STOP); IDS_PROGRESS_INFO_STOP);
/* Stop the requested service */ /* Stop the requested service */
if (DoStopService(ProgressData->ServiceName, dwResult = DoStopService(ProgressData->ServiceName,
ProgressData->hProgress)) ProgressData->hProgress);
if (dwResult == ERROR_SUCCESS)
{ {
CompleteProgressBar(ProgressData->hProgress); CompleteProgressBar(ProgressData->hProgress);
} }
else
{
ShowError(dwResult);
}
/* Move onto the next string */ /* Move onto the next string */
while (*lpStr != L'\0') while (*lpStr != L'\0')
@ -124,11 +154,16 @@ unsigned int __stdcall ActionThread(void* Param)
ProgressData->ServiceName, ProgressData->ServiceName,
IDS_PROGRESS_INFO_STOP); IDS_PROGRESS_INFO_STOP);
if (DoStopService(ProgressData->ServiceName, dwResult = DoStopService(ProgressData->ServiceName,
ProgressData->hProgress)) ProgressData->hProgress);
if (dwResult == ERROR_SUCCESS)
{ {
CompleteProgressBar(ProgressData->hProgress); CompleteProgressBar(ProgressData->hProgress);
} }
else
{
ShowError(dwResult);
}
/* If this was a restart, we'll need to start the service back up */ /* If this was a restart, we'll need to start the service back up */
@ -140,13 +175,18 @@ unsigned int __stdcall ActionThread(void* Param)
IDS_PROGRESS_INFO_START); IDS_PROGRESS_INFO_START);
/* Start the service */ /* Start the service */
if (DoStartService(ProgressData->ServiceName, dwResult = DoStartService(ProgressData->ServiceName,
ProgressData->hProgress, ProgressData->hProgress,
NULL)) NULL);
if (dwResult == ERROR_SUCCESS)
{ {
/* We're done, slide the progress bar up to the top */ /* We're done, slide the progress bar up to the top */
CompleteProgressBar(ProgressData->hProgress); CompleteProgressBar(ProgressData->hProgress);
} }
else
{
ShowError(dwResult);
}
} }
} }
else if (ProgressData->Action == ACTION_PAUSE) else if (ProgressData->Action == ACTION_PAUSE)
@ -157,13 +197,18 @@ unsigned int __stdcall ActionThread(void* Param)
IDS_PROGRESS_INFO_PAUSE); IDS_PROGRESS_INFO_PAUSE);
/* Pause the service */ /* Pause the service */
if (DoControlService(ProgressData->ServiceName, dwResult = DoControlService(ProgressData->ServiceName,
ProgressData->hProgress, ProgressData->hProgress,
SERVICE_CONTROL_PAUSE)) SERVICE_CONTROL_PAUSE);
if (dwResult == ERROR_SUCCESS)
{ {
/* We're done, slide the progress bar up to the top */ /* We're done, slide the progress bar up to the top */
CompleteProgressBar(ProgressData->hProgress); CompleteProgressBar(ProgressData->hProgress);
} }
else
{
ShowError(dwResult);
}
} }
else if (ProgressData->Action == ACTION_RESUME) else if (ProgressData->Action == ACTION_RESUME)
{ {
@ -173,13 +218,18 @@ unsigned int __stdcall ActionThread(void* Param)
IDS_PROGRESS_INFO_RESUME); IDS_PROGRESS_INFO_RESUME);
/* resume the service */ /* resume the service */
if (DoControlService(ProgressData->ServiceName, dwResult = DoControlService(ProgressData->ServiceName,
ProgressData->hProgress, ProgressData->hProgress,
SERVICE_CONTROL_CONTINUE)) SERVICE_CONTROL_CONTINUE);
if (dwResult == ERROR_SUCCESS)
{ {
/* We're done, slide the progress bar up to the top */ /* We're done, slide the progress bar up to the top */
CompleteProgressBar(ProgressData->hProgress); CompleteProgressBar(ProgressData->hProgress);
} }
else
{
ShowError(dwResult);
}
} }

View file

@ -9,9 +9,12 @@
#include "precomp.h" #include "precomp.h"
#define NDEBUG
#include <debug.h>
#define MAX_WAIT_TIME 30000 #define MAX_WAIT_TIME 30000
BOOL DWORD
DoStartService(LPWSTR ServiceName, DoStartService(LPWSTR ServiceName,
HANDLE hProgress, HANDLE hProgress,
LPWSTR lpStartParams) LPWSTR lpStartParams)
@ -29,6 +32,7 @@ DoStartService(LPWSTR ServiceName,
BOOL bWhiteSpace = TRUE; BOOL bWhiteSpace = TRUE;
LPWSTR lpChar; LPWSTR lpChar;
DWORD dwArgsCount = 0; DWORD dwArgsCount = 0;
DWORD dwResult = ERROR_SUCCESS;
LPCWSTR *lpArgsVector = NULL; LPCWSTR *lpArgsVector = NULL;
if (lpStartParams != NULL) if (lpStartParams != NULL)
@ -59,7 +63,7 @@ DoStartService(LPWSTR ServiceName,
*/ */
lpArgsVector = LocalAlloc(LMEM_FIXED, dwArgsCount * sizeof(LPCWSTR)); lpArgsVector = LocalAlloc(LMEM_FIXED, dwArgsCount * sizeof(LPCWSTR));
if (!lpArgsVector) if (!lpArgsVector)
return FALSE; return GetLastError();
/* Fill the arguments vector */ /* Fill the arguments vector */
dwArgsCount = 0; dwArgsCount = 0;
@ -91,9 +95,10 @@ DoStartService(LPWSTR ServiceName,
SC_MANAGER_CONNECT); SC_MANAGER_CONNECT);
if (!hSCManager) if (!hSCManager)
{ {
dwResult = GetLastError();
if (lpArgsVector) if (lpArgsVector)
LocalFree((LPVOID)lpArgsVector); LocalFree((LPVOID)lpArgsVector);
return FALSE; return dwResult;
} }
hService = OpenServiceW(hSCManager, hService = OpenServiceW(hSCManager,
@ -101,10 +106,11 @@ DoStartService(LPWSTR ServiceName,
SERVICE_START | SERVICE_QUERY_STATUS); SERVICE_START | SERVICE_QUERY_STATUS);
if (!hService) if (!hService)
{ {
dwResult = GetLastError();
CloseServiceHandle(hSCManager); CloseServiceHandle(hSCManager);
if (lpArgsVector) if (lpArgsVector)
LocalFree((LPVOID)lpArgsVector); LocalFree((LPVOID)lpArgsVector);
return FALSE; return dwResult;
} }
/* Start the service */ /* Start the service */
@ -167,6 +173,8 @@ DoStartService(LPWSTR ServiceName,
&BytesNeeded)) &BytesNeeded))
{ {
/* Something went wrong... */ /* Something went wrong... */
dwResult = GetLastError();
DPRINT1("QueryServiceStatusEx failed: %d\n", dwResult);
break; break;
} }
@ -183,24 +191,29 @@ DoStartService(LPWSTR ServiceName,
if (GetTickCount() >= StartTickCount + MaxWait) if (GetTickCount() >= StartTickCount + MaxWait)
{ {
/* We have, give up */ /* We have, give up */
DPRINT1("Timeout\n");
dwResult = ERROR_SERVICE_REQUEST_TIMEOUT;
break; break;
} }
} }
} }
} }
else
{
dwResult = GetLastError();
}
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING) if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{ {
Result = TRUE; dwResult = ERROR_SUCCESS;
} }
} }
CloseServiceHandle(hService); CloseServiceHandle(hService);
CloseServiceHandle(hSCManager); CloseServiceHandle(hSCManager);
if (lpArgsVector) if (lpArgsVector)
LocalFree((LPVOID)lpArgsVector); LocalFree((LPVOID)lpArgsVector);
return Result; return dwResult;
} }

View file

@ -9,9 +9,12 @@
#include "precomp.h" #include "precomp.h"
#define NDEBUG
#include <debug.h>
#define MAX_WAIT_TIME 30000 #define MAX_WAIT_TIME 30000
BOOL DWORD
DoStopService(_In_z_ LPWSTR ServiceName, DoStopService(_In_z_ LPWSTR ServiceName,
_In_opt_ HANDLE hProgress) _In_opt_ HANDLE hProgress)
{ {
@ -22,21 +25,21 @@ DoStopService(_In_z_ LPWSTR ServiceName,
DWORD StartTime; DWORD StartTime;
DWORD WaitTime; DWORD WaitTime;
DWORD Timeout; DWORD Timeout;
BOOL bRet = FALSE; DWORD dwResult = ERROR_SUCCESS;
hSCManager = OpenSCManagerW(NULL, hSCManager = OpenSCManagerW(NULL,
NULL, NULL,
SC_MANAGER_CONNECT); SC_MANAGER_CONNECT);
if (!hSCManager) return FALSE; if (!hSCManager) return GetLastError();
hService = OpenServiceW(hSCManager, hService = OpenServiceW(hSCManager,
ServiceName, ServiceName,
SERVICE_STOP | SERVICE_QUERY_STATUS); SERVICE_STOP | SERVICE_QUERY_STATUS);
if (!hService) if (!hService)
{ {
dwResult = GetLastError();
CloseServiceHandle(hSCManager); CloseServiceHandle(hSCManager);
return FALSE; return dwResult;
} }
if (hProgress) if (hProgress)
@ -90,21 +93,31 @@ DoStopService(_In_z_ LPWSTR ServiceName,
if (GetTickCount() - StartTime > Timeout) if (GetTickCount() - StartTime > Timeout)
{ {
/* Yep, give up */ /* Yep, give up */
DPRINT1("Timeout\n");
dwResult = ERROR_SERVICE_REQUEST_TIMEOUT;
break; break;
} }
} }
else
{
dwResult = GetLastError();
DPRINT1("QueryServiceStatusEx failed: %d\n", dwResult);
}
} }
/* If the service is stopped, return TRUE */ /* If the service is stopped, return TRUE */
if (ServiceStatus.dwCurrentState == SERVICE_STOPPED) if (ServiceStatus.dwCurrentState == SERVICE_STOPPED)
{ {
bRet = TRUE; dwResult = ERROR_SUCCESS;
} }
} }
else
{
dwResult = GetLastError();
}
CloseServiceHandle(hService); CloseServiceHandle(hService);
CloseServiceHandle(hSCManager); CloseServiceHandle(hSCManager);
return bRet; return dwResult;
} }