/******************************************************************** RmuRegisterResources - Registers resources for the Restart Manager. This should be called rarely because it is expensive to run. Call functions like RmuAddFile for multiple resources then commit them as a batch of updates to RmuRegisterResources. Duplicate resources appear to be handled by Restart Manager. Only one WM_QUERYENDSESSION is being sent for each top-level window. ********************************************************************/ extern "C" HRESULT DAPI RmuRegisterResources( __in PRMU_SESSION pSession ) { HRESULT hr = S_OK; DWORD er = ERROR_SUCCESS; HMODULE hModule = NULL; PFNRMREGISTERRESOURCES pfnRmRegisterResources = NULL; AssertSz(vcRmuInitialized, "Restart Manager was not properly initialized."); ::EnterCriticalSection(&pSession->cs); er = vpfnRmRegisterResources( pSession->dwSessionHandle, pSession->cFilenames, pSession->rgsczFilenames, pSession->cApplications, pSession->rgApplications, pSession->cServiceNames, pSession->rgsczServiceNames ); ExitOnWin32Error(er, hr, "Failed to register the resources with the Restart Manager session."); // Empty the arrays if registered in case additional resources are added later. ReleaseNullStrArray(pSession->rgsczFilenames, pSession->cFilenames); ReleaseNullApplicationArray(pSession->rgApplications, pSession->cApplications); ReleaseNullStrArray(pSession->rgsczServiceNames, pSession->cServiceNames); LExit: ::LeaveCriticalSection(&pSession->cs); return hr; }
/******************************************************************** RmuEndSession - Ends the session. If the session was joined by RmuJoinSession, any remaining resources are registered before the session is ended (left). ********************************************************************/ extern "C" HRESULT DAPI RmuEndSession( __in PRMU_SESSION pSession ) { HRESULT hr = S_OK; DWORD er = ERROR_SUCCESS; AssertSz(vcRmuInitialized, "Restart Manager was not properly initialized."); // Make sure all resources are registered if we joined the session. if (!pSession->fStartedSessionHandle) { hr = RmuRegisterResources(pSession); ExitOnFailure(hr, "Failed to register remaining resources."); } er = vpfnRmEndSession(pSession->dwSessionHandle); ExitOnWin32Error(er, hr, "Failed to end the Restart Manager session."); LExit: if (pSession->fInitialized) { ::DeleteCriticalSection(&pSession->cs); } ReleaseNullStrArray(pSession->rgsczFilenames, pSession->cFilenames); ReleaseNullApplicationArray(pSession->rgApplications, pSession->cApplications); ReleaseNullStrArray(pSession->rgsczServiceNames, pSession->cServiceNames); ReleaseNullMem(pSession); RmuUninitialize(); return hr; }