mirror of https://github.com/UMSKT/xpmgr.git
362 lines
15 KiB
C
362 lines
15 KiB
C
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// RestartManager.h -- Header for RestartManager API
|
|
//
|
|
// Copyright (c) Microsoft Corp. All rights reserverd.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
#pragma once
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif // __cplusplus
|
|
|
|
|
|
// Macros and Types
|
|
|
|
// RM_SESSION_KEY_LEN - size in bytes of binary session key
|
|
#define RM_SESSION_KEY_LEN sizeof(GUID)
|
|
// CCH_RM_SESSION_KEY - character count of text-encoded session key
|
|
#define CCH_RM_SESSION_KEY RM_SESSION_KEY_LEN*2
|
|
// CCH_RM_MAX_APP_NAME - maximum character count of application friendly name
|
|
#define CCH_RM_MAX_APP_NAME 255
|
|
// CCH_RM_MAX_SVC_NAME - maximum character count of service short name
|
|
#define CCH_RM_MAX_SVC_NAME 63
|
|
// Uninitialized value for TS Session ID
|
|
#define RM_INVALID_TS_SESSION -1
|
|
// Uninitialized value for Process ID
|
|
#define RM_INVALID_PROCESS -1
|
|
|
|
typedef enum _RM_APP_TYPE {
|
|
RmUnknownApp = 0, // Application type cannot be classified in
|
|
// known categories
|
|
RmMainWindow = 1, // Application is a windows application that
|
|
// displays a top-level window
|
|
RmOtherWindow = 2, // Application is a windows app but does not
|
|
// display a top-level window
|
|
RmService = 3, // Application is an NT service
|
|
RmExplorer = 4, // Application is Explorer
|
|
RmConsole = 5, // Application is Console application
|
|
RmCritical = 1000 // Application is critical system process
|
|
// where a reboot is required to restart
|
|
} RM_APP_TYPE;
|
|
|
|
typedef enum _RM_SHUTDOWN_TYPE {
|
|
RmForceShutdown = 0x1, // Force app shutdown
|
|
RmShutdownOnlyRegistered = 0x10 // Only shudown apps if all apps
|
|
// registered for restart
|
|
} RM_SHUTDOWN_TYPE;
|
|
|
|
typedef enum _RM_APP_STATUS {
|
|
RmStatusUnknown = 0x0, // Application in unknown state
|
|
// or state not important
|
|
RmStatusRunning = 0x1, // Application is currently running
|
|
RmStatusStopped = 0x2, // Application stopped by Restart Manager
|
|
RmStatusStoppedOther = 0x4, // Application detected stopped
|
|
// by outside action
|
|
RmStatusRestarted = 0x8, // Application restarted by Restart Manager
|
|
RmStatusErrorOnStop = 0x10, // An error occurred when stopping
|
|
// this application
|
|
RmStatusErrorOnRestart = 0x20, // An error occurred when restarting
|
|
// this application
|
|
RmStatusShutdownMasked = 0x40, // Shutdown action masked by filer
|
|
RmStatusRestartMasked = 0x80 // Restart action masked by filter
|
|
} RM_APP_STATUS;
|
|
|
|
typedef enum _RM_REBOOT_REASON {
|
|
RmRebootReasonNone = 0x0, // Reboot not required
|
|
RmRebootReasonPermissionDenied = 0x1, // Current user does not have
|
|
// permission to shut down
|
|
// one or more detected processes
|
|
RmRebootReasonSessionMismatch = 0x2, // One or more processes are
|
|
// running in another TS session.
|
|
RmRebootReasonCriticalProcess = 0x4, // A critical process has been
|
|
// detected
|
|
RmRebootReasonCriticalService = 0x8, // A critical service has been
|
|
// detected
|
|
RmRebootReasonDetectedSelf = 0x10 // The current process has been
|
|
// detected
|
|
} RM_REBOOT_REASON;
|
|
|
|
typedef struct _RM_UNIQUE_PROCESS {
|
|
DWORD dwProcessId; // PID
|
|
FILETIME ProcessStartTime; // Process creation time
|
|
} RM_UNIQUE_PROCESS, *PRM_UNIQUE_PROCESS;
|
|
|
|
typedef struct _RM_PROCESS_INFO{
|
|
RM_UNIQUE_PROCESS Process; // Unique process identification
|
|
WCHAR strAppName[CCH_RM_MAX_APP_NAME+1]; // Application friendly name
|
|
WCHAR strServiceShortName[CCH_RM_MAX_SVC_NAME+1]; // Service short name,
|
|
// if applicable
|
|
RM_APP_TYPE ApplicationType; // Application type
|
|
ULONG AppStatus; // Bit mask of application status
|
|
DWORD TSSessionId; // Terminal Service session ID of
|
|
// process (-1 if n/a)
|
|
BOOL bRestartable; // Is application restartable?
|
|
} RM_PROCESS_INFO, *PRM_PROCESS_INFO;
|
|
|
|
typedef enum _RM_FILTER_TRIGGER
|
|
{
|
|
RmFilterTriggerInvalid = 0, // Invalid value
|
|
RmFilterTriggerFile, // Filter is triggered by EXE name
|
|
RmFilterTriggerProcess, // Filter is triggered by PID/create time
|
|
RmFilterTriggerService // Filter is triggered by service short name
|
|
} RM_FILTER_TRIGGER;
|
|
|
|
typedef enum _RM_FILTER_ACTION {
|
|
RmInvalidFilterAction = 0, // Invalid value
|
|
RmNoRestart = 1, // Prevent restart of application
|
|
RmNoShutdown = 2 // Prevent shutdown and restart of
|
|
// application
|
|
} RM_FILTER_ACTION;
|
|
|
|
typedef struct _RM_FILTER_INFO
|
|
{
|
|
RM_FILTER_ACTION FilterAction; // Filter action
|
|
RM_FILTER_TRIGGER FilterTrigger; // Filter trigger
|
|
DWORD cbNextOffset; // Bytes to next structure
|
|
union
|
|
{
|
|
LPWSTR strFilename; // When RmFilterTrigger == RmFilterTriggerFile,
|
|
// this contains the filename this filter applies to
|
|
RM_UNIQUE_PROCESS Process; // When RmFilterTrigger == RmFilterTriggerProcess,
|
|
// this contains the process this filter applies to
|
|
LPWSTR strServiceShortName; // When RmFilterTrigger == RmFilterTriggerService,
|
|
// this contians the service name this filter applies to
|
|
};
|
|
} RM_FILTER_INFO, *PRM_FILTER_INFO;
|
|
|
|
typedef void (*RM_WRITE_STATUS_CALLBACK)( __in UINT nPercentComplete );
|
|
|
|
// Functions
|
|
|
|
// Function: RmStartSession
|
|
// Purpose: Begins a Restart Manager session as the Conductor
|
|
// Error Codes:
|
|
// ERROR_SEM_TIMEOUT
|
|
// Failed to obtain semaphore lock in allotted time.
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_WRITE_FAULT
|
|
// Read/write operation failed.
|
|
// ERROR_OUTOFMEMORY
|
|
// Could not allocate memory or instantiate class object.
|
|
DWORD WINAPI
|
|
RmStartSession(
|
|
__out DWORD *pSessionHandle,
|
|
__reserved DWORD dwSessionFlags,
|
|
__out_ecount(CCH_RM_SESSION_KEY+1) WCHAR strSessionKey[]);
|
|
|
|
// Function: RmJoinSession
|
|
// Purpose: Joins an existing Restart Manager session as a Subordinate
|
|
// Error Codes:
|
|
// ERROR_SEM_TIMEOUT
|
|
// Failed to obtain semaphore lock in allotted time.
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_WRITE_FAULT
|
|
// Read/write operation failed.
|
|
// ERROR_OUTOFMEMORY
|
|
// Could not allocate memory or instantiate class object.
|
|
DWORD WINAPI
|
|
RmJoinSession(
|
|
__out DWORD *pSessionHandle,
|
|
__in_ecount(CCH_RM_SESSION_KEY+1) const WCHAR strSessionKey[]);
|
|
|
|
// Function: RmEndSession
|
|
// Purpose: Terminates and cleans up an existing session.
|
|
// Error Codes:
|
|
// ERROR_SEM_TIMEOUT
|
|
// Failed to obtain semaphore lock in allotted time.
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_WRITE_FAULT
|
|
// Read/write operation failed.
|
|
// ERROR_OUTOFMEMORY
|
|
// Could not allocate memory or instantiate class object.
|
|
// ERROR_INVALID_HANDLE
|
|
// No session exists for the supplied handle.
|
|
DWORD WINAPI
|
|
RmEndSession( __in DWORD dwSessionHandle );
|
|
|
|
// Function: RmRegisterResources
|
|
// Purpose: Called if error is encountered. Installer
|
|
// must pass in all files to be updated
|
|
// that may prevent the install from completing. Processes
|
|
// passed in array are forced to stop/start. Services short
|
|
// names passed in array are stopped (along with dependencies
|
|
// and restarted.
|
|
// Error Codes:
|
|
// ERROR_SEM_TIMEOUT
|
|
// Failed to obtain semaphore lock in allotted time.
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_WRITE_FAULT
|
|
// Read/write operation failed.
|
|
// ERROR_OUTOFMEMORY
|
|
// Could not allocate memory or instantiate class object.
|
|
// ERROR_INVALID_HANDLE
|
|
// No session exists for the supplied handle.
|
|
DWORD WINAPI
|
|
RmRegisterResources(
|
|
__in DWORD dwSessionHandle,
|
|
__in UINT nFiles,
|
|
__in_ecount_opt(nFiles) LPCWSTR rgsFileNames[],
|
|
__in UINT nApplications,
|
|
__in_ecount_opt(nApplications) RM_UNIQUE_PROCESS rgApplications[],
|
|
__in UINT nServices,
|
|
__in_ecount_opt(nServices) LPCWSTR rgsServiceNames[]);
|
|
|
|
// Function: RmGetList
|
|
// Purpose: Gets the list of applications affected by registered
|
|
// resources and their current status.
|
|
// Returns: An array of RM_PROCESS_INFO structs containing a list of
|
|
// all applications affected by registered items, the number
|
|
// of structs needed to retreive all application information,
|
|
// the number of structs that were populated, and a series
|
|
// of flags describing why a reboot will be necessary.
|
|
// Error Codes:
|
|
// ERROR_MORE_DATA
|
|
// Buffer is not large enough for all information.
|
|
// ERROR_CANCELLED
|
|
// Operation was cancelled by user.
|
|
// ERROR_SEM_TIMEOUT
|
|
// Failed to obtain semaphore lock in allotted time.
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_WRITE_FAULT
|
|
// Read/write operation failed.
|
|
// ERROR_OUTOFMEMORY
|
|
// Could not allocate memory or instantiate class object.
|
|
// ERROR_INVALID_HANDLE
|
|
// No session exists for the supplied handle.
|
|
DWORD WINAPI
|
|
RmGetList(
|
|
__in DWORD dwSessionHandle,
|
|
__out UINT *pnProcInfoNeeded,
|
|
__inout UINT *pnProcInfo,
|
|
__inout_ecount_opt(*pnProcInfo) RM_PROCESS_INFO rgAffectedApps[],
|
|
__out LPDWORD lpdwRebootReasons );
|
|
|
|
// Function: RmShutdown
|
|
// Purpose: Initiates application shutdown sequence.
|
|
// Error Codes:
|
|
// ERROR_FAIL_NOACTION_REBOOT
|
|
// One or more of the affected applications requires a reboot
|
|
// to be shut down.
|
|
// ERROR_FAIL_SHUTDOWN
|
|
// There was an error shuting down some application(s).
|
|
// ERROR_CANCELLED
|
|
// Operation was cancelled by user.
|
|
// ERROR_SEM_TIMEOUT
|
|
// Failed to obtain semaphore lock in allotted time.
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_WRITE_FAULT
|
|
// Read/write operation failed.
|
|
// ERROR_OUTOFMEMORY
|
|
// Could not allocate memory or instantiate class object.
|
|
// ERROR_INVALID_HANDLE
|
|
// No session exists for the supplied handle.
|
|
DWORD WINAPI
|
|
RmShutdown(
|
|
__in DWORD dwSessionHandle,
|
|
__in ULONG lActionFlags,
|
|
__in_opt RM_WRITE_STATUS_CALLBACK fnStatus);
|
|
|
|
// Function: RmRestart
|
|
// Purpose: Applications automatically shutdown by RmShutdown()
|
|
// and are registered for restart or are services are restarted.
|
|
// Error Codes:
|
|
// ERROR_FAIL_NOACTION_REBOOT
|
|
// One or more of the affected applications requires a reboot
|
|
// to be shut down.
|
|
// ERROR_FAIL_SHUTDOWN
|
|
// There was an error shuting down some application(s).
|
|
// ERROR_CANCELLED
|
|
// Operation was cancelled by user.
|
|
// ERROR_SEM_TIMEOUT
|
|
// Failed to obtain semaphore lock in allotted time.
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_WRITE_FAULT
|
|
// Read/write operation failed.
|
|
// ERROR_OUTOFMEMORY
|
|
// Could not allocate memory or instantiate class object.
|
|
// ERROR_INVALID_HANDLE
|
|
// No session exists for the supplied handle.
|
|
DWORD WINAPI
|
|
RmRestart(
|
|
__in DWORD dwSessionHandle,
|
|
__reserved DWORD dwRestartFlags,
|
|
__in_opt RM_WRITE_STATUS_CALLBACK fnStatus);
|
|
|
|
// Function: RmCancelCurrentTask()
|
|
// Purpose: Notifies Restart Manager to cancel the task it is performing
|
|
// as soon as possible.
|
|
// Error Codes:
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_OUTOFMEMORY
|
|
// Could not allocate memory or instantiate class object.
|
|
// ERROR_INVALID_HANDLE
|
|
// No session exists for the supplied handle.
|
|
DWORD WINAPI
|
|
RmCancelCurrentTask(
|
|
__in DWORD dwSessionHandle);
|
|
|
|
// Function: RmAddFilter()
|
|
// Purpose: Adds a filter for process module (ie. executable name), process ID,
|
|
// or service short name to prevent Restart Manager from performing
|
|
// the specified action on the process(es) or service noted.
|
|
// Error Codes:
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_INVALID_HANDLE
|
|
// No session exists for the supplied handle.
|
|
DWORD WINAPI
|
|
RmAddFilter(
|
|
__in DWORD dwSessionHandle,
|
|
__in_opt LPCWSTR strModuleName,
|
|
__in_opt RM_UNIQUE_PROCESS *pProcess,
|
|
__in_opt LPCWSTR strServiceShortName,
|
|
__in RM_FILTER_ACTION FilterAction );
|
|
|
|
// Function: RmRemoveFilter()
|
|
// Purpose: Removes a previously added filter for process module
|
|
// (ie. executable name), process ID, or service short name
|
|
// enabling all Restart Manager actions on the process(es)
|
|
// or service noted.
|
|
// Error Codes:
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_INVALID_HANDLE
|
|
// No session exists for the supplied handle.
|
|
DWORD WINAPI
|
|
RmRemoveFilter(
|
|
__in DWORD dwSessionHandle,
|
|
__in_opt LPCWSTR strModuleName,
|
|
__in_opt RM_UNIQUE_PROCESS *pProcess,
|
|
__in_opt LPCWSTR strServiceShortName );
|
|
|
|
// Function: RmGetFilterList()
|
|
// Purpose: Writes a set of currenly applied filters
|
|
// to a caller-allocated buffer.
|
|
// Error Codes:
|
|
// ERROR_BAD_ARGUMENTS
|
|
// An invalid argument was supplied to the function.
|
|
// ERROR_INVALID_HANDLE
|
|
// No session exists for the supplied handle.
|
|
DWORD WINAPI
|
|
RmGetFilterList(
|
|
__in DWORD dwSessionHandle,
|
|
__out_bcount_opt(cbFilterBuf) PBYTE pbFilterBuf,
|
|
__in DWORD cbFilterBuf,
|
|
__out LPDWORD cbFilterBufNeeded );
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif // __cplusplus
|
|
|