[OT] Where to ask questions about Volume Shadow Copy Service?

Hi,

i am (unsuccessfully) fighting the Volume Shadow Copy Service API (for XP32 and Vista32), which seems to be one hard beast, but i couldnt find any community or newsgroup to ask particular questions about a a error code i get. There are lots of NGs for nearly anything regarding .NET, Azure and all that stuff, but nothing related to a question like problems with the VSS API. I dont know where to as my question. Anybody knows a good place forum/community/newsgroup from MS to ask that? Just for the case someone wants to know what fails:

I get a:

VSS_E_UNSUPPORTED_CONTEXT
0x8004231B
The shadow copy provider does not support the specified shadow copy type.

for calling the IVssBackupComponents ->StartSnapshotSet();

and i dont know why i get this. The calling order of the functions is like that and all finish S_OK until that function is executed:

  1. CreateVssBackupComponentsInternal
  2. InitializeForBackup
  3. GatherWriterMetadata
  4. IVSSAsync->Wait(Infinite)
  5. StartSnapshotSet <-------- fails here VSS_E_UNSUPPORTED_CONTEXT

If someone knows a solution for this it would be great or a place where i can ask that,…

best

K.

It has been solved. I was referencing the wrong function in the vtable of the com object, i simply forgot to implement a function on the interface and this made the complete offset wrong to the function pointer. I have to tell here that i imported the com interface in c# by hand, because i am using it from .NET runtime and there is no IDL file or com interface that can be queried with something like OLEViewer. The information i got depends on the header files of the windows sdk and by importing the interface in c# i simply forgot a single function and this made fail everthing! If someone is interested in what the interface in C# looks like here its is. Note that not all parameters have been implemented, only the ones i need, but this does not affect the interface, nor the functions, as long as the vtable order ist correct and the parameters used on the called functions have been translated and passed porperly:

[Flags]
public enum VSS_SNAPSHOT_COMPATIBILITY : long
{
VSS_SC_DISABLE_DEFRAG = 0x1,
VSS_SC_DISABLE_CONTENTINDEX = 0x2,
}

public enum IVssAsyncWait : uint
{
Infinite = 0xffffffff,
}

public enum VSS_OBJECT_TYPE : uint
{
VSS_OBJECT_UNKNOWN = 0,
VSS_OBJECT_NONE = (VSS_OBJECT_UNKNOWN + 1),
VSS_OBJECT_SNAPSHOT_SET = (VSS_OBJECT_NONE + 1),
VSS_OBJECT_SNAPSHOT = (VSS_OBJECT_SNAPSHOT_SET + 1),
VSS_OBJECT_PROVIDER = (VSS_OBJECT_SNAPSHOT + 1),
VSS_OBJECT_TYPE_COUNT = (VSS_OBJECT_PROVIDER + 1)
}

[Flags]
public enum VSS_VOLUME_SNAPSHOT_ATTRIBUTES : int
{
VSS_VOLSNAP_ATTR_PERSISTENT = 0x1,
VSS_VOLSNAP_ATTR_NO_AUTORECOVERY = 0x2,
VSS_VOLSNAP_ATTR_CLIENT_ACCESSIBLE = 0x4,
VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE = 0x8,
VSS_VOLSNAP_ATTR_NO_WRITERS = 0x10,
VSS_VOLSNAP_ATTR_TRANSPORTABLE = 0x20,
VSS_VOLSNAP_ATTR_NOT_SURFACED = 0x40,
VSS_VOLSNAP_ATTR_NOT_TRANSACTED = 0x80,
VSS_VOLSNAP_ATTR_HARDWARE_ASSISTED = 0x10000,
VSS_VOLSNAP_ATTR_DIFFERENTIAL = 0x20000,
VSS_VOLSNAP_ATTR_PLEX = 0x40000,
VSS_VOLSNAP_ATTR_IMPORTED = 0x80000,
VSS_VOLSNAP_ATTR_EXPOSED_LOCALLY = 0x100000,
VSS_VOLSNAP_ATTR_EXPOSED_REMOTELY = 0x200000,
VSS_VOLSNAP_ATTR_AUTORECOVER = 0x400000,
VSS_VOLSNAP_ATTR_ROLLBACK_RECOVERY = 0x800000,
VSS_VOLSNAP_ATTR_DELAYED_POSTSNAPSHOT = 0x1000000
}

public enum VSS_SNAPSHOT_STATE : uint
{
VSS_SS_UNKNOWN = 0,
VSS_SS_PREPARING = (VSS_SS_UNKNOWN + 1),
VSS_SS_PROCESSING_PREPARE = (VSS_SS_PREPARING + 1),
VSS_SS_PREPARED = (VSS_SS_PROCESSING_PREPARE + 1),
VSS_SS_PROCESSING_PRECOMMIT = (VSS_SS_PREPARED + 1),
VSS_SS_PRECOMMITTED = (VSS_SS_PROCESSING_PRECOMMIT + 1),
VSS_SS_PROCESSING_COMMIT = (VSS_SS_PRECOMMITTED + 1),
VSS_SS_COMMITTED = (VSS_SS_PROCESSING_COMMIT + 1),
VSS_SS_PROCESSING_POSTCOMMIT = (VSS_SS_COMMITTED + 1),
VSS_SS_PROCESSING_PREFINALCOMMIT = (VSS_SS_PROCESSING_POSTCOMMIT + 1),
VSS_SS_PREFINALCOMMITTED = (VSS_SS_PROCESSING_PREFINALCOMMIT + 1),
VSS_SS_PROCESSING_POSTFINALCOMMIT = (VSS_SS_PREFINALCOMMITTED + 1),
VSS_SS_CREATED = (VSS_SS_PROCESSING_POSTFINALCOMMIT + 1),
VSS_SS_ABORTED = (VSS_SS_CREATED + 1),
VSS_SS_DELETED = (VSS_SS_ABORTED + 1),
VSS_SS_POSTCOMMITTED = (VSS_SS_DELETED + 1),
VSS_SS_COUNT = (VSS_SS_POSTCOMMITTED + 1)
}

