1 /**
2  * This file is part of the mingw-w64 runtime package.
3  * No warranty is given; refer to the file DISCLAIMER within this package.
4  */
5 
6 #ifndef _INC_RESTARTMANAGER
7 #define _INC_RESTARTMANAGER
8 
9 #include <winapifamily.h>
10 
11 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17 #define RM_SESSION_KEY_LEN  sizeof (GUID)
18 #define CCH_RM_SESSION_KEY  RM_SESSION_KEY_LEN * 2
19 #define CCH_RM_MAX_APP_NAME 255
20 #define CCH_RM_MAX_SVC_NAME 63
21 #define RM_INVALID_TS_SESSION -1
22 #define RM_INVALID_PROCESS -1
23 
24   typedef enum _RM_APP_STATUS {
25     RmStatusUnknown = 0x0,
26     RmStatusRunning = 0x1,
27     RmStatusStopped = 0x2,
28     RmStatusStoppedOther = 0x4,
29     RmStatusRestarted = 0x8,
30     RmStatusErrorOnStop = 0x10,
31     RmStatusErrorOnRestart = 0x20,
32     RmStatusShutdownMasked = 0x40,
33     RmStatusRestartMasked = 0x80
34   } RM_APP_STATUS;
35 
36   typedef enum _RM_SHUTDOWN_TYPE {
37     RmForceShutdown = 0x1,
38     RmShutdownOnlyRegistered = 0x10
39   } RM_SHUTDOWN_TYPE;
40 
41   typedef enum _RM_APP_TYPE {
42     RmUnknownApp = 0,
43     RmMainWindow,
44     RmOtherWindow,
45     RmService,
46     RmExplorer,
47     RmConsole,
48     RmCritical = 1000
49   } RM_APP_TYPE;
50 
51   typedef enum _RM_REBOOT_REASON {
52     RmRebootReasonNone = 0x0,
53     RmRebootReasonPermissionDenied = 0x1,
54     RmRebootReasonSessionMismatch = 0x2,
55     RmRebootReasonCriticalProcess = 0x4,
56     RmRebootReasonCriticalService = 0x8,
57     RmRebootReasonDetectedSelf = 0x10
58   } RM_REBOOT_REASON;
59 
60   typedef enum _RM_FILTER_TRIGGER {
61     RmFilterTriggerInvalid = 0,
62     RmFilterTriggerFile,
63     RmFilterTriggerProcess,
64     RmFilterTriggerService
65   } RM_FILTER_TRIGGER;
66 
67   typedef enum _RM_FILTER_ACTION {
68     RmInvalidFilterAction = 0,
69     RmNoRestart,
70     RmNoShutdown
71   } RM_FILTER_ACTION;
72 
73   typedef struct _RM_UNIQUE_PROCESS {
74     DWORD dwProcessId;
75     FILETIME ProcessStartTime;
76   } RM_UNIQUE_PROCESS, *PRM_UNIQUE_PROCESS;
77 
78   typedef struct _RM_PROCESS_INFO {
79     RM_UNIQUE_PROCESS Process;
80     WCHAR strAppName[CCH_RM_MAX_APP_NAME + 1];
81     WCHAR strServiceShortName[CCH_RM_MAX_SVC_NAME + 1];
82     RM_APP_TYPE ApplicationType;
83     ULONG AppStatus;
84     DWORD TSSessionId;
85     BOOL bRestartable;
86   } RM_PROCESS_INFO, *PRM_PROCESS_INFO;
87 
88   typedef struct _RM_FILTER_INFO {
89     RM_FILTER_ACTION FilterAction;
90     RM_FILTER_TRIGGER FilterTrigger;
91     DWORD cbNextOffset;
92     __C89_NAMELESS union {
93       LPWSTR strFilename;
94       RM_UNIQUE_PROCESS Process;
95       LPWSTR strServiceShortName;
96     };
97   } RM_FILTER_INFO, *PRM_FILTER_INFO;
98 
99   typedef void (*RM_WRITE_STATUS_CALLBACK)(UINT nPercentComplete);
100 
101   DWORD WINAPI RmStartSession(DWORD *pSessionHandle, DWORD dwSessionFlags, WCHAR strSessionKey[]);
102   DWORD WINAPI RmJoinSession(DWORD *pSessionHandle, const WCHAR strSessionKey[]);
103   DWORD WINAPI RmEndSession(DWORD dwSessionHandle);
104   DWORD WINAPI RmRegisterResources(DWORD dwSessionHandle, UINT nFiles, LPCWSTR rgsFileNames[], UINT nApplications, RM_UNIQUE_PROCESS rgApplications[], UINT nServices, LPCWSTR rgsServiceNames[]);
105   DWORD WINAPI RmGetList(DWORD dwSessionHandle, UINT *pnProcInfoNeeded, UINT *pnProcInfo, RM_PROCESS_INFO rgAffectedApps[], LPDWORD lpdwRebootReasons);
106   DWORD WINAPI RmShutdown(DWORD dwSessionHandle, ULONG lActionFlags, RM_WRITE_STATUS_CALLBACK fnStatus);
107   DWORD WINAPI RmRestart(DWORD dwSessionHandle, DWORD dwRestartFlags, RM_WRITE_STATUS_CALLBACK fnStatus);
108   DWORD WINAPI RmCancelCurrentTask(DWORD dwSessionHandle);
109   DWORD WINAPI RmAddFilter(DWORD dwSessionHandle, LPCWSTR strModuleName, RM_UNIQUE_PROCESS *pProcess, LPCWSTR strServiceShortName, RM_FILTER_ACTION FilterAction);
110   DWORD WINAPI RmRemoveFilter(DWORD dwSessionHandle, LPCWSTR strModuleName, RM_UNIQUE_PROCESS *pProcess, LPCWSTR strServiceShortName);
111   DWORD WINAPI RmGetFilterList(DWORD dwSessionHandle, PBYTE pbFilterBuf, DWORD cbFilterBuf, LPDWORD cbFilterBufNeeded);
112 
113 #ifdef __cplusplus
114 }
115 #endif
116 
117 #endif
118 
119 #endif
120