126 lines
4.5 KiB
C
126 lines
4.5 KiB
C
|
/////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Progress.h
|
||
|
//
|
||
|
// Progress dialog to Start, Stop, Pause and Resume a service.
|
||
|
//
|
||
|
// HISTORY
|
||
|
// 03-Oct-95 t-danmo Creation of (sysmgmt\dsui\services\progress.cxx)
|
||
|
// 01-Oct-96 t-danmo Renaming of progress.cxx and adaptation to slate.
|
||
|
//
|
||
|
|
||
|
|
||
|
#define SERVICE_CONTROL_RESTART 10 // Stop and then Start the service
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
class CServiceControlProgress
|
||
|
{
|
||
|
protected:
|
||
|
enum { IDD = IDD_SERVICE_CONTROL_PROGRESS }; // Id of the dialog used
|
||
|
enum { ID_TIMER = 1 }; // Id of the timer
|
||
|
enum { dwTimerTickIncrement = 400 }; // Length of a timer tick (in milliseconds)
|
||
|
enum { dwTimerTimeout = 125000 }; // Timeout in milliseconds before aborting
|
||
|
enum { dwTimerProgressDone = 5000 }; // Estimate of time to complete the operation
|
||
|
|
||
|
protected:
|
||
|
// Run-time UI variables
|
||
|
HWND m_hWndParent; // Parent window of the dialog box
|
||
|
HWND m_hctlActionMsg; // Handle of action static control
|
||
|
HWND m_hctlServiceNameMsg; // Handle of service name static control
|
||
|
HWND m_hctlProgress; // Handle of progress bar
|
||
|
UINT m_iServiceAction; // Index of action to take (start, stop, pause or resume)
|
||
|
|
||
|
UINT_PTR m_uTimerId; // Dynamic timer Id
|
||
|
UINT m_dwTimerTicks; // Number of milliseconds the timer has been ticking
|
||
|
|
||
|
// Variables needed for the threadproc
|
||
|
HANDLE m_hThread;
|
||
|
HANDLE m_hEvent;
|
||
|
BOOL m_fCanQueryStatus;
|
||
|
DWORD m_dwQueryState; // Service state to query when pooling
|
||
|
|
||
|
SC_HANDLE m_hScManager; // Handle to service control manager database
|
||
|
SC_HANDLE m_hService; // Handle of the opened service
|
||
|
TCHAR m_szUiMachineName[256]; // Name of the computer in a friendly way
|
||
|
TCHAR m_szServiceName[256]; // Service name
|
||
|
TCHAR m_szServiceDisplayName[256]; // Display name of service
|
||
|
DWORD m_dwDesiredAccess;
|
||
|
|
||
|
// Variables used by ::StartService()
|
||
|
DWORD m_dwNumServiceArgs; // Number of arguments
|
||
|
LPCTSTR * m_lpServiceArgVectors; // Address of array of argument string pointers
|
||
|
|
||
|
// Variables used by ::ControlService()
|
||
|
DWORD m_dwControlCode; // Control code
|
||
|
|
||
|
// Variables used by ::ControlService(SERVICE_CONTROL_STOP)
|
||
|
BOOL m_fPulseEvent; // TRUE => Call PulseEvent() instead of closing the dialog
|
||
|
BOOL m_fRestartService; // TRUE => Stop the service first, then start it again.
|
||
|
INT m_iDependentServiceIter; // Index of the current dependent service
|
||
|
INT m_cDependentServices; // Number of dependent services
|
||
|
ENUM_SERVICE_STATUS * m_pargDependentServicesT; // Allocated array of dependent services
|
||
|
ENUM_SERVICE_STATUS * m_pargServiceStop; // Allocated array of services to stop
|
||
|
|
||
|
APIERR m_dwLastError; // Error code from GetLastError()
|
||
|
|
||
|
public:
|
||
|
CServiceControlProgress(); // Constructor
|
||
|
~CServiceControlProgress(); // Destructor
|
||
|
BOOL M_FInit(
|
||
|
HWND hwndParent,
|
||
|
SC_HANDLE hScManager,
|
||
|
LPCTSTR pszMachineName,
|
||
|
LPCTSTR pszServiceName,
|
||
|
LPCTSTR pszServiceDisplayName);
|
||
|
|
||
|
protected:
|
||
|
BOOL M_FDlgStopDependentServices();
|
||
|
void M_UpdateDialogUI(LPCTSTR pszDisplayName);
|
||
|
BOOL M_FGetNextService(OUT LPCTSTR * ppszServiceName, OUT LPCTSTR * ppszDisplayName);
|
||
|
DWORD M_QueryCurrentServiceState();
|
||
|
|
||
|
APIERR M_EControlService(DWORD dwControlCode);
|
||
|
APIERR M_EDoExecuteServiceThread(void * pThreadProc);
|
||
|
void M_ProcessErrorCode();
|
||
|
void M_DoThreadCleanup();
|
||
|
|
||
|
protected:
|
||
|
static DWORD S_ThreadProcStartService(CServiceControlProgress * pThis);
|
||
|
static DWORD S_ThreadProcStopService(CServiceControlProgress * pThis);
|
||
|
static DWORD S_ThreadProcPauseResumeService(CServiceControlProgress * pThis);
|
||
|
|
||
|
static BOOL CALLBACK S_DlgProcControlService(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||
|
static BOOL CALLBACK S_DlgProcDependentServices(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||
|
|
||
|
void M_OnInitDialog(HWND hdlg);
|
||
|
void M_OnTimer(HWND hdlg);
|
||
|
|
||
|
|
||
|
public:
|
||
|
enum // Error codes for variable m_dwLastError (arbitrary chosen)
|
||
|
{
|
||
|
errCannotInitialize = 123456, // Failed to initialize object
|
||
|
errUserCancelStopDependentServices, // User changed its mind (only used when stop service)
|
||
|
errUserAbort, // User aborted operation
|
||
|
};
|
||
|
|
||
|
static APIERR S_EStartService(
|
||
|
HWND hwndParent,
|
||
|
SC_HANDLE hScManager,
|
||
|
LPCTSTR pszMachineName,
|
||
|
LPCTSTR pszServiceName,
|
||
|
LPCTSTR pszServiceDisplayName,
|
||
|
DWORD dwNumServiceArgs,
|
||
|
LPCTSTR * lpServiceArgVectors);
|
||
|
|
||
|
static APIERR S_EControlService(
|
||
|
HWND hwndParent,
|
||
|
SC_HANDLE hScManager,
|
||
|
LPCTSTR pszMachineName,
|
||
|
LPCTSTR pszServiceName,
|
||
|
LPCTSTR pszServiceDisplayName,
|
||
|
DWORD dwControlCode);
|
||
|
|
||
|
}; // CServiceControlProgress
|
||
|
|