xpmgr/BuildTools/Include/vdscmmn.idl

1308 lines
33 KiB
Plaintext

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000
//
// File: vdscmmn.idl
//
// Abstract:
// declarations of interfaces and types common to the common layer,
// software providers, and hardware providers.
//
//----------------------------------------------------------------------------
import "vdserr.h";
interface IEnumVdsObject;
interface IVdsAsync;
interface IVdsAdviseSink;
interface IVdsProvider;
interface IVdsProviderSupport;
//
// All possible object status
//
#define STATUS_UNKNOWN 0
#define STATUS_ONLINE 1
#define STATUS_NOT_READY 2
#define STATUS_NO_MEDIA 3
#define STATUS_OFFLINE 4
#define STATUS_FAILED 5
#define STATUS_MISSING 6
#define STATUS_STANDBY 7
#define STATUS_REMOVED 8
#define STATUS_PARTIALLY_MANAGED 9
//
// Object IDs
//
typedef GUID VDS_OBJECT_ID;
//
// Object types
//
typedef enum _VDS_OBJECT_TYPE
{
// values >=0 and <10 are exposed to the service, client, and provider.
// values >=10 and <30 are reserved for software providers.
// values >=30 and <60 are reserved for hardware providers.
// values >=90 are reserved by the VDS service and not exposed to providers.
// values >=100 are used internally by the VDS service and not exposed to
// clients and providers.
// values >=200 are reserved for virtual disk storage providers.
VDS_OT_UNKNOWN = 0,
VDS_OT_PROVIDER = 1,
VDS_OT_PACK = 10,
VDS_OT_VOLUME = 11,
VDS_OT_VOLUME_PLEX = 12,
VDS_OT_DISK = 13,
VDS_OT_SUB_SYSTEM = 30,
VDS_OT_CONTROLLER = 31,
VDS_OT_DRIVE = 32,
VDS_OT_LUN = 33,
VDS_OT_LUN_PLEX = 34,
VDS_OT_PORT = 35,
VDS_OT_PORTAL = 36,
VDS_OT_TARGET = 37,
VDS_OT_PORTAL_GROUP = 38,
VDS_OT_STORAGE_POOL = 39,
VDS_OT_HBAPORT = 90,
VDS_OT_INIT_ADAPTER = 91,
VDS_OT_INIT_PORTAL = 92,
VDS_OT_ASYNC = 100,
VDS_OT_ENUM = 101,
VDS_OT_VDISK = 200,
VDS_OT_OPEN_VDISK = 201,
} VDS_OBJECT_TYPE;
// Partitions and extents are not COM objects.
//
// Provider Types
//
typedef enum _VDS_PROVIDER_TYPE
{
VDS_PT_UNKNOWN = 0,
VDS_PT_SOFTWARE = 1,
VDS_PT_HARDWARE = 2,
VDS_PT_VIRTUALDISK = 3,
VDS_PT_MAX = 4
} VDS_PROVIDER_TYPE;
//
// Provider Flags
//
typedef enum _VDS_PROVIDER_FLAG
{
//
// This flag is set by dynamic providers. Applications can tell from
// this flag if a disk is dynamic or not.
//
VDS_PF_DYNAMIC = 0x00000001,
//
// The hardware provider manages an in-box hardware controller,
// instead of a external RAID cabinet.
//
VDS_PF_INTERNAL_HARDWARE_PROVIDER = 0x00000002,
//
// This flag is for basic provider which does not really have the
// concept of pack. We fake a pack for each basic disk. The pack
// contains only one disk.
//
VDS_PF_ONE_DISK_ONLY_PER_PACK = 0x00000004,
//
// This flag is for downrev provider. On a downrev machine, multiple
// disk groups(pack) are not supported. Only one pack can be online
// at a time.
//
VDS_PF_ONE_PACK_ONLINE_ONLY = 0x00000008,
//
// All volumes managed by this provider must have contiguous space.
// This flag currently applies to basic provider only. We may remove
// it if we think it's enough to have VDS_PF_DYNAMIC flag.
//
VDS_PF_VOLUME_SPACE_MUST_BE_CONTIGUOUS = 0x00000010,
//
// These three are internal flags that will be translated to
// VDS_SVF_SUPPORT_DYNAMIC, VDS_SVF_SUPPORT_FAULT_TOLERANT
// VDS_SVF_SUPPORT_DYNAMIC_1394 by the service.
//
VDS_PF_SUPPORT_DYNAMIC = 0x80000000,
VDS_PF_SUPPORT_FAULT_TOLERANT = 0x40000000, // Indicates that both mirrors and RAID5 are supported.
VDS_PF_SUPPORT_DYNAMIC_1394 = 0x20000000,
//
// Added for Windows 7. Client SKUs support mirrors but not RAID5.
// No change to server SKUs, both mirrors and RAID5 are supported.
//
VDS_PF_SUPPORT_MIRROR = 0x00000020,
VDS_PF_SUPPORT_RAID5 = 0x00000040
} VDS_PROVIDER_FLAG;
//
// Recover Actions
//
typedef enum _VDS_RECOVER_ACTION
{
VDS_RA_UNKNOWN = 0,
VDS_RA_REFRESH = 1,
VDS_RA_RESTART = 2
} VDS_RECOVER_ACTION;
//
// Notification Target Types
//
typedef enum _VDS_NOTIFICATION_TARGET_TYPE
{
VDS_NTT_UNKNOWN = 0,
VDS_NTT_PACK = VDS_OT_PACK,
VDS_NTT_VOLUME = VDS_OT_VOLUME,
VDS_NTT_DISK = VDS_OT_DISK,
VDS_NTT_PARTITION = 60,
VDS_NTT_DRIVE_LETTER = 61,
VDS_NTT_FILE_SYSTEM = 62,
VDS_NTT_MOUNT_POINT = 63,
VDS_NTT_SUB_SYSTEM = VDS_OT_SUB_SYSTEM,
VDS_NTT_CONTROLLER = VDS_OT_CONTROLLER,
VDS_NTT_DRIVE = VDS_OT_DRIVE,
VDS_NTT_LUN = VDS_OT_LUN,
VDS_NTT_PORT = VDS_OT_PORT,
VDS_NTT_PORTAL = VDS_OT_PORTAL,
VDS_NTT_TARGET = VDS_OT_TARGET,
VDS_NTT_PORTAL_GROUP = VDS_OT_PORTAL_GROUP,
VDS_NTT_SERVICE = 200
} VDS_NOTIFICATION_TARGET_TYPE;
//
// Event types
// software providers notifications range from 1 to 100.
// hardware provider notifications range from 101 to 200.
// service notifications range from 201 to 300.
// common notifications range from 301 to 400.
//
//
// pack notifications
//
const ULONG VDS_NF_PACK_ARRIVE = 1;
// When a pack is created
const ULONG VDS_NF_PACK_DEPART = 2;
// When a pack is deleted
const ULONG VDS_NF_PACK_MODIFY = 3;
// When a pack is modified(including online, offline)
//
// volume notifications
//
const ULONG VDS_NF_VOLUME_ARRIVE = 4;
// When a volume is created or discovered.
const ULONG VDS_NF_VOLUME_DEPART = 5;
// When a volume is deleted or disappears.
const ULONG VDS_NF_VOLUME_MODIFY = 6;
// When something changed in the volume's VDS_VOLUME_PROP structure.
const ULONG VDS_NF_VOLUME_REBUILDING_PROGRESS = 7;
// When a volume is in rebuilding process.
//
// disk notifications
//
const ULONG VDS_NF_DISK_ARRIVE = 8;
// When a spindle is plugged in, or a RAID controller surfaced a LUN
// that is local to the host.
const ULONG VDS_NF_DISK_DEPART = 9;
// When a spindle is unplugged, or a RAID controller unbound a LUN
// that was local to the host.
const ULONG VDS_NF_DISK_MODIFY = 10;
// When something changed in the disk's VDS_DISK_PROP structure.
//
// partition notifications
//
const ULONG VDS_NF_PARTITION_ARRIVE = 11;
// When a partition is created. If the partition is also a volume,
// a volume arrival notification will also be sent.
const ULONG VDS_NF_PARTITION_DEPART = 12;
// When a partition is deleted. If the partition is also a volume,
// a volume removal notification will also be sent.
const ULONG VDS_NF_PARTITION_MODIFY = 13;
// When a partition is changed. If the partition is also a volume,
// and if the partition attributes change, a volume change notification
// will also be sent.
//
// subsystem notifications
//
const ULONG VDS_NF_SUB_SYSTEM_ARRIVE = 101;
// When a new subsystem is discovered.
const ULONG VDS_NF_SUB_SYSTEM_DEPART = 102;
// When a subsystem is disconnected.
// NOTE: more subystem notifications continue below starting at 151
//
// controller notifications
//
const ULONG VDS_NF_CONTROLLER_ARRIVE = 103; // ONLINE
// When a controller goes online.
const ULONG VDS_NF_CONTROLLER_DEPART = 104; // OFFLINE
// When a controller goes offline.
//
// drive notifications
//
const ULONG VDS_NF_DRIVE_ARRIVE = 105;
// When a spindle is plugged in behind a RAID controller.
const ULONG VDS_NF_DRIVE_DEPART = 106;
// When a spindle is unplugged behind a RAID controller.
const ULONG VDS_NF_DRIVE_MODIFY = 107;
// When something changed in the spindle's VDS_DRIVE_PROP structure.
//
// LUN notifications
// The three LUN notifications will be sent only when the LUN is not
// local to the machine. Otherwise, disk notifications will be sent.
//
const ULONG VDS_NF_LUN_ARRIVE = 108;
// When a LUN is created.
const ULONG VDS_NF_LUN_DEPART = 109;
// When a LUN is deleted.
const ULONG VDS_NF_LUN_MODIFY = 110;
// When something changed in the LUN's VDS_LUN_PROP structure.
// TODO: add VDS_NF_LUN_REBUILDING_PROGRESS?
//
// controller port notifications
//
const ULONG VDS_NF_PORT_ARRIVE = 121; // ONLINE
// When a controller port goes online.
const ULONG VDS_NF_PORT_DEPART = 122; // OFFLINE
// When a controller port goes offline.
//
// portal notifications
//
const ULONG VDS_NF_PORTAL_ARRIVE = 123;
// When an iSCSI portal is created.
const ULONG VDS_NF_PORTAL_DEPART = 124;
// When an iSCSI portal is removed.
const ULONG VDS_NF_PORTAL_MODIFY = 125;
// When something changed in the iSCSI portal's VDS_ISCSI_PORTAL_PROP structure.
//
// target notifications
//
const ULONG VDS_NF_TARGET_ARRIVE = 126;
// When an iSCSI target is created.
const ULONG VDS_NF_TARGET_DEPART = 127;
// When an iSCSI target is deleted.
const ULONG VDS_NF_TARGET_MODIFY = 128;
// When something changed in the iSCSI portal's VDS_ISCSI_TARGET_PROP structure.
//
// portal group notifications
//
const ULONG VDS_NF_PORTAL_GROUP_ARRIVE = 129;
// When an iSCSI portal group is created.
const ULONG VDS_NF_PORTAL_GROUP_DEPART = 130;
// When an iSCSI portal group is deleted.
const ULONG VDS_NF_PORTAL_GROUP_MODIFY = 131;
// When something changed in the iSCSI portal group's VDS_ISCSI_PORTALGROUP_PROP structure.
//
// more subsystem notifications
//
const ULONG VDS_NF_SUB_SYSTEM_MODIFY = 151;
// When something changed in the subsystem's VDS_SUB_SYSTEM_PROP structure.
//
// drive letter notifications
//
const ULONG VDS_NF_DRIVE_LETTER_FREE = 201;
// When a drive letter is freed.
const ULONG VDS_NF_DRIVE_LETTER_ASSIGN = 202;
// When a drive letter is assigned.
//
// file system notifications
//
const ULONG VDS_NF_FILE_SYSTEM_MODIFY = 203;
// When a volume gets a new label, or file system is extended or shrunk.
// Note, this does not include change of file system comression flags.
const ULONG VDS_NF_FILE_SYSTEM_FORMAT_PROGRESS = 204;
// When a file system is being formated.
// NOTE: more file system notifications continue below starting at 206
//
// mount point notification
//
const ULONG VDS_NF_MOUNT_POINTS_CHANGE = 205;
//
// more file system notifications
//
const ULONG VDS_NF_FILE_SYSTEM_SHRINKING_PROGRESS = 206;
// When a file system is in the process of shrinking
//
// common notifications
//
const ULONG VDS_NF_SERVICE_OUT_OF_SYNC = 301;
//
// Windows 7 notifications
//
//
// controller notifications
//
const ULONG VDS_NF_CONTROLLER_MODIFY = 350;
// When something changed in controller's properties.
const ULONG VDS_NF_CONTROLLER_REMOVED = 351;
// When a controller is removed.
//
// controller port notifications
//
const ULONG VDS_NF_PORT_MODIFY = 352;
// When something changed in controller port's properties.
const ULONG VDS_NF_PORT_REMOVED = 353;
// When a controller port is removed.
//
// drive notifications
//
const ULONG VDS_NF_DRIVE_REMOVED = 354;
// When a drive is removed.
//
// Notification Structs
//
typedef struct _VDS_PACK_NOTIFICATION
{
ULONG ulEvent;
VDS_OBJECT_ID packId;
} VDS_PACK_NOTIFICATION;
typedef struct _VDS_DISK_NOTIFICATION
{
ULONG ulEvent; // arrival, departure, modified.
VDS_OBJECT_ID diskId;
} VDS_DISK_NOTIFICATION;
typedef struct _VDS_VOLUME_NOTIFICATION
{
ULONG ulEvent;
// created, deleted, modified, resyncing progress
VDS_OBJECT_ID volumeId;
VDS_OBJECT_ID plexId;
// This is for resyncing and rebuilding only.
// resyncing can happen on more than one plex at
// different pace.
ULONG ulPercentCompleted;
} VDS_VOLUME_NOTIFICATION;
typedef struct _VDS_PARTITION_NOTIFICATION
{
ULONG ulEvent;
// created, deleted, modified, resyncing progress
VDS_OBJECT_ID diskId;
ULONGLONG ullOffset;
} VDS_PARTITION_NOTIFICATION;
typedef struct _VDS_SERVICE_NOTIFICATION
{
ULONG ulEvent;
VDS_RECOVER_ACTION action;
} VDS_SERVICE_NOTIFICATION;
typedef struct _VDS_DRIVE_LETTER_NOTIFICATION
{
ULONG ulEvent; // freed, used
WCHAR wcLetter;
VDS_OBJECT_ID volumeId;
} VDS_DRIVE_LETTER_NOTIFICATION;
typedef struct _VDS_FILE_SYSTEM_NOTIFICATION
{
ULONG ulEvent; // created, format progress
VDS_OBJECT_ID volumeId;
DWORD dwPercentCompleted;
} VDS_FILE_SYSTEM_NOTIFICATION;
typedef struct _VDS_MOUNT_POINT_NOTIFICATION
{
ULONG ulEvent; // mount points changed
VDS_OBJECT_ID volumeId;
} VDS_MOUNT_POINT_NOTIFICATION;
typedef struct _VDS_SUB_SYSTEM_NOTIFICATION
{
ULONG ulEvent;
VDS_OBJECT_ID subSystemId;
} VDS_SUB_SYSTEM_NOTIFICATION;
typedef struct _VDS_CONTROLLER_NOTIFICATION
{
ULONG ulEvent;
VDS_OBJECT_ID controllerId;
} VDS_CONTROLLER_NOTIFICATION;
typedef struct _VDS_DRIVE_NOTIFICATION
{
ULONG ulEvent;
VDS_OBJECT_ID driveId;
} VDS_DRIVE_NOTIFICATION;
typedef struct _VDS_LUN_NOTIFICATION
{
ULONG ulEvent;
VDS_OBJECT_ID LunId;
} VDS_LUN_NOTIFICATION;
typedef struct _VDS_PORT_NOTIFICATION
{
ULONG ulEvent;
VDS_OBJECT_ID portId;
} VDS_PORT_NOTIFICATION;
typedef struct _VDS_PORTAL_NOTIFICATION
{
ULONG ulEvent;
VDS_OBJECT_ID portalId;
} VDS_PORTAL_NOTIFICATION;
typedef struct _VDS_TARGET_NOTIFICATION
{
ULONG ulEvent;
VDS_OBJECT_ID targetId;
} VDS_TARGET_NOTIFICATION;
typedef struct _VDS_PORTAL_GROUP_NOTIFICATION
{
ULONG ulEvent;
VDS_OBJECT_ID portalGroupId;
} VDS_PORTAL_GROUP_NOTIFICATION;
typedef struct _VDS_NOTIFICATION
{
VDS_NOTIFICATION_TARGET_TYPE objectType;
[switch_is(objectType)] union
{
[case(VDS_NTT_PACK)]
VDS_PACK_NOTIFICATION Pack;
[case(VDS_NTT_DISK)]
VDS_DISK_NOTIFICATION Disk;
[case(VDS_NTT_VOLUME)]
VDS_VOLUME_NOTIFICATION Volume;
[case(VDS_NTT_PARTITION)]
VDS_PARTITION_NOTIFICATION Partition;
[case(VDS_NTT_DRIVE_LETTER)]
VDS_DRIVE_LETTER_NOTIFICATION Letter;
[case(VDS_NTT_FILE_SYSTEM)]
VDS_FILE_SYSTEM_NOTIFICATION FileSystem;
[case(VDS_NTT_MOUNT_POINT)]
VDS_MOUNT_POINT_NOTIFICATION MountPoint;
[case(VDS_NTT_SUB_SYSTEM)]
VDS_SUB_SYSTEM_NOTIFICATION SubSystem;
[case(VDS_NTT_CONTROLLER)]
VDS_CONTROLLER_NOTIFICATION Controller;
[case(VDS_NTT_DRIVE)]
VDS_DRIVE_NOTIFICATION Drive;
[case(VDS_NTT_LUN)]
VDS_LUN_NOTIFICATION Lun;
[case(VDS_NTT_PORT)]
VDS_PORT_NOTIFICATION Port;
[case(VDS_NTT_PORTAL)]
VDS_PORTAL_NOTIFICATION Portal;
[case(VDS_NTT_TARGET)]
VDS_TARGET_NOTIFICATION Target;
[case(VDS_NTT_PORTAL_GROUP)]
VDS_PORTAL_GROUP_NOTIFICATION PortalGroup;
[case(VDS_NTT_SERVICE)]
VDS_SERVICE_NOTIFICATION Service;
[default];
};
} VDS_NOTIFICATION;
//
// Async Output Type
//
typedef enum _VDS_ASYNC_OUTPUT_TYPE
{
VDS_ASYNCOUT_UNKNOWN = 0,
VDS_ASYNCOUT_CREATEVOLUME = 1,
VDS_ASYNCOUT_EXTENDVOLUME = 2,
VDS_ASYNCOUT_SHRINKVOLUME = 3,
VDS_ASYNCOUT_ADDVOLUMEPLEX = 4,
VDS_ASYNCOUT_BREAKVOLUMEPLEX = 5,
VDS_ASYNCOUT_REMOVEVOLUMEPLEX = 6,
VDS_ASYNCOUT_REPAIRVOLUMEPLEX = 7,
VDS_ASYNCOUT_RECOVERPACK = 8,
VDS_ASYNCOUT_REPLACEDISK = 9,
VDS_ASYNCOUT_CREATEPARTITION = 10,
VDS_ASYNCOUT_CLEAN = 11,
VDS_ASYNCOUT_CREATELUN = 50,
// VDS_ASYNCOUT_BREAKLUNPLEX = 51, // ** DEPRECATED **
VDS_ASYNCOUT_ADDLUNPLEX = 52,
VDS_ASYNCOUT_REMOVELUNPLEX = 53,
VDS_ASYNCOUT_EXTENDLUN = 54,
VDS_ASYNCOUT_SHRINKLUN = 55,
VDS_ASYNCOUT_RECOVERLUN = 56,
// iSCSI related asyncs
VDS_ASYNCOUT_LOGINTOTARGET = 60,
VDS_ASYNCOUT_LOGOUTFROMTARGET = 61,
VDS_ASYNCOUT_CREATETARGET = 62,
VDS_ASYNCOUT_CREATEPORTALGROUP = 63,
VDS_ASYNCOUT_DELETETARGET = 64,
VDS_ASYNCOUT_ADDPORTAL = 65,
VDS_ASYNCOUT_REMOVEPORTAL = 66,
VDS_ASYNCOUT_DELETEPORTALGROUP = 67,
VDS_ASYNCOUT_FORMAT = 101,
//
// Virtual disk related output.
//
VDS_ASYNCOUT_CREATE_VDISK = 200,
VDS_ASYNCOUT_ATTACH_VDISK = 201,
VDS_ASYNCOUT_COMPACT_VDISK = 202,
VDS_ASYNCOUT_MERGE_VDISK = 203,
VDS_ASYNCOUT_EXPAND_VDISK = 204
} VDS_ASYNC_OUTPUT_TYPE;
typedef struct _VDS_ASYNC_OUTPUT
{
VDS_ASYNC_OUTPUT_TYPE type;
[switch_is(type)] union
{
// CreatePartition() or CreatePartitionEx() return value.
[case(VDS_ASYNCOUT_CREATEPARTITION)]
struct _cp
{
ULONGLONG ullOffset; // acual offset of the create partition
VDS_OBJECT_ID volumeId; // ID of the associated volume if the
// partition is a volume.
} cp;
// CreateVolume() return value
[case(VDS_ASYNCOUT_CREATEVOLUME)]
struct _cv
{
IUnknown *pVolumeUnk;
} cv;
// BreakPlex() return value
[case(VDS_ASYNCOUT_BREAKVOLUMEPLEX)]
struct _bvp
{
IUnknown *pVolumeUnk;
} bvp;
// Shrink() return value
[case(VDS_ASYNCOUT_SHRINKVOLUME)]
struct _sv
{
ULONGLONG ullReclaimedBytes; // actual number of reclaimed bytes
} sv;
[case(VDS_ASYNCOUT_CREATELUN)]
struct _cl
{
IUnknown *pLunUnk;
} cl;
/** DEPRECATED **
* [case(VDS_ASYNCOUT_BREAKLUNPLEX)]
* struct _blp
* {
* IUnknown *pLunUnk;
*
* } blp;
*/
// CreateTarget() return value
[case(VDS_ASYNCOUT_CREATETARGET)]
struct _ct
{
IUnknown *pTargetUnk;
} ct;
// CreatePortalGroup() return value
[case(VDS_ASYNCOUT_CREATEPORTALGROUP)]
struct _cpg
{
IUnknown *pPortalGroupUnk;
} cpg;
[case(VDS_ASYNCOUT_CREATE_VDISK)]
struct _cvd
{
IUnknown *pVDiskUnk;
} cvd;
[default];
};
} VDS_ASYNC_OUTPUT;
//
// iSCSI Portal Group Tags
//
typedef USHORT VDS_ISCSI_PORTALGROUP_TAG;
//
// IP address type
//
typedef enum VDS_IPADDRESS_TYPE
{
VDS_IPT_TEXT = 0,
VDS_IPT_IPV4 = 1,
VDS_IPT_IPV6 = 2,
VDS_IPT_EMPTY = 3
} VDS_IPADDRESS_TYPE;
//
// Object Health
//
typedef enum _VDS_HEALTH
{
VDS_H_UNKNOWN = 0,
VDS_H_HEALTHY = 1,
VDS_H_REBUILDING = 2,
VDS_H_STALE = 3,
VDS_H_FAILING = 4,
VDS_H_FAILING_REDUNDANCY = 5,
VDS_H_FAILED_REDUNDANCY = 6,
VDS_H_FAILED_REDUNDANCY_FAILING = 7,
VDS_H_FAILED = 8,
VDS_H_REPLACED = 9,
VDS_H_PENDING_FAILURE = 10,
VDS_H_DEGRADED = 11
} VDS_HEALTH;
//
// Object TransitionState (configuration stability)
//
typedef enum _VDS_TRANSITION_STATE
{
VDS_TS_UNKNOWN = 0,
VDS_TS_STABLE = 1,
VDS_TS_EXTENDING = 2,
VDS_TS_SHRINKING = 3,
VDS_TS_RECONFIGING = 4, // Volume is changing location on disk.
VDS_TS_RESTRIPING = 5
} VDS_TRANSITION_STATE;
//
// File System Types
// NOTE: IVdsAdvancedDisk::FormatPartition() method in the software provider
// interface references this type, although this method is implemented
// only by the service.
//
typedef enum _VDS_FILE_SYSTEM_TYPE
{
VDS_FST_UNKNOWN = 0,
VDS_FST_RAW,
VDS_FST_FAT,
VDS_FST_FAT32,
VDS_FST_NTFS,
VDS_FST_CDFS,
VDS_FST_UDF,
VDS_FST_EXFAT
} VDS_FILE_SYSTEM_TYPE;
//
// --- HBA port related enums ---
//
//
// Types
//
typedef enum _VDS_HBAPORT_TYPE
{
// These types correspond to the definitions in the HBA API
VDS_HPT_UNKNOWN = 1, // Unknown
VDS_HPT_OTHER = 2, // Other
VDS_HPT_NOTPRESENT = 3, // Not present
VDS_HPT_NPORT = 5, // Fabric
VDS_HPT_NLPORT = 6, // Public Loop
VDS_HPT_FLPORT = 7, // Fabric on a Loop
VDS_HPT_FPORT = 8, // Fabric Port
VDS_HPT_EPORT = 9, // Fabric Expansion Port
VDS_HPT_GPORT = 10, // Generic Fabric Port
VDS_HPT_LPORT = 20, // Private Loop
VDS_HPT_PTP = 21 // Point to Point
} VDS_HBAPORT_TYPE;
//
// Status
//
typedef enum _VDS_HBAPORT_STATUS
{
// These states correspond to the definitions in the HBA API
VDS_HPS_UNKNOWN = 1, // Unknown
VDS_HPS_ONLINE = 2, // Operational
VDS_HPS_OFFLINE = 3, // User Offline
VDS_HPS_BYPASSED = 4, // Bypassed
VDS_HPS_DIAGNOSTICS = 5, // In Diagnostics Mode
VDS_HPS_LINKDOWN = 6, // Link Down
VDS_HPS_ERROR = 7, // Port Error
VDS_HPS_LOOPBACK = 8 // Loopback
} VDS_HBAPORT_STATUS;
//
// Flags
//
typedef enum _VDS_HBAPORT_SPEED_FLAG
{
// These flags correspond to the definitions in the HBA API
VDS_HSF_UNKNOWN = 0x0, // Unknown - transceiver incapable of reporting
VDS_HSF_1GBIT = 0x1, // 1 GBit/sec
VDS_HSF_2GBIT = 0x2, // 2 GBit/sec
VDS_HSF_10GBIT = 0x4, // 10 GBit/sec
VDS_HSF_4GBIT = 0x8, // 4 GBit/sec
VDS_HSF_NOT_NEGOTIATED = (1 << 15) // Speed not established
} VDS_HBAPORT_SPEED_FLAG;
//
// --- MPIO related enums ---
//
//
// Path Status
//
typedef enum _VDS_PATH_STATUS
{
VDS_MPS_UNKNOWN = STATUS_UNKNOWN,
VDS_MPS_ONLINE = STATUS_ONLINE,
VDS_MPS_FAILED = STATUS_FAILED,
VDS_MPS_STANDBY = STATUS_STANDBY
} VDS_PATH_STATUS;
//
// Load balance policy
//
typedef enum _VDS_LOADBALANCE_POLICY_ENUM
{
VDS_LBP_UNKNOWN = 0,
VDS_LBP_FAILOVER = 1,
VDS_LBP_ROUND_ROBIN = 2,
VDS_LBP_ROUND_ROBIN_WITH_SUBSET = 3,
VDS_LBP_DYN_LEAST_QUEUE_DEPTH = 4,
VDS_LBP_WEIGHTED_PATHS = 5,
VDS_LBP_LEAST_BLOCKS = 6,
VDS_LBP_VENDOR_SPECIFIC = 7
} VDS_LOADBALANCE_POLICY_ENUM;
//
// Load Balance Policy Support Flags
//
typedef enum _VDS_PROVIDER_LBSUPPORT_FLAG
{
VDS_LBF_FAILOVER = 0x01,
VDS_LBF_ROUND_ROBIN = 0x02,
VDS_LBF_ROUND_ROBIN_WITH_SUBSET = 0x04,
VDS_LBF_DYN_LEAST_QUEUE_DEPTH = 0x08,
VDS_LBF_WEIGHTED_PATHS = 0x10,
VDS_LBF_LEAST_BLOCKS = 0x20,
VDS_LBF_VENDOR_SPECIFIC = 0x40
} VDS_PROVIDER_LBSUPPORT_FLAG;
//
// --- Provider related enums ---
//
//
// Version Support Flags
//
typedef enum _VDS_VERSION_SUPPORT_FLAG
{
VDS_VSF_1_0 = 0x01,
VDS_VSF_1_1 = 0x02,
VDS_VSF_2_0 = 0x04,
VDS_VSF_2_1 = 0x08,
VDS_VSF_3_0 = 0x10
} VDS_VERSION_SUPPORT_FLAG;
//
// --- HwProvider related enums ---
//
//
// Types
//
typedef enum _VDS_HWPROVIDER_TYPE
{
VDS_HWT_UNKNOWN = 0,
VDS_HWT_PCI_RAID = 1,
VDS_HWT_FIBRE_CHANNEL = 2,
VDS_HWT_ISCSI = 3,
VDS_HWT_SAS = 4,
VDS_HWT_HYBRID = 5
} VDS_HWPROVIDER_TYPE;
//
// --- iSCSI related enums ---
//
//
// Login Types
//
typedef enum _VDS_ISCSI_LOGIN_TYPE
{
VDS_ILT_MANUAL = 0,
VDS_ILT_PERSISTENT = 1,
VDS_ILT_BOOT = 2
} VDS_ISCSI_LOGIN_TYPE;
//
// Authorization Types
//
typedef enum _VDS_ISCSI_AUTH_TYPE
{
VDS_IAT_NONE = 0,
VDS_IAT_CHAP = 1,
VDS_IAT_MUTUAL_CHAP = 2
} VDS_ISCSI_AUTH_TYPE;
//
// IPSEC Flags
//
typedef enum _VDS_ISCSI_IPSEC_FLAG
{
// These flags correspond to the definitions in the iSNS portal security bitmap
VDS_IIF_VALID = 0x01,
VDS_IIF_IKE = 0x02,
VDS_IIF_MAIN_MODE = 0x04,
VDS_IIF_AGGRESSIVE_MODE = 0x08,
VDS_IIF_PFS_ENABLE = 0x10,
VDS_IIF_TRANSPORT_MODE_PREFERRED = 0x20,
VDS_IIF_TUNNEL_MODE_PREFERRED = 0x40
} VDS_ISCSI_IPSEC_FLAG;
//
// Login Flags
//
typedef enum _VDS_ISCSI_LOGIN_FLAG
{
VDS_ILF_REQUIRE_IPSEC = 0x1,
VDS_ILF_MULTIPATH_ENABLED = 0x2
} VDS_ISCSI_LOGIN_FLAG;
//
// --- Miscellaneous Structures ---
//
//
// Path IDs
//
typedef struct _VDS_PATH_ID
{
ULONGLONG ullSourceId;
ULONGLONG ullPathId;
} VDS_PATH_ID;
//
// World Wide Name
//
typedef struct _VDS_WWN
{
// This structure corresponds to the HBA_WWN structure in the HBA API
UCHAR rguchWwn[8];
} VDS_WWN;
//
// IP Address
//
typedef struct _VDS_IPADDRESS
{
VDS_IPADDRESS_TYPE type;
ULONG ipv4Address;
UCHAR ipv6Address[16];
ULONG ulIpv6FlowInfo;
ULONG ulIpv6ScopeId;
WCHAR wszTextAddress[256 + 1];
ULONG ulPort;
} VDS_IPADDRESS;
//
// IPSEC Key
//
typedef struct _VDS_ISCSI_IPSEC_KEY
{
[size_is(ulKeySize)] UCHAR* pKey;
ULONG ulKeySize;
} VDS_ISCSI_IPSEC_KEY;
//
// CHAP Shared Secret
//
typedef struct _VDS_ISCSI_SHARED_SECRET
{
[size_is(ulSharedSecretSize)] UCHAR* pSharedSecret;
ULONG ulSharedSecretSize;
} VDS_ISCSI_SHARED_SECRET;
//
// --- VDS Object Properties ---
//
//
// HBA port properties
//
typedef struct _VDS_HBAPORT_PROP
{
VDS_OBJECT_ID id;
VDS_WWN wwnNode;
VDS_WWN wwnPort;
VDS_HBAPORT_TYPE type;
VDS_HBAPORT_STATUS status;
ULONG ulPortSpeed;
ULONG ulSupportedPortSpeed;
} VDS_HBAPORT_PROP;
//
// Initiator adapter properties
//
typedef struct _VDS_ISCSI_INITIATOR_ADAPTER_PROP
{
VDS_OBJECT_ID id;
[string] LPWSTR pwszName;
} VDS_ISCSI_INITIATOR_ADAPTER_PROP;
//
// Initiator portal properties
//
typedef struct _VDS_ISCSI_INITIATOR_PORTAL_PROP
{
VDS_OBJECT_ID id;
VDS_IPADDRESS address;
ULONG ulPortIndex;
} VDS_ISCSI_INITIATOR_PORTAL_PROP;
//
// Provider properties
//
typedef struct _VDS_PROVIDER_PROP
{
VDS_OBJECT_ID id;
[string] LPWSTR pwszName;
GUID guidVersionId;
[string] LPWSTR pwszVersion;
VDS_PROVIDER_TYPE type;
ULONG ulFlags;
ULONG ulStripeSizeFlags;
// This is for software provider only.
// Stripe size must be a power of 2. Each bit in the 32-bit integer
// represents a size. For example, if the nth bit is set, then stripe
// size of 2^n is supported. So bit 0 - through bit 31 can specify
// 2^0 through 2^31, which should be more than enough.
// Basic provider should set this to 0.
SHORT sRebuildPriority;
// This is for software provider only.
// All volumes managed by a provider have the same rebuild priority.
} VDS_PROVIDER_PROP;
//
// --- MPIO related Structures ---
//
//
// Path Information
//
typedef struct _VDS_PATH_INFO
{
VDS_PATH_ID pathId;
VDS_HWPROVIDER_TYPE type;
VDS_PATH_STATUS status;
// subsystem-side endpoint of the path
[switch_is(type)] union
{
[case(VDS_HWT_FIBRE_CHANNEL,VDS_HWT_SAS)]
VDS_OBJECT_ID controllerPortId;
[case(VDS_HWT_ISCSI)]
VDS_OBJECT_ID targetPortalId;
[default];
};
// local server-side endpoint of the path
[switch_is(type)] union
{
[case(VDS_HWT_FIBRE_CHANNEL,VDS_HWT_SAS)]
VDS_OBJECT_ID hbaPortId;
[case(VDS_HWT_ISCSI)]
VDS_OBJECT_ID initiatorAdapterId;
[default];
};
// additional information about the local server-side endpoint of the path
[switch_is(type)] union
{
[case(VDS_HWT_FIBRE_CHANNEL,VDS_HWT_SAS)]
VDS_HBAPORT_PROP* pHbaPortProp;
[case(VDS_HWT_ISCSI)]
VDS_IPADDRESS* pInitiatorPortalIpAddr;
[default];
};
} VDS_PATH_INFO;
//
// Path Policy
//
typedef struct _VDS_PATH_POLICY
{
VDS_PATH_ID pathId;
BOOL bPrimaryPath;
ULONG ulWeight; // only relevant for VDS_LBP_WEIGHTED_PATHS
} VDS_PATH_POLICY;
//
// LUN info data
//
import "vdslun.idl";
//
// --- Interface definitions ---
//
//
// IEnumVdsObject:
// This is an interface pointer to a generic VDS objects collection. Object
// can be providers, packs, volumes, disks, SubSystems, Controllers and
// spindles. But different types of objects do not mix in a collection.
// Implemented by: enum object
//
[
object,
uuid(118610b7-8d94-4030-b5b8-500889788e4e),
pointer_default(unique)
]
interface IEnumVdsObject : IUnknown
{
[helpstring("method Next")]
HRESULT Next(
[in] ULONG celt,
[out, size_is(celt), length_is(*pcFetched)]
IUnknown **ppObjectArray,
[out] ULONG *pcFetched
);
[helpstring("method Skip")]
HRESULT Skip(
[in] ULONG celt
);
[helpstring("method Reset")]
HRESULT Reset(
void
);
[helpstring("method Clone")]
HRESULT Clone(
[out] IEnumVdsObject **ppEnum
);
}
//
// IVdsAsync:
// Implemented by: async object
//
[
object,
uuid(d5d23b6d-5a55-4492-9889-397a3c2d2dbc),
pointer_default(unique)
]
interface IVdsAsync : IUnknown
{
[helpstring("method Cancel")]
HRESULT Cancel(
void
);
// Wait:
// If the asynchronous operation needs to return a result, it is
// returned through VDS_ASYNC_OUTPUT. Otherwise, the second argument
// is ignored.
[helpstring("method Wait")]
HRESULT Wait(
[out] HRESULT *pHrResult,
[out] VDS_ASYNC_OUTPUT *pAsyncOut
);
//QueryStatus:
// The argument reflects the progress of the operation Format.
// For CreateVolume, CreateLun, etc. the value is set to -1 to
// mean nothing. We want it so that simple programs/scripts that
// do not want to handle notification can still get progress info.
[helpstring("method QueryStatus")]
HRESULT QueryStatus(
[out] HRESULT *pHrResult,
[out] ULONG *pulPercentCompleted
);
}
//
// IVdsAdviseSink:
// Applications register this interface with the service in order to receive
// notifications from it. The service registers this interface with the
// providers in order to receive notifications from them, which it can also
// pass to the applications.
// Implemented by: callback object
// Implemented where: application, common layer
//
[
object,
uuid(8326cd1d-cf59-4936-b786-5efc08798e25),
pointer_default(unique)
]
interface IVdsAdviseSink : IUnknown
{
[helpstring("method OnNotify")]
HRESULT OnNotify(
[in, range(1, 100)] LONG lNumberOfNotifications,
[in, size_is(lNumberOfNotifications)]
VDS_NOTIFICATION *pNotificationArray
);
}
//
// IVdsProvider:
// Implemented by: provider object
// Implemented where: providers, common layer
// Accessed by: applications
//
[
object,
uuid(10c5e575-7984-4e81-a56b-431f5f92ae42),
pointer_default(unique)
]
interface IVdsProvider : IUnknown
{
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_PROVIDER_PROP *pProviderProp
);
}
//
// IVdsProviderSupport:
// Implemented by: provider object
// Implemented where: providers, common layer
// Accessed by: applications
//
[
object,
uuid(1732be13-e8f9-4a03-bfbc-5f616aa66ce1),
pointer_default(unique)
]
interface IVdsProviderSupport : IUnknown
{
[helpstring("method GetVersionSupport")]
HRESULT GetVersionSupport(
[out] ULONG *ulVersionSupport
);
}