xpmgr/BuildTools/Include/RestartManager.h

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