| // Licensed under the Apache License, Version 2.0 |
| // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
| // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option. |
| // All files in the project carrying such notice may not be copied, modified, or distributed |
| // except according to those terms. |
| //! RestartManager include file |
| use shared::minwindef::{BOOL, DWORD, FILETIME, LPDWORD, PBYTE, UINT, ULONG}; |
| use um::winnt::{LPCWSTR, LPWSTR, WCHAR}; |
| pub const RM_SESSION_KEY_LEN: usize = 16; // mem::size_of::<GUID>() |
| pub const CCH_RM_SESSION_KEY: usize = RM_SESSION_KEY_LEN * 2; |
| pub const CCH_RM_MAX_APP_NAME: usize = 255; |
| pub const CCH_RM_MAX_SVC_NAME: usize = 63; |
| pub const RM_INVALID_TS_SESSION: DWORD = -1i32 as u32; |
| pub const RM_INVALID_PROCESS: DWORD = -1i32 as u32; |
| ENUM!{enum RM_APP_TYPE { |
| RmUnknownApp = 0, |
| RmMainWindow = 1, |
| RmOtherWindow = 2, |
| RmService = 3, |
| RmExplorer = 4, |
| RmConsole = 5, |
| RmCritical = 1000, |
| }} |
| ENUM!{enum RM_SHUTDOWN_TYPE { |
| RmForceShutdown = 0x1, |
| RmShutdownOnlyRegistered = 0x10, |
| }} |
| ENUM!{enum RM_APP_STATUS { |
| RmStatusUnknown = 0x0, |
| RmStatusRunning = 0x1, |
| RmStatusStopped = 0x2, |
| RmStatusStoppedOther = 0x4, |
| RmStatusRestarted = 0x8, |
| RmStatusErrorOnStop = 0x10, |
| RmStatusErrorOnRestart = 0x20, |
| RmStatusShutdownMasked = 0x40, |
| RmStatusRestartMasked = 0x80, |
| }} |
| ENUM!{enum RM_REBOOT_REASON { |
| RmRebootReasonNone = 0x0, |
| RmRebootReasonPermissionDenied = 0x1, |
| RmRebootReasonSessionMismatch = 0x2, |
| RmRebootReasonCriticalProcess = 0x4, |
| RmRebootReasonCriticalService = 0x8, |
| RmRebootReasonDetectedSelf = 0x10, |
| }} |
| STRUCT!{struct RM_UNIQUE_PROCESS { |
| dwProcessId: DWORD, |
| ProcessStartTime: FILETIME, |
| }} |
| pub type PRM_UNIQUE_PROCESS = *mut RM_UNIQUE_PROCESS; |
| STRUCT!{struct RM_PROCESS_INFO { |
| Process: RM_UNIQUE_PROCESS, |
| strAppName: [WCHAR; CCH_RM_MAX_APP_NAME + 1], |
| strServiceShortName: [WCHAR; CCH_RM_MAX_SVC_NAME + 1], |
| ApplicationType: RM_APP_TYPE, |
| AppStatus: ULONG, |
| TSSessionId: DWORD, |
| bRestartable: BOOL, |
| }} |
| pub type PRM_PROCESS_INFO = *mut RM_PROCESS_INFO; |
| ENUM!{enum RM_FILTER_TRIGGER { |
| RmFilterTriggerInvalid = 0, |
| RmFilterTriggerFile, |
| RmFilterTriggerProcess, |
| RmFilterTriggerService, |
| }} |
| ENUM!{enum RM_FILTER_ACTION { |
| RmInvalidFilterAction = 0, |
| RmNoRestart = 1, |
| RmNoShutdown = 2, |
| }} |
| UNION!{union RM_FILTER_INFO_u { |
| [u32; 3] [u64; 2], |
| strFilename strFilename_mut: LPWSTR, |
| Process Process_mut: RM_UNIQUE_PROCESS, |
| strServiceShortName strServiceShortName_mut: LPWSTR, |
| }} |
| STRUCT!{struct RM_FILTER_INFO { |
| FilterAction: RM_FILTER_ACTION, |
| FilterTrigger: RM_FILTER_TRIGGER, |
| cbNextOffset: DWORD, |
| u: RM_FILTER_INFO_u, |
| }} |
| pub type PRM_FILTER_INFO = *mut RM_FILTER_INFO; |
| FN!{cdecl RM_WRITE_STATUS_CALLBACK( |
| nPercentComplete: u32, |
| ) -> ()} |
| extern "system" { |
| pub fn RmStartSession( |
| pSessionHandle: *mut DWORD, |
| dwSessionFlags: DWORD, |
| strSessionKey: *mut WCHAR, |
| ) -> DWORD; |
| pub fn RmJoinSession( |
| pSessionHandle: *mut DWORD, |
| strSessionKey: *const WCHAR, |
| ) -> DWORD; |
| pub fn RmEndSession( |
| dwSessionHandle: DWORD, |
| ) -> DWORD; |
| pub fn RmRegisterResources( |
| dwSessionHandle: DWORD, |
| nFiles: UINT, |
| rgsFileNames: *mut LPCWSTR, |
| nApplications: UINT, |
| rgApplications: *mut RM_UNIQUE_PROCESS, |
| nServices: UINT, |
| rgsServiceNames: *mut LPCWSTR, |
| ) -> DWORD; |
| pub fn RmGetList( |
| dwSessionHandle: DWORD, |
| pnProcInfoNeeded: *mut UINT, |
| pnProcInfo: *mut UINT, |
| rgAffectedApps: *mut RM_PROCESS_INFO, |
| lpdwRebootReasons: LPDWORD, |
| ) -> DWORD; |
| pub fn RmShutdown( |
| dwSessionHandle: DWORD, |
| lActionFlags: ULONG, |
| fnStatus: RM_WRITE_STATUS_CALLBACK, |
| ) -> DWORD; |
| pub fn RmRestart( |
| dwSessionHandle: DWORD, |
| dwRestartFlags: DWORD, |
| fnStatus: RM_WRITE_STATUS_CALLBACK, |
| ) -> DWORD; |
| pub fn RmCancelCurrentTask( |
| dwSessionHandle: DWORD, |
| ) -> DWORD; |
| pub fn RmAddFilter( |
| dwSessionHandle: DWORD, |
| strModuleName: LPCWSTR, |
| pProcess: *mut RM_UNIQUE_PROCESS, |
| strServiceShortName: LPCWSTR, |
| FilterAction: RM_FILTER_ACTION, |
| ) -> DWORD; |
| pub fn RmRemoveFilter( |
| dwSessionHandle: DWORD, |
| strModuleName: LPCWSTR, |
| pProcess: *mut RM_UNIQUE_PROCESS, |
| strServiceShortName: LPCWSTR, |
| ) -> DWORD; |
| pub fn RmGetFilterList( |
| dwSessionHandle: DWORD, |
| pbFilterBuf: PBYTE, |
| cbFilterBuf: DWORD, |
| cbFilterBufNeeded: LPDWORD, |
| ) -> DWORD; |
| } |