/** * This file is part of the mingw-w64 runtime package. * No warranty is given; refer to the file DISCLAIMER within this package. */ #ifndef _INC_RESTARTMANAGER #define _INC_RESTARTMANAGER #include #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #ifdef __cplusplus extern "C" { #endif #define RM_SESSION_KEY_LEN sizeof (GUID) #define CCH_RM_SESSION_KEY RM_SESSION_KEY_LEN * 2 #define CCH_RM_MAX_APP_NAME 255 #define CCH_RM_MAX_SVC_NAME 63 #define RM_INVALID_TS_SESSION -1 #define RM_INVALID_PROCESS -1 typedef enum _RM_APP_STATUS { RmStatusUnknown = 0x0, RmStatusRunning = 0x1, RmStatusStopped = 0x2, RmStatusStoppedOther = 0x4, RmStatusRestarted = 0x8, RmStatusErrorOnStop = 0x10, RmStatusErrorOnRestart = 0x20, RmStatusShutdownMasked = 0x40, RmStatusRestartMasked = 0x80 } RM_APP_STATUS; typedef enum _RM_SHUTDOWN_TYPE { RmForceShutdown = 0x1, RmShutdownOnlyRegistered = 0x10 } RM_SHUTDOWN_TYPE; typedef enum _RM_APP_TYPE { RmUnknownApp = 0, RmMainWindow, RmOtherWindow, RmService, RmExplorer, RmConsole, RmCritical = 1000 } RM_APP_TYPE; typedef enum _RM_REBOOT_REASON { RmRebootReasonNone = 0x0, RmRebootReasonPermissionDenied = 0x1, RmRebootReasonSessionMismatch = 0x2, RmRebootReasonCriticalProcess = 0x4, RmRebootReasonCriticalService = 0x8, RmRebootReasonDetectedSelf = 0x10 } RM_REBOOT_REASON; typedef enum _RM_FILTER_TRIGGER { RmFilterTriggerInvalid = 0, RmFilterTriggerFile, RmFilterTriggerProcess, RmFilterTriggerService } RM_FILTER_TRIGGER; typedef enum _RM_FILTER_ACTION { RmInvalidFilterAction = 0, RmNoRestart, RmNoShutdown } RM_FILTER_ACTION; typedef struct _RM_UNIQUE_PROCESS { DWORD dwProcessId; FILETIME ProcessStartTime; } RM_UNIQUE_PROCESS, *PRM_UNIQUE_PROCESS; typedef struct _RM_PROCESS_INFO { RM_UNIQUE_PROCESS Process; WCHAR strAppName[CCH_RM_MAX_APP_NAME + 1]; WCHAR strServiceShortName[CCH_RM_MAX_SVC_NAME + 1]; RM_APP_TYPE ApplicationType; ULONG AppStatus; DWORD TSSessionId; BOOL bRestartable; } RM_PROCESS_INFO, *PRM_PROCESS_INFO; typedef struct _RM_FILTER_INFO { RM_FILTER_ACTION FilterAction; RM_FILTER_TRIGGER FilterTrigger; DWORD cbNextOffset; __C89_NAMELESS union { LPWSTR strFilename; RM_UNIQUE_PROCESS Process; LPWSTR strServiceShortName; }; } RM_FILTER_INFO, *PRM_FILTER_INFO; typedef void (*RM_WRITE_STATUS_CALLBACK)(UINT nPercentComplete); DWORD WINAPI RmStartSession(DWORD *pSessionHandle, DWORD dwSessionFlags, WCHAR strSessionKey[]); DWORD WINAPI RmJoinSession(DWORD *pSessionHandle, const WCHAR strSessionKey[]); DWORD WINAPI RmEndSession(DWORD dwSessionHandle); DWORD WINAPI RmRegisterResources(DWORD dwSessionHandle, UINT nFiles, LPCWSTR rgsFileNames[], UINT nApplications, RM_UNIQUE_PROCESS rgApplications[], UINT nServices, LPCWSTR rgsServiceNames[]); DWORD WINAPI RmGetList(DWORD dwSessionHandle, UINT *pnProcInfoNeeded, UINT *pnProcInfo, RM_PROCESS_INFO rgAffectedApps[], LPDWORD lpdwRebootReasons); DWORD WINAPI RmShutdown(DWORD dwSessionHandle, ULONG lActionFlags, RM_WRITE_STATUS_CALLBACK fnStatus); DWORD WINAPI RmRestart(DWORD dwSessionHandle, DWORD dwRestartFlags, RM_WRITE_STATUS_CALLBACK fnStatus); DWORD WINAPI RmCancelCurrentTask(DWORD dwSessionHandle); DWORD WINAPI RmAddFilter(DWORD dwSessionHandle, LPCWSTR strModuleName, RM_UNIQUE_PROCESS *pProcess, LPCWSTR strServiceShortName, RM_FILTER_ACTION FilterAction); DWORD WINAPI RmRemoveFilter(DWORD dwSessionHandle, LPCWSTR strModuleName, RM_UNIQUE_PROCESS *pProcess, LPCWSTR strServiceShortName); DWORD WINAPI RmGetFilterList(DWORD dwSessionHandle, PBYTE pbFilterBuf, DWORD cbFilterBuf, LPDWORD cbFilterBufNeeded); #ifdef __cplusplus } #endif #endif #endif