public enum VSS_BACKUP_TYPE : uint
{
VSS_BT_UNDEFINED = 0,
VSS_BT_FULL = (VSS_BT_UNDEFINED + 1),
VSS_BT_INCREMENTAL = (VSS_BT_FULL + 1),
VSS_BT_DIFFERENTIAL = (VSS_BT_INCREMENTAL + 1),
VSS_BT_LOG = (VSS_BT_DIFFERENTIAL + 1),
VSS_BT_COPY = (VSS_BT_LOG + 1),
VSS_BT_OTHER = (VSS_BT_COPY + 1)
}

[StructLayout(
LayoutKind.Sequential,
CharSet = CharSet.Unicode)]
public struct VSS_SNAPSHOT_PROP
{
public Guid SnapshotId;
public Guid SnapshotSetId;
public int SnapshotsCount;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwszSnapshotDeviceObject;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwszOriginalVolumeName;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwszOriginatingMachine;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwszServiceMachine;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwszExposedName;
[MarshalAs(UnmanagedType.LPWStr)]
public string pwszExposedPath;
public Guid ProviderId;
public VSS_VOLUME_SNAPSHOT_ATTRIBUTES SnapshotAttributes;
public long CreationTimestamp;
public int SnapshotState;
}

[ComImport()]
[Guid(“507C37B4-CF5B-4e95-B0AF-14EB9767467E”)]
[InterfaceType(
ComInterfaceType.InterfaceIsIUnknown)]
public interface IVssAsync
{
HRESULT Cancel();
HRESULT Wait(
[In] IVssAsyncWait dwMilliseconds);
HRESULT QueryStatus(
[Out] out HRESULT pHrResult,
[In, Out] ref int pReserved);
}

[ComImport()]
[Guid(“665c1d5f-c218-414d-a05d-7fef5f9d5c86”)]
[InterfaceType(
ComInterfaceType.InterfaceIsIUnknown)]
public interface IVssBackupComponents
{
HRESULT GetWriterComponentsCount();
HRESULT GetWriterComponents();
[DefaultValue(null)]
HRESULT InitializeForBackup(
[MarshalAs(UnmanagedType.BStr)]
[In] string bstrXML);
HRESULT SetBackupState(
[MarshalAs(UnmanagedType.Bool)]
[In] bool bSelectComponents,
[MarshalAs(UnmanagedType.Bool)]
[In] bool bBackupBootableSystemState,
[In] VSS_BACKUP_TYPE backupType,
[MarshalAs(UnmanagedType.Bool)]
[In] bool bPartialFileSupport);
HRESULT InitializeForRestore();
HRESULT SetRestoreState();
//default is 0xffffffff
HRESULT GatherWriterMetadata(
[Out] out IVssAsync ppAsync);
HRESULT GetWriterMetadataCount();
HRESULT GetWriterMetadata();
HRESULT FreeWriterMetadata();
HRESULT AddComponent();
HRESULT PrepareForBackup(
[Out] out IVssAsync ppAsync);
HRESULT AbortBackup();
HRESULT GatherWriterStatus();
HRESULT GetWriterStatusCount();
HRESULT FreeWriterStatus();
HRESULT GetWriterStatus();
HRESULT SetBackupSucceeded();
HRESULT SetBackupOptions();
HRESULT SetSelectedForRestore();
HRESULT SetRestoreOptions();
HRESULT SetAdditionalRestores();
HRESULT SetPreviousBackupStamp();
HRESULT SaveAsXML();
HRESULT BackupComplete();
HRESULT AddAlternativeLocationMapping();
HRESULT AddRestoreSubcomponent();
HRESULT SetFileRestoreStatus();
HRESULT AddNewTarget();
HRESULT SetRangesFilePath();
HRESULT PreRestore();
HRESULT PostRestore();
HRESULT SetContext();
HRESULT StartSnapshotSet(
[Out] out Guid pSnapshotSetId);
HRESULT AddToSnapshotSet(
[MarshalAs(UnmanagedType.BStr)]
[In] string pwszVolumeName,
[In] Guid ProviderId,
[Out] out Guid pidSnapshot);
HRESULT DoSnapshotSet(
[Out] out IVssAsync ppAsync);
HRESULT DeleteSnapshots(
[In] Guid SourceObjectId,
[In] VSS_OBJECT_TYPE eSourceObjectType,
[MarshalAs(UnmanagedType.Bool)]
[In] bool bForceDelete,
[Out] out long plDeletedSnapshots,
[Out] out Guid pNondeletedSnapshotID);
HRESULT ImportSnapshots();
HRESULT BreakSnapshotSet();
HRESULT GetSnapshotProperties(
[In] Guid SnapshotId,
[In,Out] IntPtr pProp);
HRESULT Query();
HRESULT IsVolumeSupported(
[In] Guid ProviderId,
[MarshalAs(UnmanagedType.BStr)]
[In] string pwszVolumeName,
[MarshalAs(UnmanagedType.Bool)]
[Out] out bool pbSupportedByThisProvider);
HRESULT DisableWriterClasses();
HRESULT EnableWriterClasses();
HRESULT DisableWriterInstances();
HRESULT ExposeSnapshot();
HRESULT RevertToSnapshot();
HRESULT QueryRevertStatus();
}