BOOL VSSClientGeneric::CloseBackup() { BOOL bRet = FALSE; if (!m_pVssObject) errno = ENOSYS; else { IVssBackupComponents* pVss = (IVssBackupComponents*) m_pVssObject; CComPtr<IVssAsync> pAsync; SetVSSPathConvert(NULL, NULL); m_bBackupIsInitialized = false; if (SUCCEEDED(pVss->BackupComplete(&pAsync.p))) { // Waits for the async operation to finish and checks the result WaitAndCheckForAsyncOperation(pAsync.p); bRet = TRUE; } else { errno = b_errno_win32; pVss->AbortBackup(); } /* get latest info about writer status */ CheckWriterStatus(); if (m_uidCurrentSnapshotSet != GUID_NULL) { VSS_ID idNonDeletedSnapshotID = GUID_NULL; LONG lSnapshots; pVss->DeleteSnapshots( m_uidCurrentSnapshotSet, VSS_OBJECT_SNAPSHOT_SET, FALSE, &lSnapshots, &idNonDeletedSnapshotID); m_uidCurrentSnapshotSet = GUID_NULL; } pVss->Release(); m_pVssObject = NULL; } // Call CoUninitialize if the CoInitialize was performed sucesfully if (m_bCoInitializeCalled) { CoUninitialize(); m_bCoInitializeCalled = false; } return bRet; }
bool VSSClientGeneric::CloseBackup() { bool bRet = false; HRESULT hr; BSTR xml; IVssBackupComponents* pVssObj = (IVssBackupComponents*)m_pVssObject; if (!m_pVssObject) { Jmsg(m_jcr, M_FATAL, 0, "VssOject is NULL.\n"); errno = ENOSYS; return bRet; } CComPtr<IVssAsync> pAsync; SetVSSPathConvert(NULL, NULL); m_bBackupIsInitialized = false; hr = pVssObj->BackupComplete(&pAsync.p); if (SUCCEEDED(hr)) { // Waits for the async operation to finish and checks the result WaitAndCheckForAsyncOperation(pAsync.p); bRet = true; } else { JmsgVssApiStatus(m_jcr, M_ERROR, hr, "BackupComplete"); errno = b_errno_win32; pVssObj->AbortBackup(); } /* get latest info about writer status */ CheckWriterStatus(); hr = pVssObj->SaveAsXML(&xml); if (SUCCEEDED(hr)) { m_metadata = xml; } else { m_metadata = NULL; } /* FIXME?: The docs http://msdn.microsoft.com/en-us/library/aa384582%28v=VS.85%29.aspx say this isn't required... */ if (m_uidCurrentSnapshotSet != GUID_NULL) { VSS_ID idNonDeletedSnapshotID = GUID_NULL; LONG lSnapshots; pVssObj->DeleteSnapshots( m_uidCurrentSnapshotSet, VSS_OBJECT_SNAPSHOT_SET, false, &lSnapshots, &idNonDeletedSnapshotID); m_uidCurrentSnapshotSet = GUID_NULL; } if (m_bWriterStatusCurrent) { m_bWriterStatusCurrent = false; pVssObj->FreeWriterStatus(); } pVssObj->Release(); m_pVssObject = NULL; // Call CoUninitialize if the CoInitialize was performed sucesfully if (m_bCoInitializeCalled) { CoUninitialize(); m_bCoInitializeCalled = false; } return bRet; }
// Initialize the COM infrastructure and the internal pointers bool VSSClientGeneric::Initialize(DWORD dwContext, bool bDuringRestore) { CComPtr<IVssAsync> pAsync1; VSS_BACKUP_TYPE backup_type; IVssBackupComponents* pVssObj = (IVssBackupComponents*)m_pVssObject; if (!(p_CreateVssBackupComponents && p_VssFreeSnapshotProperties)) { Dmsg2(0, "VSSClientGeneric::Initialize: p_CreateVssBackupComponents=0x%08X, p_VssFreeSnapshotProperties=0x%08X\n", p_CreateVssBackupComponents, p_VssFreeSnapshotProperties); Jmsg(m_jcr, M_FATAL, 0, "Entry point CreateVssBackupComponents or VssFreeSnapshotProperties missing.\n"); return false; } HRESULT hr; // Initialize COM if (!m_bCoInitializeCalled) { hr = CoInitialize(NULL); if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: CoInitialize returned 0x%08X\n", hr); JmsgVssApiStatus(m_jcr, M_FATAL, hr, "CoInitialize"); errno = b_errno_win32; return false; } m_bCoInitializeCalled = true; } // Initialize COM security if (!m_bCoInitializeSecurityCalled) { hr = CoInitializeSecurity( NULL, // Allow *all* VSS writers to communicate back! -1, // Default COM authentication service NULL, // Default COM authorization service NULL, // reserved parameter RPC_C_AUTHN_LEVEL_PKT_PRIVACY, // Strongest COM authentication level RPC_C_IMP_LEVEL_IDENTIFY, // Minimal impersonation abilities NULL, // Default COM authentication settings EOAC_NONE, // No special options NULL // Reserved parameter ); if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: CoInitializeSecurity returned 0x%08X\n", hr); JmsgVssApiStatus(m_jcr, M_FATAL, hr, "CoInitializeSecurity"); errno = b_errno_win32; return false; } m_bCoInitializeSecurityCalled = true; } // Release the any old IVssBackupComponents interface if (pVssObj) { pVssObj->Release(); m_pVssObject = NULL; } // Create new internal backup components object hr = p_CreateVssBackupComponents((IVssBackupComponents**)&m_pVssObject); if (FAILED(hr)) { berrno be; Dmsg2(0, "VSSClientGeneric::Initialize: CreateVssBackupComponents returned 0x%08X. ERR=%s\n", hr, be.bstrerror(b_errno_win32)); JmsgVssApiStatus(m_jcr, M_FATAL, hr, "CreateVssBackupComponents"); errno = b_errno_win32; return false; } /* Define shorthand VssObject with time */ pVssObj = (IVssBackupComponents*)m_pVssObject; if (!bDuringRestore) { #if defined(B_VSS_W2K3) || defined(B_VSS_VISTA) if (dwContext != VSS_CTX_BACKUP) { hr = pVssObj->SetContext(dwContext); if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: IVssBackupComponents->SetContext returned 0x%08X\n", hr); JmsgVssApiStatus(m_jcr, M_FATAL, hr, "SetContext"); errno = b_errno_win32; return false; } } #endif // 1. InitializeForBackup hr = pVssObj->InitializeForBackup(); if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: IVssBackupComponents->InitializeForBackup returned 0x%08X\n", hr); JmsgVssApiStatus(m_jcr, M_FATAL, hr, "InitializeForBackup"); errno = b_errno_win32; return false; } // 2. SetBackupState switch (m_jcr->getJobLevel()) { case L_FULL: backup_type = VSS_BT_FULL; break; case L_DIFFERENTIAL: backup_type = VSS_BT_DIFFERENTIAL; break; case L_INCREMENTAL: backup_type = VSS_BT_INCREMENTAL; break; default: Dmsg1(0, "VSSClientGeneric::Initialize: unknown backup level %d\n", m_jcr->getJobLevel()); backup_type = VSS_BT_FULL; break; } hr = pVssObj->SetBackupState(true, true, backup_type, false); /* FIXME: need to support partial files - make last parameter true when done */ if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: IVssBackupComponents->SetBackupState returned 0x%08X\n", hr); JmsgVssApiStatus(m_jcr, M_FATAL, hr, "SetBackupState"); errno = b_errno_win32; return false; } // 3. GatherWriterMetaData hr = pVssObj->GatherWriterMetadata(&pAsync1.p); if (FAILED(hr)) { Dmsg1(0, "VSSClientGeneric::Initialize: IVssBackupComponents->GatherWriterMetadata returned 0x%08X\n", hr); JmsgVssApiStatus(m_jcr, M_FATAL, hr, "GatherWriterMetadata"); errno = b_errno_win32; return false; } // Waits for the async operation to finish and checks the result if (!WaitAndCheckForAsyncOperation(pAsync1.p)) { /* Error message already printed */ errno = b_errno_win32; return false; } } // We are during restore now? m_bDuringRestore = bDuringRestore; // Keep the context m_dwContext = dwContext; return true; }