//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 2000 // // File: vdssp.idl // // Abstract: // declarations of interfaces and types implemented by software provider // and also exposed by the service. // //---------------------------------------------------------------------------- interface IVdsSwProvider; interface IVdsPack; interface IVdsPack2; interface IVdsDisk; interface IVdsDisk2; interface IVdsDisk3; interface IVdsDiskOnline; interface IVdsAdvancedDisk; interface IVdsAdvancedDisk2; interface IVdsCreatePartitionEx; interface IVdsRemovable; interface IVdsVolume; interface IVdsVolume2; interface IVdsVolumeOnline; interface IVdsVolumePlex; // // Pack Status // typedef enum _VDS_PACK_STATUS { VDS_PS_UNKNOWN = STATUS_UNKNOWN, VDS_PS_ONLINE = STATUS_ONLINE, VDS_PS_OFFLINE = STATUS_OFFLINE } VDS_PACK_STATUS; // // Pack Flags // typedef enum _VDS_PACK_FLAG { VDS_PKF_FOREIGN = 0x1, // Set on all packs that are not the primary\online pack. VDS_PKF_NOQUORUM = 0x2, // This flag was not used on W2K3 and will not be used on LH either. VDS_PKF_POLICY = 0x4, // Will be set on personal SKU for the dynamic provider - pack is offline // because dyanmic disks are not supported on the OS SKU. VDS_PKF_CORRUPTED = 0x8, // This flag indicates the disk contained in the pack has a corrupted // database. VDS_PKF_ONLINE_ERROR = 0x10 // This flag indicates the pack is offline because error happened when // trying to online it. The config will be offline if 1) we do not have quorum, // or, 2) there were online errors. For both of these cases, we will set the // VDS_PKF_ONLINE_ERROR flag on the pack. } VDS_PACK_FLAG; // // Disk Status // typedef enum _VDS_DISK_STATUS { VDS_DS_UNKNOWN = STATUS_UNKNOWN, VDS_DS_ONLINE = STATUS_ONLINE, VDS_DS_NOT_READY = STATUS_NOT_READY, // One example is with ACPI Power Management. You can ask a disk to // hibernate (spin down). VDS_DS_NO_MEDIA = STATUS_NO_MEDIA, // This flag is for removable media, CDROM. VDS_DS_FAILED = STATUS_FAILED, VDS_DS_MISSING = STATUS_MISSING, VDS_DS_OFFLINE = STATUS_OFFLINE // Added to W2K8 } VDS_DISK_STATUS; // // Partition Styles // typedef enum _VDS_PARTITION_STYLE { VDS_PST_UNKNOWN = 0, VDS_PST_MBR = 1, VDS_PST_GPT = 2 } VDS_PARTITION_STYLE; // // Disk Flags // typedef enum _VDS_DISK_FLAG { VDS_DF_AUDIO_CD = 0x1, VDS_DF_HOTSPARE = 0x2, VDS_DF_RESERVE_CAPABLE = 0x4, VDS_DF_MASKED = 0x8, VDS_DF_STYLE_CONVERTIBLE = 0x10, VDS_DF_CLUSTERED = 0x20, VDS_DF_READ_ONLY = 0x40, // Added to Vista SP1, Windows Server 2008 VDS_DF_SYSTEM_DISK = 0x80, // Added to Vista SP1, Windows Server 2008 VDS_DF_BOOT_DISK = 0x100, // Added to Vista SP1, Windows Server 2008 VDS_DF_PAGEFILE_DISK = 0x200, // Added to Vista SP1, Windows Server 2008 VDS_DF_HIBERNATIONFILE_DISK = 0x400, // Added to Vista SP1, Windows Server 2008 VDS_DF_CRASHDUMP_DISK = 0x800, // Added to Vista SP1, Windows Server 2008 VDS_DF_HAS_ARC_PATH = 0x1000, // Added to Vista SP1, Windows Server 2008 VDS_DF_DYNAMIC = 0x2000, // Added to Vista SP1, Windows Server 2008 VDS_DF_BOOT_FROM_DISK = 0x4000, // Added to Windows7, indicates the disk from // which the machine will boot. // Note that this is BIOS disk 0 on MBR, not // the CURRENT system volume disk. // for example if you are booted to WinPE, // this flag is set on BIOS disk 0. For EFI // machines, this flag is set on disk containing // the ESP used to boot the machine. VDS_DF_CURRENT_READ_ONLY = 0x8000 // Added to Windows7, indicates that the // current read-only state of the disk. } VDS_DISK_FLAG; // // Partition Flags // typedef enum _VDS_PARTITION_FLAG { VDS_PTF_SYSTEM = 0x1 // whether this partition is a system // partition. We need this flag because // we don't return ESP partitions as // volumes. } VDS_PARTITION_FLAG; // // Lun Reserve Modes // typedef enum _VDS_LUN_RESERVE_MODE { VDS_LRM_NONE = 0, VDS_LRM_EXCLUSIVE_RW = 1, VDS_LRM_EXCLUSIVE_RO = 2, VDS_LRM_SHARED_RO = 3, VDS_LRM_SHARED_RW = 4 } VDS_LUN_RESERVE_MODE; // // Volume Status // typedef enum _VDS_VOLUME_STATUS { VDS_VS_UNKNOWN = STATUS_UNKNOWN, VDS_VS_ONLINE = STATUS_ONLINE, VDS_VS_NO_MEDIA = STATUS_NO_MEDIA, VDS_VS_FAILED = STATUS_FAILED, VDS_VS_OFFLINE = STATUS_OFFLINE // Added for Win7 } VDS_VOLUME_STATUS; // // Volume Types // typedef enum _VDS_VOLUME_TYPE { VDS_VT_UNKNOWN = 0, VDS_VT_SIMPLE = 10, VDS_VT_SPAN = 11, VDS_VT_STRIPE = 12, VDS_VT_MIRROR = 13, VDS_VT_PARITY = 14 // Each volume has one or more plexes. // Each plex has one or more members. // e.g. a simple volume has one VDS_VPT_SIMPLE plex, // which in turn has one member, // with one or more extents on the same disk. // a spanned volume has one VDS_VPT_SPAN plex, // which in turn has one member, // with one or more extents on more than one disk. // a stripped volume has one VDS_VPT_STRIPE plex, // which in turn has two or more members, // with each member having one or more extents on // the same disk. (allowing on different disks?) // a RAID5 volume has one VDS_VPT_PARITY plex, // which in turn has three or more members, // with each member having one or more extents on // the same disk. (allowing on different disks?) // a mirrorred volume has two or more plexes of any type. // } VDS_VOLUME_TYPE; // // Volume Flags // typedef enum _VDS_VOLUME_FLAG { VDS_VF_SYSTEM_VOLUME = 0x1, VDS_VF_BOOT_VOLUME = 0x2, VDS_VF_ACTIVE = 0x4, VDS_VF_READONLY = 0x8, VDS_VF_HIDDEN = 0x10, VDS_VF_CAN_EXTEND = 0x20, VDS_VF_CAN_SHRINK = 0x40, VDS_VF_PAGEFILE = 0x80, VDS_VF_HIBERNATION = 0x100, VDS_VF_CRASHDUMP = 0x200, VDS_VF_INSTALLABLE = 0x400, VDS_VF_LBN_REMAP_ENABLED = 0x800, VDS_VF_FORMATTING = 0x1000, VDS_VF_NOT_FORMATTABLE = 0x2000, VDS_VF_NTFS_NOT_SUPPORTED = 0x4000, VDS_VF_FAT32_NOT_SUPPORTED = 0x8000, VDS_VF_FAT_NOT_SUPPORTED = 0x10000, VDS_VF_NO_DEFAULT_DRIVE_LETTER = 0x20000, // This flag behaves similarly to VDS_VF_HIDDEN and VDS_VF_READONLY // flags. On a MBR basic disk, these flags apply to all partitions. // But setting VDS_VF_NO_DEFAULT_DRIVE_LETTER flag does not delete // drive letters on other partitions on the same disk that already // have them. Yet setting VDS_VF_HIDDEN or VDS_VF_READONLY flag makes // other partitions HIDDEN or READONLY immediately at the same time. VDS_VF_PERMANENTLY_DISMOUNTED = 0x40000, // This flag means the volume is offlined by IOCTL_VOLUME_OFFLINE. // It can be made mountable by IOCTL_VOLUME_ONLINE, or assigning // a mount point explicitely. A volume will have this flag // after IVdsVolumeMF::Dismount( bForce, bPermanent=TRUE ) is called. VDS_VF_PERMANENT_DISMOUNT_SUPPORTED = 0x80000, // Whether this volume supports the bPermanent flag in IVdsVolumeMF:: // Dismount() method. VDS_VF_SHADOW_COPY = 0x100000, // Whether this volume is a shadow copy of another volume. VDS_VF_FVE_ENABLED = 0x200000, // Whether this volume has full volume encryption enabled. VDS_VF_DIRTY = 0x400000 // Whether this volume has dirty flag set } VDS_VOLUME_FLAG; // // Volume Plex Types // typedef enum _VDS_VOLUME_PLEX_TYPE { VDS_VPT_UNKNOWN = 0, VDS_VPT_SIMPLE = VDS_VT_SIMPLE, VDS_VPT_SPAN = VDS_VT_SPAN, VDS_VPT_STRIPE = VDS_VT_STRIPE, VDS_VPT_PARITY = VDS_VT_PARITY } VDS_VOLUME_PLEX_TYPE; // // Volume Plex Status // typedef enum _VDS_VOLUME_PLEX_STATUS { VDS_VPS_UNKNOWN = STATUS_UNKNOWN, VDS_VPS_ONLINE = STATUS_ONLINE, VDS_VPS_NO_MEDIA = STATUS_NO_MEDIA, VDS_VPS_FAILED = STATUS_FAILED } VDS_VOLUME_PLEX_STATUS; // // Disk Extent Types // typedef enum _VDS_DISK_EXTENT_TYPE { VDS_DET_UNKNOWN = 0, // extent of any unknown partition. VDS_DET_FREE = 1, // extent of free space, including free space inside extended partition. VDS_DET_DATA = 2, // extent of any volume (other than OEM partition, unknown partition and // ESP partition) VDS_DET_OEM = 3, // extent of OEM partition. VDS_DET_ESP = 4, // extent of ESP partition. VDS_DET_MSR = 5, // extent of MSR partition. VDS_DET_LDM = 6, // extent of LDM meta data partition. VDS_DET_CLUSTER = 7, // extent of Cluster meta data partition. VDS_DET_UNUSABLE = 0x7FFF // extent of unusable space on a disk. (e.g. space outside 4 primary // primary partitions on a basic MBR disk) } VDS_DISK_EXTENT_TYPE; // // Pack properties // typedef struct _VDS_PACK_PROP { VDS_OBJECT_ID id; [string] LPWSTR pwszName; // leave blank for basic pack. VDS_PACK_STATUS status; ULONG ulFlags; } VDS_PACK_PROP, *PVDS_PACK_PROP; // // Disk Properties // typedef struct _VDS_DISK_PROP { VDS_OBJECT_ID id; VDS_DISK_STATUS status; VDS_LUN_RESERVE_MODE ReserveMode; // to be filled by the VDS service. VDS_HEALTH health; DWORD dwDeviceType; // Values: (defined in winioctl.h) // FILE_DEVICE_DISK // FILE_DEVICE_CDROM // FILE_DEVICE_DVD // etc. DWORD dwMediaType; // Values: (STORAGE_MEDIA_TYPE values) // RemovableMedia // FixedMedia // CD_ROM // etc. ULONGLONG ullSize; ULONG ulBytesPerSector; ULONG ulSectorsPerTrack; ULONG ulTracksPerCylinder; ULONG ulFlags; VDS_STORAGE_BUS_TYPE BusType; VDS_PARTITION_STYLE PartitionStyle; [switch_is(PartitionStyle)] union { [case(VDS_PST_MBR)] DWORD dwSignature; // not guaranteed to be unique. [case(VDS_PST_GPT)] GUID DiskGuid; [default]; }; [string] LPWSTR pwszDiskAddress; // The address is for displaying purpose. It's only meaningful if // the disk has a SCSI-like address, which contains some configuration // information (port number, target id, etc): // SCSI, IDE: Port#Path#Target#Lun#. // 1394, USB: None // Fibre Channel: ? [string] LPWSTR pwszName; // This is the name that can be used to open a handle to the object // by CreateFile(). Examples: // Cdrom: \\?\CdRom1 // Disk: \\?\PhysicalDrive3 [string] LPWSTR pwszFriendlyName; // This is a name returned from PnP. This name is maintained in // registry by PnP. Example: // SEAGATE ST34573N SCSI Disk Device [string] LPWSTR pwszAdaptorName; // This is the name of the adaptor on which this disk is attached. // It is returned from PnP, and maintained in registry. // Adaptec AHA-2940U2W - Ultra2 SCSI. [string] LPWSTR pwszDevicePath; // This is returned by PnP. This id can be used to uniquely identify // a device on a machine by PnP. To bring up the disk property page // using an internal routine exported by device manager, we need to // pass in device instance id. } VDS_DISK_PROP, *PVDS_DISK_PROP; // // Disk Properties, version 2 added for Win7. // // // Disk offline reason // typedef enum _VDS_DISK_OFFLINE_REASON { VDSDiskOfflineReasonNone = 0, VDSDiskOfflineReasonPolicy = 1, VDSDiskOfflineReasonRedundantPath = 2, VDSDiskOfflineReasonSnapshot = 3, VDSDiskOfflineReasonCollision = 4 } VDS_DISK_OFFLINE_REASON; typedef struct _VDS_DISK_PROP2 { VDS_OBJECT_ID id; VDS_DISK_STATUS status; VDS_DISK_OFFLINE_REASON OfflineReason; VDS_LUN_RESERVE_MODE ReserveMode; // to be filled by the VDS service. VDS_HEALTH health; DWORD dwDeviceType; // Values: (defined in winioctl.h) // FILE_DEVICE_DISK // FILE_DEVICE_CDROM // FILE_DEVICE_DVD // etc. DWORD dwMediaType; // Values: (STORAGE_MEDIA_TYPE values) // RemovableMedia // FixedMedia // CD_ROM // etc. ULONGLONG ullSize; ULONG ulBytesPerSector; ULONG ulSectorsPerTrack; ULONG ulTracksPerCylinder; ULONG ulFlags; // audio CD, hotspare, VDS_STORAGE_BUS_TYPE BusType; VDS_PARTITION_STYLE PartitionStyle; [switch_is(PartitionStyle)] union { [case(VDS_PST_MBR)] DWORD dwSignature; // not guaranteed to be unique. [case(VDS_PST_GPT)] GUID DiskGuid; [default]; }; [string] LPWSTR pwszDiskAddress; // The address is for displaying purpose. It's only meaningful if // the disk has a SCSI-like address, which contains some configuration // information (port number, target id, etc): // SCSI, IDE: Port#Path#Target#Lun#. // 1394, USB: None // Fibre Channel: ? [string] LPWSTR pwszName; // This is the name that can be used to open a handle to the object // by CreateFile(). Examples: // Cdrom: \\?\CdRom1 // Disk: \\?\PhysicalDrive3 [string] LPWSTR pwszFriendlyName; // This is a name returned from PnP. This name is maintained in // registry by PnP. Example: // SEAGATE ST34573N SCSI Disk Device [string] LPWSTR pwszAdaptorName; // This is the name of the adaptor on which this disk is attached. // It is returned from PnP, and maintained in registry. // Adaptec AHA-2940U2W - Ultra2 SCSI. [string] LPWSTR pwszDevicePath; // This is returned by PnP. This id can be used to uniquely identify // a device on a machine by PnP. To bring up the disk property page // using an internal routine exported by device manager, we need to // pass in device instance id. [string] LPWSTR pwszLocationPath; // This string is built from a combination of the SCSI address and // the DEVPKEY_Device_LocationPaths value for the disk's adapter. } VDS_DISK_PROP2, *PVDS_DISK_PROP2; // // Volume Properties // typedef struct _VDS_VOLUME_PROP { VDS_OBJECT_ID id; VDS_VOLUME_TYPE type; VDS_VOLUME_STATUS status; VDS_HEALTH health; VDS_TRANSITION_STATE TransitionState; ULONGLONG ullSize; ULONG ulFlags; // VDS_VOLUME_FLAG VDS_FILE_SYSTEM_TYPE RecommendedFileSystemType; [string] LPWSTR pwszName; // This is the name that can be used to open a handle to the object // by CreateFile(). Example: // \\?\GLOBALROOT\Device\HarddiskVolume# } VDS_VOLUME_PROP, *PVDS_VOLUME_PROP; // // Volume Properties - adding uniqueid // typedef struct _VDS_VOLUME_PROP2 { VDS_OBJECT_ID id; VDS_VOLUME_TYPE type; VDS_VOLUME_STATUS status; VDS_HEALTH health; VDS_TRANSITION_STATE TransitionState; ULONGLONG ullSize; ULONG ulFlags; // VDS_VOLUME_FLAG VDS_FILE_SYSTEM_TYPE RecommendedFileSystemType; ULONG cbUniqueId; [string] LPWSTR pwszName; // This is the name that can be used to open a handle to the object // by CreateFile(). Example: // \\?\GLOBALROOT\Device\HarddiskVolume# [size_is(cbUniqueId)] BYTE *pUniqueId; } VDS_VOLUME_PROP2, *PVDS_VOLUME_PROP2; // // Volume plex properties // typedef struct _VDS_VOLUME_PLEX_PROP { VDS_OBJECT_ID id; VDS_VOLUME_PLEX_TYPE type; VDS_VOLUME_PLEX_STATUS status; VDS_HEALTH health; VDS_TRANSITION_STATE TransitionState; ULONGLONG ullSize; ULONG ulStripeSize; ULONG ulNumberOfMembers; // No flags. } VDS_VOLUME_PLEX_PROP, *PVDS_VOLUME_PLEX_PROP; // // Disk extent struct // typedef struct _VDS_DISK_EXTENT { VDS_OBJECT_ID diskId; VDS_DISK_EXTENT_TYPE type; ULONGLONG ullOffset; ULONGLONG ullSize; VDS_OBJECT_ID volumeId; // the volume the extent belongs to. VDS_OBJECT_ID plexId; // if the extent belongs to a volume, it's the id of the plex // it belongs to. An extent can belong to a partition (e.g. // MSR, LDM Meta Data), but not a volume. ULONG memberIdx; // if the extent belongs to a plex of a volume, it's the index // of the member it belongs to. Member index is 0 based. } VDS_DISK_EXTENT, *PVDS_DISK_EXTENT; // // Disk free extent // typedef struct _VDS_DISK_FREE_EXTENT { VDS_OBJECT_ID diskId; ULONGLONG ullOffset; ULONGLONG ullSize; } VDS_DISK_FREE_EXTENT, *PVDS_DISK_FREE_EXTENT; // // Input struct for IVdsPack::CreateVolume and IVdsVolume::Extend method. // typedef struct _VDS_INPUT_DISK { VDS_OBJECT_ID diskId; // This field is required. ULONGLONG ullSize; // This field is required. VDS_OBJECT_ID plexId; // When extending a volume, specify which plex the disk belongs to. // It is ignored when creating a volume and repair a RAID-5 volume. ULONG memberIdx; // This field specifies which member the extent should belong to. // either all disks' memberIdx are specified, or none is specified. // It must not be specified when repairing a RAID-5 volume. } VDS_INPUT_DISK; #define INVALID_MEMBER_IDX (0xFFFFFFFF) // // Partition Properties // cpp_quote("#define GPT_PARTITION_NAME_LENGTH 36") #define GPT_PARTITION_NAME_LENGTH 36 typedef struct _VDS_PARTITION_INFO_GPT { GUID partitionType; GUID partitionId; ULONGLONG attributes; WCHAR name[GPT_PARTITION_NAME_LENGTH]; } VDS_PARTITION_INFO_GPT; typedef struct _VDS_PARTITION_INFO_MBR { // equivalent to PARTITION_INFORMATION_MBR // and convertible to each other BYTE partitionType; BOOLEAN bootIndicator; BOOLEAN recognizedPartition; DWORD hiddenSectors; } VDS_PARTITION_INFO_MBR; typedef struct _VDS_PARTITION_PROP { VDS_PARTITION_STYLE PartitionStyle; ULONG ulFlags; ULONG ulPartitionNumber; ULONGLONG ullOffset; ULONGLONG ullSize; [switch_is(PartitionStyle)] union { [case(VDS_PST_MBR)] VDS_PARTITION_INFO_MBR Mbr; // For MBR disk [case(VDS_PST_GPT)] VDS_PARTITION_INFO_GPT Gpt; // For GPT disk [default]; }; } VDS_PARTITION_PROP; // // MIDLize'd PARTITION_INFORMATION_EX // The midlized types have identical representation with the original // NT types. // typedef enum tag_VDS_PARTITION_STYLE { VDS_PARTITION_STYLE_MBR, VDS_PARTITION_STYLE_GPT, VDS_PARTITION_STYLE_RAW } __VDS_PARTITION_STYLE; // VDS_PARTITION_STYLE is already defined. typedef struct _VDS_PARTITION_INFORMATION_EX { __VDS_PARTITION_STYLE dwPartitionStyle; ULONGLONG ullStartingOffset; // LARGE_INTEGER ULONGLONG ullPartitionLength; // LARGE_INTEGER DWORD dwPartitionNumber; BOOLEAN bRewritePartition; [switch_is(dwPartitionStyle)] union { [case (VDS_PARTITION_STYLE_MBR)] VDS_PARTITION_INFO_MBR Mbr; [case (VDS_PARTITION_STYLE_GPT)] VDS_PARTITION_INFO_GPT Gpt; }; } VDS_PARTITION_INFORMATION_EX; typedef struct _CREATE_PARTITION_PARAMETERS { VDS_PARTITION_STYLE style; // legal values: MBR or GPT [switch_is(style)] union { [case(VDS_PST_MBR)] struct { BYTE partitionType; BOOLEAN bootIndicator; } MbrPartInfo; [case(VDS_PST_GPT)] struct { GUID partitionType; GUID partitionId; // Pass zero to generate, ASR needs to set this. ULONGLONG attributes; WCHAR name[GPT_PARTITION_NAME_LENGTH]; } GptPartInfo; [default]; }; // These two union structs are based on PARTITION_INFORMATION_MBR, // PARTITION_INFORMATION_GPT, which are used in IOCTL_DISK_SET_ // DRIVE_LAYOUT_EX. } CREATE_PARTITION_PARAMETERS; typedef struct _CHANGE_ATTRIBUTES_PARAMETERS { VDS_PARTITION_STYLE style; // legal values: MBR or GPT [switch_is(style)] union { [case(VDS_PST_MBR)] struct { BOOLEAN bootIndicator; } MbrPartInfo; [case(VDS_PST_GPT)] struct { ULONGLONG attributes; // Includes a boot indicator flag } GptPartInfo; [default]; }; } CHANGE_ATTRIBUTES_PARAMETERS; typedef struct _CHANGE_PARTITION_TYPE_PARAMETERS { VDS_PARTITION_STYLE style; // legal values: MBR or GPT [switch_is(style)] union { [case(VDS_PST_MBR)] struct { BYTE partitionType; } MbrPartInfo; [case(VDS_PST_GPT)] struct { GUID partitionType; } GptPartInfo; [default]; }; } CHANGE_PARTITION_TYPE_PARAMETERS; // // IVdsSwProvider: // This interface exposes software provider specific functions. // Implemented by: provider object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(9aa58360-ce33-4f92-b658-ed24b14425b8), pointer_default(unique) ] interface IVdsSwProvider : IUnknown { // QueryPacks: [helpstring("method QueryPacks")] HRESULT QueryPacks( [out] IEnumVdsObject **ppEnum ); // CreatePack: [helpstring("method CreatePack")] HRESULT CreatePack( [out] IVdsPack **ppPack ); // NOTE: For basic provider, each pack can have only one disk. } // // IVdsPack: // Implemented by: pack object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(3b69d7f5-9d94-4648-91ca-79939ba263bf), pointer_default(unique) ] interface IVdsPack : IUnknown { [helpstring("method GetProperties")] HRESULT GetProperties( [out] VDS_PACK_PROP *pPackProp ); [helpstring("method GetProvider")] HRESULT GetProvider( [out] IVdsProvider **ppProvider ); [helpstring("method QueryVolumes")] HRESULT QueryVolumes( [out] IEnumVdsObject **ppEnum ); [helpstring("method QueryDisks")] HRESULT QueryDisks( [out] IEnumVdsObject **ppEnum ); // CreateVolume: // The types of volumes that can be created include simple, spanned, // striped, mirrored, RAID-5. Basic provider can create volume from only // one extent. [helpstring("method CreateVolume")] HRESULT CreateVolume( [in] VDS_VOLUME_TYPE type, [in, size_is(lNumberOfDisks)] VDS_INPUT_DISK *pInputDiskArray, [in] LONG lNumberOfDisks, [in] ULONG ulStripeSize, [out] IVdsAsync **ppAsync ); // AddDisk: // Providers don't implement this method. Instead, they implement // AddDisk() on IVdsMigrateDisks interface. [helpstring("method AddDisk")] HRESULT AddDisk( [in] VDS_OBJECT_ID DiskId, [in] VDS_PARTITION_STYLE PartitionStyle, [in] BOOL bAsHotSpare ); // MigrateDisks: // Providers don't implement this method. Instead, they implement // IVdsMigrateDisks interface. [helpstring("method MigrateDisks")] HRESULT MigrateDisks( [in, size_is(lNumberOfDisks)] VDS_OBJECT_ID *pDiskArray, [in] LONG lNumberOfDisks, [in] VDS_OBJECT_ID TargetPack, [in] BOOL bForce, // In some cases the migration may cause data loss. // if this flag is set to FALSE, the operation will // not proceed. One example is when a transitive // closure is missing a disk, the rest disks need to // be moved to another pack. This would normally be // vetoed. With bForce set to TRUE, the operation // will proceed. [in] BOOL bQueryOnly, // If this is set to TRUE, migration will not be really // carried out. The return results through pHresults // indicate whether a disk can be migrated or not. [out, size_is(lNumberOfDisks)] HRESULT *pResults, // If a disk can be migrated, or is migrated successfully, // the corresponding HRESULT will be S_OK, otherwise, // a warning code, or an error code.. [out] BOOL *pbRebootNeeded ); // ReplaceDisk: // Basic pack does not support this operation. [helpstring("method ReplaceDisk")] HRESULT ReplaceDisk( [in] VDS_OBJECT_ID OldDiskId, [in] VDS_OBJECT_ID NewDiskId, [out] IVdsAsync **ppAsync ); // RemoveMissingDisk: [helpstring("method RemoveMissingDisk")] HRESULT RemoveMissingDisk( [in] VDS_OBJECT_ID DiskId ); // Recover: // This method tries to bring a failing or failed pack back to healthy // state. It also tries to recover all unhealthy disks and volumes in // the pack. [helpstring("method Recover")] HRESULT Recover( [out] IVdsAsync **ppAsync ); } // // IVdsPack2: // Implemented by: pack object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(13B50BFF-290A-47DD-8558-B7C58DB1A71A), pointer_default(unique) ] interface IVdsPack2 : IUnknown { // CreateVolume2: // Adding an ullAlign param to CreateVolume. [helpstring("method CreateVolume2")] HRESULT CreateVolume2( [in] VDS_VOLUME_TYPE type, [in, size_is(lNumberOfDisks)] VDS_INPUT_DISK *pInputDiskArray, [in] LONG lNumberOfDisks, [in] ULONG ulStripeSize, [in] ULONG ulAlign, [out] IVdsAsync **ppAsync ); } // // IVdsDisk: // Implemented by: disk object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(07e5c822-f00c-47a1-8fce-b244da56fd06), pointer_default(unique) ] interface IVdsDisk : IUnknown { [helpstring("method GetProperties")] HRESULT GetProperties( [out] VDS_DISK_PROP *pDiskProperties ); [helpstring("method GetPack")] HRESULT GetPack( [out] IVdsPack **ppPack ); // NOTE: for disks that are managed by the service (unallocated // & masked), this method returns NULL. [helpstring("method GetIdentificationData")] HRESULT GetIdentificationData( [out] VDS_LUN_INFORMATION *pLunInfo ); // QueryExtents: // Return all extents on a disk. Extents include: // dynamic volume extent, dynamic free extent, // primary partition extent, logical drive extent, extended // free extent, // ESP extent, OEM extent, foreign partition extent, // MSR extent, LDM Metadata extent // Extent has a link to the volume on top of it, and an // attribute to identify it as foreign partition.(unknown) [helpstring("method QueryExtents")] HRESULT QueryExtents( [out, size_is(,*plNumberOfExtents)] VDS_DISK_EXTENT **ppExtentArray, [out] LONG *plNumberOfExtents ); // ConvertStyle: // To convert the style of a disk, the disk must be empty, meaning // no user data, no OEM partition, no ESP partition, no unknown // partition. It's OK to have LDM Metadata partition, or MSR partition. [helpstring("method ConvertStyle")] HRESULT ConvertStyle( [in] VDS_PARTITION_STYLE NewStyle ); // SetFlags: // Only VDS_DF_HOTSPARE can be set. [helpstring("method SetFlags")] HRESULT SetFlags( [in] ULONG ulFlags ); // ClearFlags: // Only VDS_DF_HOTSPARE can be cleared. [helpstring("method ClearFlags")] HRESULT ClearFlags( [in] ULONG ulFlags ); } // // IVdsDisk2: // Implemented by: disk object // Implemented where: The service, common layer // Accessed by: applications // [ object, uuid(40F73C8B-687D-4a13-8D96-3D7F2E683936), pointer_default(unique) ] interface IVdsDisk2 : IUnknown { [helpstring("method SetSANMode")] HRESULT SetSANMode( [in] BOOL bEnable ); } // // IVdsDiskOnline: // Implemented by: disk object // Implemented where: The service, common layer // Accessed by: applications // [ object, uuid(90681B1D-6A7F-48e8-9061-31B7AA125322), pointer_default(unique) ] interface IVdsDiskOnline : IUnknown { [helpstring("method Online")] HRESULT Online( void ); [helpstring("method Offline")] HRESULT Offline( void ); } // // IVdsAdvancedDisk: // This interface is for configuring and managing partitions. // Implemented by: disk object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(6e6f6b40-977c-4069-bddd-ac710059f8c0), pointer_default(unique) ] interface IVdsAdvancedDisk : IUnknown { [helpstring("method GetPartitionProperties")] HRESULT GetPartitionProperties( [in] ULONGLONG ullOffset, [out] VDS_PARTITION_PROP *pPartitionProp ); [helpstring("method QueryPartitions")] HRESULT QueryPartitions( [out, size_is(,*plNumberOfPartitions)] VDS_PARTITION_PROP **ppPartitionPropArray, [out] LONG *plNumberOfPartitions ); // Remark: Partitions include: // primary partition, extended partition, logical drive, // OEM partition, ESP partition, MSR partition, LDM Metadata // partition, LDM data partition, Unknown partition. [helpstring("method CreatePartition")] HRESULT CreatePartition( [in] ULONGLONG ullOffset, [in] ULONGLONG ullSize, [in] CREATE_PARTITION_PARAMETERS *para, [out] IVdsAsync **ppAsync ); // Remark: CreatePartition will fail on dynamic disks. [helpstring("method DeletePartition")] HRESULT DeletePartition( [in] ULONGLONG ullOffset, [in] BOOL bForce, // forcefully delete a normal partition // that is in use [in] BOOL bForceProtected // forcefully delete a protected partition. // Protected partitions include OEM, ESP and // MSR partitions ); // Remark: DeletePartition always fails on dynamic disk. [helpstring("method ChangeAttributes")] HRESULT ChangeAttributes( [in] ULONGLONG ullOffset, [in] CHANGE_ATTRIBUTES_PARAMETERS *para ); // Providers don't implement this method. [helpstring("method AssignDriveLetter")] HRESULT AssignDriveLetter( [in] ULONGLONG ullOffset, // partition offset [in] WCHAR wcLetter // drive letter to assign ); [helpstring("method DeleteDriveLetter")] HRESULT DeleteDriveLetter( [in] ULONGLONG ullOffset, // partition offset [in] WCHAR wcLetter ); [helpstring("method GetDriveLetter")] HRESULT GetDriveLetter( [in] ULONGLONG ullOffset, [out] WCHAR *pwcLetter ); [helpstring("method FormtPartition")] HRESULT FormatPartition( [in] ULONGLONG ullOffset, [in] VDS_FILE_SYSTEM_TYPE type, [in,string] LPWSTR pwszLabel, [in] DWORD dwUnitAllocationSize, [in] BOOL bForce, [in] BOOL bQuickFormat, [in] BOOL bEnableCompression, // NTFS only. [out] IVdsAsync **ppAsync ); // Providers don't implement bFullClean option. Providers should return // as soon as possible after delete drive layout. The service will claim // the disk and finish the full clean part. The service blocks all calls // when the provider is cleaning a disk. HRESULT Clean( [in] BOOL bForce, [in] BOOL bForceOEM, [in] BOOL bFullClean, [out] IVdsAsync **ppAsync ); } // // IVdsAdvancedDisk2: // This interface is the next version of IVdsAdvancedDisk. // It contains additional methods to configure and manage // partitions. // Implemented by: disk object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(9723f420-9355-42de-ab66-e31bb15beeac), pointer_default(unique) ] interface IVdsAdvancedDisk2 : IUnknown { // // The following methods are new to LH. // [helpstring("method ChangePartitionType")] HRESULT ChangePartitionType( [in] ULONGLONG ullOffset, [in] BOOL bForce, [in] CHANGE_PARTITION_TYPE_PARAMETERS *para ); } // // IVdsCreatePartitionEx: // This interface is to add alignment feature to CreatePartition // method on IVdsAdvancedDisk interface. It contains only one // method CreatePartitionEx. // Implemented by: disk object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(9882f547-cfc3-420b-9750-00dfbec50662), pointer_default(unique) ] interface IVdsCreatePartitionEx : IUnknown { [helpstring("method CreatePartitionEx")] HRESULT CreatePartitionEx( [in] ULONGLONG ullOffset, [in] ULONGLONG ullSize, [in] ULONG ulAlign, [in] CREATE_PARTITION_PARAMETERS *para, [out] IVdsAsync **ppAsync ); // Remark: CreatePartitionEx will fail on dynamic disks. } // // IVdsRemovable: // Only removable disks implement this interface. // Implemented by: disk object // Implemented where: basic software provider, common layer // Accessed by: applications // [ object, uuid(0316560b-5db4-4ed9-bbb5-213436ddc0d9), pointer_default(unique) ] interface IVdsRemovable : IUnknown { [helpstring("method QueryMedia")] HRESULT QueryMedia( ); [helpstring("method Eject")] HRESULT Eject( void ); } // // IVdsVolume: // Implemented by: volume object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(88306bb2-e71f-478c-86a2-79da200a0f11), pointer_default(unique) ] interface IVdsVolume : IUnknown { [helpstring("method GetProperties")] HRESULT GetProperties( [out] VDS_VOLUME_PROP *pVolumeProperties ); [helpstring("method GetPack")] HRESULT GetPack( [out] IVdsPack **ppPack ); // QueryPlexes: // Retrieve all the plexes of the volume. // The most common case is that one volume has one plex (except mirror). [helpstring("method QueryPlexes")] HRESULT QueryPlexes( [out] IEnumVdsObject **ppEnum ); // Extend: // This method extends a volume by adding extents to each member of each // plex of the volume. If a plex already has enough extra space (e.g. // adding a bigger volume as a plex to a small volume), no disk extent // is needed for that plex. If the disk extents have more space than // needed, the extra space is not used. // // Notes: // 1) A basic volume can also be extended, but the extent must be // contiguous with the volume. // 2) When no extent is supplied, the method will extend the volume // using any usable extra space on its plexes. // (E.g. Adding two bigger plexes and then break off the original // smaller plex, we end up having extra space on each of the // plexes.) // [helpstring("method Extend")] HRESULT Extend( [in, unique, size_is(lNumberOfDisks)] VDS_INPUT_DISK *pInputDiskArray, [in] LONG lNumberOfDisks, [out] IVdsAsync **ppAsync ); // Shrink: // This method shrinks the volume and all plexes and return the // released extents. // // The file system will be shrunk first. In order to shrink a volume, // the file system must support shrink. // // Notes: // 1) when uNumberOfBytesToRemove is 0, this method shrink any plex // whose size is greater than the volume and free up its extra space. [helpstring("method Shrink")] HRESULT Shrink( [in] ULONGLONG ullNumberOfBytesToRemove, [out] IVdsAsync **ppAsync ); // AddPlex: // Once a volume is added as a plex to another volume, it is no // longer a volume itself. It loses its volume device object. // Its COM object should allow an application to know the volume // is gone, as if it's deleted. // The target volume inherits flags from the base volume. The added // plex loses it's original flags. E.g. VDS_VF_LBN_REMAP_ENABLED. // // Note: // 1) A mirrored volume can be added as a plex to another volume too. // The new volume will have a total number of plexes of the sum // of the two separate volumes. [helpstring("method AddPlex")] HRESULT AddPlex( [in] VDS_OBJECT_ID VolumeId, [out] IVdsAsync **ppAsync ); // BreakPlex: // Break a specified plex of the volume. The broken-away plex becomes // a hidden, readonly volume on its own. [helpstring("BreakPlex")] HRESULT BreakPlex( [in] VDS_OBJECT_ID plexId, [out] IVdsAsync **ppAsync ); // RemovePlex: // Remove a specified plex of the volume. The last plex of a volume // cannot be removed. [helpstring("RemovePlex")] HRESULT RemovePlex( [in] VDS_OBJECT_ID plexId, [out] IVdsAsync **ppAsync ); // Delete: // All plexes are deleted. [helpstring("method Delete")] HRESULT Delete( [in] BOOL bForce // This flag is reserved for the service. Providers should // ignore it. It means if the volume is in use, whether or // not to forcefully delete. ); // SetFlags: // The flags can be VDS_VF_LBN_REMAP_ENABLED, VDS_VF_HIDDEN, VDS_VF_READONLY. // Added flag: VDS_VF_INSTALLABLE to make a dynamic volume installable. [helpstring("method SetFlags")] HRESULT SetFlags( [in] ULONG ulFlags, [in] BOOL bRevertOnClose ); // ClearFlags: // The flags can be VDS_VF_LBN_REMAP_ENABLED, VDS_VF_HIDDEN. // Added flag: VDS_VF_INSTALLABLE to remove hard partition under // a dynamic volume. [helpstring("method ClearFlags")] HRESULT ClearFlags( [in] ULONG ulFlags ); } // // IVdsVolume2: // Implemented by: volume object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(72AE6713-DCBB-4a03-B36B-371F6AC6B53D), pointer_default(unique) ] interface IVdsVolume2 : IUnknown { [helpstring("method GetProperties2")] HRESULT GetProperties2( [out] VDS_VOLUME_PROP2 *pVolumeProperties ); } // // IVdsVolumeOnline: // Implemented by: volume object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(1BE2275A-B315-4f70-9E44-879B3A2A53F2), pointer_default(unique) ] interface IVdsVolumeOnline : IUnknown { [helpstring("method Online")] HRESULT Online( void ); } // // IVdsVolumePlex: // Implemented by: volume plex object // Implemented where: software providers, common layer // Accessed by: applications // [ object, uuid(4daa0135-e1d1-40f1-aaa5-3cc1e53221c3), pointer_default(unique) ] interface IVdsVolumePlex : IUnknown { [helpstring("method GetProperties")] HRESULT GetProperties( [out] VDS_VOLUME_PLEX_PROP *pPlexProperties ); [helpstring("method GetVolume")] HRESULT GetVolume( [out] IVdsVolume **ppVolume ); [helpstring("method QueryExtents")] HRESULT QueryExtents( [out, size_is(,*plNumberOfExtents)] VDS_DISK_EXTENT **ppExtentArray, [out] LONG *plNumberOfExtents ); // Repair: // This method repairs a fault tolerant volume plex by moving bad // member to good disks. Only disk id and size should be specified // for VDS_INPUT_DISK. [helpstring("method Repair")] HRESULT Repair( [in, size_is(lNumberOfDisks)] VDS_INPUT_DISK *pInputDiskArray, [in] LONG lNumberOfDisks, [out] IVdsAsync **ppAsync ); } // // IVdsDisk3: // Implemented by: disk object // Implemented where: The service, common layer // Accessed by: applications // [ object, uuid(8F4B2F5D-EC15-4357-992F-473EF10975B9), pointer_default(unique) ] interface IVdsDisk3 : IUnknown { [helpstring("method GetProperties2")] HRESULT GetProperties2( [out] VDS_DISK_PROP2 *pDiskProperties ); [helpstring("method QueryFreeExtents")] HRESULT QueryFreeExtents( [in] ULONG ulAlign, [out, size_is(,*plNumberOfFreeExtents)] VDS_DISK_FREE_EXTENT **ppFreeExtentArray, [out] LONG *plNumberOfFreeExtents ); }