// Query all the shadow copies in the given set void VSSClientGeneric::QuerySnapshotSet(GUID snapshotSetID) { if (!(p_CreateVssBackupComponents && p_VssFreeSnapshotProperties)) { Jmsg(m_jcr, M_FATAL, 0, "CreateVssBackupComponents or VssFreeSnapshotProperties API is NULL.\n"); errno = ENOSYS; return; } memset(m_szShadowCopyName,0,sizeof (m_szShadowCopyName)); if (snapshotSetID == GUID_NULL || m_pVssObject == NULL) { Jmsg(m_jcr, M_FATAL, 0, "snapshotSetID == NULL or VssObject is NULL.\n"); errno = ENOSYS; return; } IVssBackupComponents* pVssObj = (IVssBackupComponents*) m_pVssObject; // Get list all shadow copies. CComPtr<IVssEnumObject> pIEnumSnapshots; HRESULT hr = pVssObj->Query( GUID_NULL, VSS_OBJECT_NONE, VSS_OBJECT_SNAPSHOT, (IVssEnumObject**)(&pIEnumSnapshots) ); // If there are no shadow copies, just return if (FAILED(hr)) { Jmsg(m_jcr, M_FATAL, 0, "No Volume Shadow copies made.\n"); errno = b_errno_win32; return; } // Enumerate all shadow copies. VSS_OBJECT_PROP Prop; VSS_SNAPSHOT_PROP& Snap = Prop.Obj.Snap; while (true) { // Get the next element ULONG ulFetched; hr = (pIEnumSnapshots.p)->Next( 1, &Prop, &ulFetched ); // We reached the end of list if (ulFetched == 0) break; // Print the shadow copy (if not filtered out) if (Snap.m_SnapshotSetId == snapshotSetID) { for (int ch='A'-'A';ch<='Z'-'A';ch++) { if (wcscmp(Snap.m_pwszOriginalVolumeName, m_wszUniqueVolumeName[ch]) == 0) { wcsncpy(m_szShadowCopyName[ch],Snap.m_pwszSnapshotDeviceObject, MAX_PATH-1); break; } } } p_VssFreeSnapshotProperties(&Snap); } errno = 0; }