xpmgr/BuildTools/Include/vdshp.idl

2150 lines
58 KiB
Plaintext
Raw Blame History

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000
//
// File: vdshp.idl
//
// Abstract:
// declarations of interfaces and types implemented by hardware provider
// and also exposed by the common layer.
//
//----------------------------------------------------------------------------
interface IVdsHwProvider;
interface IVdsHwProviderType;
interface IVdsHwProviderType2;
interface IVdsHwProviderStoragePools;
interface IVdsLun;
interface IVdsLun2;
interface IVdsLunNaming;
interface IVdsLunNumber;
interface IVdsLunControllerPorts;
interface IVdsLunMpio;
interface IVdsSubSystem;
interface IVdsSubSystemNaming;
interface IVdsSubSystemIscsi;
interface IVdsSubSystem2;
interface IVdsSubSystemInterconnect;
interface IVdsControllerPort;
interface IVdsController;
interface IVdsControllerControllerPort;
interface IVdsDrive;
interface IVdsDrive2;
interface IVdsLunPlex;
interface IVdsIscsiPortal;
interface IVdsIscsiTarget;
interface IVdsIscsiPortalGroup;
interface IVdsStoragePool;
interface IVdsMaintenance;
//
// --- SubSystem related enums ---
//
//
// Status
//
typedef enum _VDS_SUB_SYSTEM_STATUS
{
VDS_SSS_UNKNOWN = STATUS_UNKNOWN,
VDS_SSS_ONLINE = STATUS_ONLINE,
VDS_SSS_NOT_READY = STATUS_NOT_READY,
VDS_SSS_OFFLINE = STATUS_OFFLINE,
VDS_SSS_FAILED = STATUS_FAILED,
VDS_SSS_PARTIALLY_MANAGED = STATUS_PARTIALLY_MANAGED
} VDS_SUB_SYSTEM_STATUS;
//
// Flags
//
typedef enum _VDS_SUB_SYSTEM_FLAG
{
VDS_SF_LUN_MASKING_CAPABLE = 0x00001,
VDS_SF_LUN_PLEXING_CAPABLE = 0x00002,
VDS_SF_LUN_REMAPPING_CAPABLE = 0x00004,
VDS_SF_DRIVE_EXTENT_CAPABLE = 0x00008,
VDS_SF_HARDWARE_CHECKSUM_CAPABLE = 0x00010,
// VDS 1.1 specific flags
VDS_SF_RADIUS_CAPABLE = 0x00020,
VDS_SF_READ_BACK_VERIFY_CAPABLE = 0x00040,
VDS_SF_WRITE_THROUGH_CACHING_CAPABLE = 0x00080,
VDS_SF_SUPPORTS_FAULT_TOLERANT_LUNS = 0x00200,
VDS_SF_SUPPORTS_NON_FAULT_TOLERANT_LUNS = 0x00400,
VDS_SF_SUPPORTS_SIMPLE_LUNS = 0x00800,
VDS_SF_SUPPORTS_SPAN_LUNS = 0x01000,
VDS_SF_SUPPORTS_STRIPE_LUNS = 0x02000,
VDS_SF_SUPPORTS_MIRROR_LUNS = 0x04000,
VDS_SF_SUPPORTS_PARITY_LUNS = 0x08000,
// iSCSI specific flags
VDS_SF_SUPPORTS_AUTH_CHAP = 0x10000,
VDS_SF_SUPPORTS_AUTH_MUTUAL_CHAP = 0x20000,
VDS_SF_SUPPORTS_SIMPLE_TARGET_CONFIG = 0x40000,
// Win7 flags
VDS_SF_SUPPORTS_LUN_NUMBER = 0x80000,
VDS_SF_SUPPORTS_MIRRORED_CACHE = 0x100000,
VDS_SF_READ_CACHING_CAPABLE = 0x200000,
VDS_SF_WRITE_CACHING_CAPABLE = 0x400000,
VDS_SF_MEDIA_SCAN_CAPABLE = 0x800000,
VDS_SF_CONSISTENCY_CHECK_CAPABLE = 0x1000000
} VDS_SUB_SYSTEM_FLAG;
//
// Supported raid type flag
//
typedef enum _VDS_SUB_SYSTEM_SUPPORTED_RAID_TYPE_FLAG
{
VDS_SF_SUPPORTS_RAID2_LUNS = 0x00001,
VDS_SF_SUPPORTS_RAID3_LUNS = 0x00002,
VDS_SF_SUPPORTS_RAID4_LUNS = 0x00004,
VDS_SF_SUPPORTS_RAID5_LUNS = 0x00008,
VDS_SF_SUPPORTS_RAID6_LUNS = 0x00010,
VDS_SF_SUPPORTS_RAID01_LUNS = 0x00020,
VDS_SF_SUPPORTS_RAID03_LUNS = 0x00040,
VDS_SF_SUPPORTS_RAID05_LUNS = 0x00080,
VDS_SF_SUPPORTS_RAID10_LUNS = 0x00100,
VDS_SF_SUPPORTS_RAID15_LUNS = 0x00200,
VDS_SF_SUPPORTS_RAID30_LUNS = 0x00400,
VDS_SF_SUPPORTS_RAID50_LUNS = 0x00800,
VDS_SF_SUPPORTS_RAID51_LUNS = 0x01000,
VDS_SF_SUPPORTS_RAID53_LUNS = 0x02000,
VDS_SF_SUPPORTS_RAID60_LUNS = 0x04000,
VDS_SF_SUPPORTS_RAID61_LUNS = 0x08000,
} VDS_SUB_SYSTEM_SUPPORTED_RAID_TYPE_FLAG;
//
// Supported interconnects flag
//
typedef enum _VDS_INTERCONNECT_FLAG
{
VDS_ITF_PCI_RAID = 0x1,
VDS_ITF_FIBRE_CHANNEL = 0x2,
VDS_ITF_ISCSI = 0x4,
VDS_ITF_SAS = 0x8
} VDS_INTERCONNECT_FLAG;
//
// --- Controller related enums ---
//
//
// Status
//
typedef enum _VDS_CONTROLLER_STATUS
{
VDS_CS_UNKNOWN = STATUS_UNKNOWN,
VDS_CS_ONLINE = STATUS_ONLINE,
VDS_CS_NOT_READY = STATUS_NOT_READY,
VDS_CS_OFFLINE = STATUS_OFFLINE,
VDS_CS_FAILED = STATUS_FAILED,
VDS_CS_REMOVED = STATUS_REMOVED
} VDS_CONTROLLER_STATUS;
//
// --- Controller Port related enums ---
//
//
// Status
//
typedef enum _VDS_PORT_STATUS
{
VDS_PRS_UNKNOWN = STATUS_UNKNOWN,
VDS_PRS_ONLINE = STATUS_ONLINE,
VDS_PRS_NOT_READY = STATUS_NOT_READY,
VDS_PRS_OFFLINE = STATUS_OFFLINE,
VDS_PRS_FAILED = STATUS_FAILED,
VDS_PRS_REMOVED = STATUS_REMOVED
} VDS_PORT_STATUS;
//
// --- Drive related enums ---
//
//
// Status
//
typedef enum _VDS_DRIVE_STATUS
{
VDS_DRS_UNKNOWN = STATUS_UNKNOWN,
VDS_DRS_ONLINE = STATUS_ONLINE,
VDS_DRS_NOT_READY = STATUS_NOT_READY,
VDS_DRS_OFFLINE = STATUS_OFFLINE,
VDS_DRS_FAILED = STATUS_FAILED,
VDS_DRS_REMOVED = STATUS_REMOVED
} VDS_DRIVE_STATUS;
//
// Flags
//
typedef enum _VDS_DRIVE_FLAG
{
VDS_DRF_HOTSPARE = 0x1,
VDS_DRF_ASSIGNED = 0x2,
VDS_DRF_UNASSIGNED = 0x4,
VDS_DRF_HOTSPARE_IN_USE = 0x8,
VDS_DRF_HOTSPARE_STANDBY = 0x10
} VDS_DRIVE_FLAG;
//
// --- LUN related enums ---
//
//
// Types
//
typedef enum _VDS_LUN_TYPE
{
VDS_LT_UNKNOWN = 0,
// automagic types (used as input parameters only)
VDS_LT_DEFAULT = 1,
VDS_LT_FAULT_TOLERANT = 2,
VDS_LT_NON_FAULT_TOLERANT = 3,
// actual types (used as input and query return)
VDS_LT_SIMPLE = 10,
VDS_LT_SPAN = 11,
VDS_LT_STRIPE = 12,
VDS_LT_MIRROR = 13,
VDS_LT_PARITY = 14,
VDS_LT_RAID2 = 15,
VDS_LT_RAID3 = 16,
VDS_LT_RAID4 = 17,
VDS_LT_RAID5 = 18,
VDS_LT_RAID6 = 19,
VDS_LT_RAID01 = 20,
VDS_LT_RAID03 = 21,
VDS_LT_RAID05 = 22,
VDS_LT_RAID10 = 23,
VDS_LT_RAID15 = 24,
VDS_LT_RAID30 = 25,
VDS_LT_RAID50 = 26,
VDS_LT_RAID51 = 27,
VDS_LT_RAID53 = 28,
VDS_LT_RAID60 = 29,
VDS_LT_RAID61 = 30,
} VDS_LUN_TYPE;
//
// Status
//
typedef enum _VDS_LUN_STATUS
{
VDS_LS_UNKNOWN = STATUS_UNKNOWN,
VDS_LS_ONLINE = STATUS_ONLINE,
VDS_LS_NOT_READY = STATUS_NOT_READY,
VDS_LS_OFFLINE = STATUS_OFFLINE,
VDS_LS_FAILED = STATUS_FAILED
} VDS_LUN_STATUS;
//
// Flags
//
typedef enum _VDS_LUN_FLAG
{
VDS_LF_LBN_REMAP_ENABLED = 0x01,
VDS_LF_READ_BACK_VERIFY_ENABLED = 0x02,
VDS_LF_WRITE_THROUGH_CACHING_ENABLED = 0x04,
VDS_LF_HARDWARE_CHECKSUM_ENABLED = 0x08,
VDS_LF_READ_CACHE_ENABLED = 0x10,
VDS_LF_WRITE_CACHE_ENABLED = 0x20,
VDS_LF_MEDIA_SCAN_ENABLED = 0x40,
VDS_LF_CONSISTENCY_CHECK_ENABLED = 0x80,
VDS_LF_SNAPSHOT = 0x100
} VDS_LUN_FLAG;
//
// --- LUN plex related enums ---
//
//
// Types
//
typedef enum _VDS_LUN_PLEX_TYPE
{
VDS_LPT_UNKNOWN = 0,
VDS_LPT_SIMPLE = VDS_LT_SIMPLE,
VDS_LPT_SPAN = VDS_LT_SPAN,
VDS_LPT_STRIPE = VDS_LT_STRIPE,
VDS_LPT_PARITY = VDS_LT_PARITY,
VDS_LPT_RAID2 = VDS_LT_RAID2,
VDS_LPT_RAID3 = VDS_LT_RAID3,
VDS_LPT_RAID4 = VDS_LT_RAID4,
VDS_LPT_RAID5 = VDS_LT_RAID5,
VDS_LPT_RAID6 = VDS_LT_RAID6,
VDS_LPT_RAID03 = VDS_LT_RAID03,
VDS_LPT_RAID05 = VDS_LT_RAID05,
VDS_LPT_RAID10 = VDS_LT_RAID10,
VDS_LPT_RAID15 = VDS_LT_RAID15,
VDS_LPT_RAID30 = VDS_LT_RAID30,
VDS_LPT_RAID50 = VDS_LT_RAID50,
VDS_LPT_RAID53 = VDS_LT_RAID53,
VDS_LPT_RAID60 = VDS_LT_RAID60,
} VDS_LUN_PLEX_TYPE;
//
// Status
//
typedef enum _VDS_LUN_PLEX_STATUS
{
VDS_LPS_UNKNOWN = STATUS_UNKNOWN,
VDS_LPS_ONLINE = STATUS_ONLINE,
VDS_LPS_NOT_READY = STATUS_NOT_READY,
VDS_LPS_OFFLINE = STATUS_OFFLINE,
VDS_LPS_FAILED = STATUS_FAILED
} VDS_LUN_PLEX_STATUS;
typedef enum _VDS_LUN_PLEX_FLAG
{
VDS_LPF_LBN_REMAP_ENABLED = VDS_LF_LBN_REMAP_ENABLED
} VDS_LUN_PLEX_FLAG;
//
// --- iSCSI portal related enums ---
//
//
// Status
//
typedef enum _VDS_ISCSI_PORTAL_STATUS
{
VDS_IPS_UNKNOWN = STATUS_UNKNOWN,
VDS_IPS_ONLINE = STATUS_ONLINE,
VDS_IPS_NOT_READY = STATUS_NOT_READY,
VDS_IPS_OFFLINE = STATUS_OFFLINE,
VDS_IPS_FAILED = STATUS_FAILED
} VDS_ISCSI_PORTAL_STATUS;
//
// --- Storage Pool related enums ---
//
//
// Status
//
typedef enum _VDS_STORAGE_POOL_STATUS
{
VDS_SPS_UNKNOWN = STATUS_UNKNOWN,
VDS_SPS_ONLINE = STATUS_ONLINE,
VDS_SPS_NOT_READY = STATUS_NOT_READY,
VDS_SPS_OFFLINE = STATUS_OFFLINE
} VDS_STORAGE_POOL_STATUS;
//
// Pool type
// Note: The values are used as flags
// So, if a new type is added, its
// value should be 0x04.
//
typedef enum _VDS_STORAGE_POOL_TYPE
{
VDS_SPT_UNKNOWN = 0x00,
VDS_SPT_PRIMORDIAL = 0x01,
VDS_SPT_CONCRETE = 0x02
} VDS_STORAGE_POOL_TYPE;
//
// --- Miscellaneous enums ---
//
//
// Maintenance Operations
//
typedef enum _VDS_MAINTENANCE_OPERATION
{
BlinkLight = 1,
BeepAlarm = 2,
SpinDown = 3,
SpinUp = 4,
Ping = 5
} VDS_MAINTENANCE_OPERATION;
//
// Hints for creating a LUN
//
typedef struct _VDS_HINTS
{
ULONGLONG ullHintMask;
ULONGLONG ullExpectedMaximumSize;
ULONG ulOptimalReadSize; // 0 indicates no optimal size
ULONG ulOptimalReadAlignment; // 0 indicates no optimal alignment
ULONG ulOptimalWriteSize; // 0 indicates no optimal size
ULONG ulOptimalWriteAlignment; // 0 indicates no optimal alignment
ULONG ulMaximumDriveCount; // 0 indicates no maximum
ULONG ulStripeSize; // 0 indicates unspecified stripe size
BOOL bFastCrashRecoveryRequired;
BOOL bMostlyReads;
BOOL bOptimizeForSequentialReads;
BOOL bOptimizeForSequentialWrites;
BOOL bRemapEnabled;
BOOL bReadBackVerifyEnabled;
BOOL bWriteThroughCachingEnabled;
BOOL bHardwareChecksumEnabled;
BOOL bIsYankable; // No migration prior to media
SHORT sRebuildPriority;
} VDS_HINTS, *PVDS_HINTS;
const ULONGLONG VDS_HINT_FASTCRASHRECOVERYREQUIRED = 0x0000000000000001L;
const ULONGLONG VDS_HINT_MOSTLYREADS = 0x0000000000000002L;
const ULONGLONG VDS_HINT_OPTIMIZEFORSEQUENTIALREADS = 0x0000000000000004L;
const ULONGLONG VDS_HINT_OPTIMIZEFORSEQUENTIALWRITES= 0x0000000000000008L;
const ULONGLONG VDS_HINT_READBACKVERIFYENABLED = 0x0000000000000010L;
const ULONGLONG VDS_HINT_REMAPENABLED = 0x0000000000000020L;
const ULONGLONG VDS_HINT_WRITETHROUGHCACHINGENABLED = 0x0000000000000040L;
const ULONGLONG VDS_HINT_HARDWARECHECKSUMENABLED = 0x0000000000000080L;
const ULONGLONG VDS_HINT_ISYANKABLE = 0x0000000000000100L;
//
// New hints structure for creating a LUN
//
typedef struct _VDS_HINTS2
{
ULONGLONG ullHintMask;
ULONGLONG ullExpectedMaximumSize;
ULONG ulOptimalReadSize; // 0 indicates no optimal size
ULONG ulOptimalReadAlignment; // 0 indicates no optimal alignment
ULONG ulOptimalWriteSize; // 0 indicates no optimal size
ULONG ulOptimalWriteAlignment; // 0 indicates no optimal alignment
ULONG ulMaximumDriveCount; // 0 indicates no maximum
ULONG ulStripeSize; // 0 indicates unspecified stripe size
// reserved for future use
ULONG ulReserved1;
ULONG ulReserved2;
ULONG ulReserved3;
BOOL bFastCrashRecoveryRequired;
BOOL bMostlyReads;
BOOL bOptimizeForSequentialReads;
BOOL bOptimizeForSequentialWrites;
BOOL bRemapEnabled;
BOOL bReadBackVerifyEnabled;
BOOL bWriteThroughCachingEnabled;
BOOL bHardwareChecksumEnabled;
BOOL bIsYankable; // No migration prior to media
// new additions
BOOL bAllocateHotSpare;
BOOL bUseMirroredCache;
BOOL bReadCachingEnabled;
BOOL bWriteCachingEnabled;
BOOL bMediaScanEnabled;
BOOL bConsistencyCheckEnabled;
VDS_STORAGE_BUS_TYPE BusType;
// reserved for future use
BOOL bReserved1;
BOOL bReserved2;
BOOL bReserved3;
SHORT sRebuildPriority;
} VDS_HINTS2, *PVDS_HINTS2;
const ULONGLONG VDS_HINT_ALLOCATEHOTSPARE = 0x0000000000000200L;
const ULONGLONG VDS_HINT_BUSTYPE = 0x0000000000000400L;
const ULONGLONG VDS_HINT_USEMIRROREDCACHE = 0x0000000000000800L;
const ULONGLONG VDS_HINT_READCACHINGENABLED = 0x0000000000001000L;
const ULONGLONG VDS_HINT_WRITECACHINGENABLED = 0x0000000000002000L;
const ULONGLONG VDS_HINT_MEDIASCANENABLED = 0x0000000000004000L;
const ULONGLONG VDS_HINT_CONSISTENCYCHECKENABLED = 0x0000000000008000L;
//
// --- VDS Object Properties ---
//
//
// Subsytem Properties
//
typedef struct _VDS_SUB_SYSTEM_PROP
{
VDS_OBJECT_ID id;
[string] LPWSTR pwszFriendlyName;
[string] LPWSTR pwszIdentification; // The disk array's serial number, the subsystem's identifier.
ULONG ulFlags;
ULONG ulStripeSizeFlags;
VDS_SUB_SYSTEM_STATUS status;
VDS_HEALTH health; // Healthy, Failed
SHORT sNumberOfInternalBuses;
SHORT sMaxNumberOfSlotsEachBus;
SHORT sMaxNumberOfControllers;
SHORT sRebuildPriority;
} VDS_SUB_SYSTEM_PROP;
typedef struct _VDS_SUB_SYSTEM_PROP2
{
VDS_OBJECT_ID id;
[string] LPWSTR pwszFriendlyName;
[string] LPWSTR pwszIdentification; // The disk array's serial number, the subsystem's identifier.
ULONG ulFlags;
ULONG ulStripeSizeFlags;
ULONG ulSupportedRaidTypeFlags;
VDS_SUB_SYSTEM_STATUS status;
VDS_HEALTH health; // Healthy, Failed
SHORT sNumberOfInternalBuses;
SHORT sMaxNumberOfSlotsEachBus;
SHORT sMaxNumberOfControllers;
SHORT sRebuildPriority;
ULONG ulNumberOfEnclosures;
} VDS_SUB_SYSTEM_PROP2;
//
// Controller Properties
//
typedef struct _VDS_CONTROLLER_PROP
{
VDS_OBJECT_ID id;
[string] LPWSTR pwszFriendlyName;
[string] LPWSTR pwszIdentification;
VDS_CONTROLLER_STATUS status;
VDS_HEALTH health; // HEALTHY, FAILED
SHORT sNumberOfPorts; // always >= 1.
// ports are numbered starting from 0.
} VDS_CONTROLLER_PROP;
//
// Drive Properties
//
typedef struct _VDS_DRIVE_PROP
{
VDS_OBJECT_ID id;
ULONGLONG ullSize;
[string] LPWSTR pwszFriendlyName;
[string] LPWSTR pwszIdentification;
ULONG ulFlags;
VDS_DRIVE_STATUS status;
VDS_HEALTH health;
SHORT sInternalBusNumber;
SHORT sSlotNumber;
} VDS_DRIVE_PROP;
//
// Drive Properties 2
//
typedef struct _VDS_DRIVE_PROP2
{
VDS_OBJECT_ID id;
ULONGLONG ullSize;
[string] LPWSTR pwszFriendlyName;
[string] LPWSTR pwszIdentification;
ULONG ulFlags;
VDS_DRIVE_STATUS status;
VDS_HEALTH health;
SHORT sInternalBusNumber;
SHORT sSlotNumber;
ULONG ulEnclosureNumber;
VDS_STORAGE_BUS_TYPE busType;
ULONG ulSpindleSpeed;
} VDS_DRIVE_PROP2;
//
// Drive Extent
//
typedef struct _VDS_DRIVE_EXTENT
{
VDS_OBJECT_ID id;
VDS_OBJECT_ID LunId;
ULONGLONG ullSize;
BOOL bUsed;
} VDS_DRIVE_EXTENT;
//
// LUN properties
//
cpp_quote("#define VDS_REBUILD_PRIORITY_MIN 0")
cpp_quote("#define VDS_REBUILD_PRIORITY_MAX 16")
typedef struct _VDS_LUN_PROP
{
VDS_OBJECT_ID id;
ULONGLONG ullSize;
[string] LPWSTR pwszFriendlyName;
[string] LPWSTR pwszIdentification;
// This is a list of masks (or one mask) of the LUN. It specifies
// which node(s) (designated by a string meaningful to the provider)
// can access the LUN. If the LUN is not masked, pwszUnmaskingList
// should be NULL.
[string] LPWSTR pwszUnmaskingList;
ULONG ulFlags;
VDS_LUN_TYPE type;
VDS_LUN_STATUS status;
VDS_HEALTH health;
VDS_TRANSITION_STATE TransitionState;
SHORT sRebuildPriority;
} VDS_LUN_PROP, *PVDS_LUN_PROP;
//
// LUN plex properties
//
typedef struct _VDS_LUN_PLEX_PROP
{
VDS_OBJECT_ID id;
ULONGLONG ullSize;
VDS_LUN_PLEX_TYPE type;
VDS_LUN_PLEX_STATUS status;
VDS_HEALTH health;
VDS_TRANSITION_STATE TransitionState;
ULONG ulFlags;
// These properties are returned by the provider. They are
// set using VDS_HINTS as part of CreateLun or ApplyHints.
ULONG ulStripeSize;
SHORT sRebuildPriority;
} VDS_LUN_PLEX_PROP;
//
// Port properties
//
typedef struct _VDS_PORT_PROP
{
VDS_OBJECT_ID id;
[string] LPWSTR pwszFriendlyName;
[string] LPWSTR pwszIdentification;
VDS_PORT_STATUS status;
} VDS_PORT_PROP;
//
// iSCSI portal properties
//
typedef struct _VDS_ISCSI_PORTAL_PROP
{
VDS_OBJECT_ID id;
VDS_IPADDRESS address;
VDS_ISCSI_PORTAL_STATUS status;
} VDS_ISCSI_PORTAL_PROP;
//
// iSCSI target properties
//
typedef struct _VDS_ISCSI_TARGET_PROP
{
VDS_OBJECT_ID id;
[string] LPWSTR pwszIscsiName;
[string] LPWSTR pwszFriendlyName;
BOOL bChapEnabled;
} VDS_ISCSI_TARGET_PROP;
//
// iSCSI portal group properties
//
typedef struct _VDS_ISCSI_PORTALGROUP_PROP
{
VDS_OBJECT_ID id;
VDS_ISCSI_PORTALGROUP_TAG tag;
} VDS_ISCSI_PORTALGROUP_PROP;
//
// Storage Pool attributes
//
typedef enum _VDS_RAID_TYPE
{
VDS_RT_UNKNOWN = 0,
VDS_RT_RAID0 = 10,
VDS_RT_RAID1 = 11,
VDS_RT_RAID2 = 12,
VDS_RT_RAID3 = 13,
VDS_RT_RAID4 = 14,
VDS_RT_RAID5 = 15,
VDS_RT_RAID6 = 16,
VDS_RT_RAID01 = 17,
VDS_RT_RAID03 = 18,
VDS_RT_RAID05 = 19,
VDS_RT_RAID10 = 20,
VDS_RT_RAID15 = 21,
VDS_RT_RAID30 = 22,
VDS_RT_RAID50 = 23,
VDS_RT_RAID51 = 24,
VDS_RT_RAID53 = 25,
VDS_RT_RAID60 = 26,
VDS_RT_RAID61 = 27,
} VDS_RAID_TYPE;
typedef struct _VDS_POOL_CUSTOM_ATTRIBUTES
{
LPWSTR pwszName;
LPWSTR pwszValue;
} VDS_POOL_CUSTOM_ATTRIBUTES, *PVDS_POOL_CUSTOM_ATTRIBUTES;
typedef struct _VDS_POOL_ATTRIBUTES
{
ULONGLONG ullAttributeMask;
VDS_RAID_TYPE raidType;
VDS_STORAGE_BUS_TYPE busType;
LPWSTR pwszIntendedUsage;
BOOL bSpinDown;
BOOL bIsThinProvisioned;
ULONGLONG ullProvisionedSpace;
BOOL bNoSinglePointOfFailure;
ULONG ulDataRedundancyMax;
ULONG ulDataRedundancyMin;
ULONG ulDataRedundancyDefault;
ULONG ulPackageRedundancyMax;
ULONG ulPackageRedundancyMin;
ULONG ulPackageRedundancyDefault;
ULONG ulStripeSize;
ULONG ulStripeSizeMax;
ULONG ulStripeSizeMin;
ULONG ulDefaultStripeSize;
ULONG ulNumberOfColumns;
ULONG ulNumberOfColumnsMax;
ULONG ulNumberOfColumnsMin;
ULONG ulDefaultNumberofColumns;
ULONG ulDataAvailabilityHint;
ULONG ulAccessRandomnessHint;
ULONG ulAccessDirectionHint;
ULONG ulAccessSizeHint;
ULONG ulAccessLatencyHint;
ULONG ulAccessBandwidthWeightHint;
ULONG ulStorageCostHint;
ULONG ulStorageEfficiencyHint;
// Custom attributes array
ULONG ulNumOfCustomAttributes;
[size_is(ulNumOfCustomAttributes)]
VDS_POOL_CUSTOM_ATTRIBUTES* pPoolCustomAttributes;
// Reserved for future use
BOOL bReserved1;
BOOL bReserved2;
ULONG ulReserved1;
ULONG ulReserved2;
ULONGLONG ullReserved1;
ULONGLONG ullReserved2;
} VDS_POOL_ATTRIBUTES, *PVDS_POOL_ATTRIBUTES;
const ULONGLONG VDS_POOL_ATTRIB_RAIDTYPE = 0x0000000000000001L;
const ULONGLONG VDS_POOL_ATTRIB_BUSTYPE = 0x0000000000000002L;
const ULONGLONG VDS_POOL_ATTRIB_ALLOW_SPINDOWN = 0x0000000000000004L;
const ULONGLONG VDS_POOL_ATTRIB_THIN_PROVISION = 0x0000000000000008L;
const ULONGLONG VDS_POOL_ATTRIB_NO_SINGLE_POF = 0x0000000000000010L;
const ULONGLONG VDS_POOL_ATTRIB_DATA_RDNCY_MAX = 0x0000000000000020L;
const ULONGLONG VDS_POOL_ATTRIB_DATA_RDNCY_MIN = 0x0000000000000040L;
const ULONGLONG VDS_POOL_ATTRIB_DATA_RDNCY_DEF = 0x0000000000000080L;
const ULONGLONG VDS_POOL_ATTRIB_PKG_RDNCY_MAX = 0x0000000000000100L;
const ULONGLONG VDS_POOL_ATTRIB_PKG_RDNCY_MIN = 0x0000000000000200L;
const ULONGLONG VDS_POOL_ATTRIB_PKG_RDNCY_DEF = 0x0000000000000400L;
const ULONGLONG VDS_POOL_ATTRIB_STRIPE_SIZE = 0x0000000000000800L;
const ULONGLONG VDS_POOL_ATTRIB_STRIPE_SIZE_MAX = 0x0000000000001000L;
const ULONGLONG VDS_POOL_ATTRIB_STRIPE_SIZE_MIN = 0x0000000000002000L;
const ULONGLONG VDS_POOL_ATTRIB_STRIPE_SIZE_DEF = 0x0000000000004000L;
const ULONGLONG VDS_POOL_ATTRIB_NUM_CLMNS = 0x0000000000008000L;
const ULONGLONG VDS_POOL_ATTRIB_NUM_CLMNS_MAX = 0x0000000000010000L;
const ULONGLONG VDS_POOL_ATTRIB_NUM_CLMNS_MIN = 0x0000000000020000L;
const ULONGLONG VDS_POOL_ATTRIB_NUM_CLMNS_DEF = 0x0000000000040000L;
const ULONGLONG VDS_POOL_ATTRIB_DATA_AVL_HINT = 0x0000000000080000L;
const ULONGLONG VDS_POOL_ATTRIB_ACCS_RNDM_HINT = 0x0000000000100000L;
const ULONGLONG VDS_POOL_ATTRIB_ACCS_DIR_HINT = 0x0000000000200000L;
const ULONGLONG VDS_POOL_ATTRIB_ACCS_SIZE_HINT = 0x0000000000400000L;
const ULONGLONG VDS_POOL_ATTRIB_ACCS_LTNCY_HINT = 0x0000000000800000L;
const ULONGLONG VDS_POOL_ATTRIB_ACCS_BDW_WT_HINT = 0x0000000001000000L;
const ULONGLONG VDS_POOL_ATTRIB_STOR_COST_HINT = 0x0000000002000000L;
const ULONGLONG VDS_POOL_ATTRIB_STOR_EFFCY_HINT = 0x0000000004000000L;
const ULONGLONG VDS_POOL_ATTRIB_CUSTOM_ATTRIB = 0x0000000008000000L;
//
// Storage Pool properties
//
typedef struct _VDS_STORAGE_POOL_PROP
{
VDS_OBJECT_ID id;
VDS_STORAGE_POOL_STATUS status;
VDS_HEALTH health;
VDS_STORAGE_POOL_TYPE type;
[string] LPWSTR pwszName;
[string] LPWSTR pwszDescription;
ULONGLONG ullTotalConsumedSpace;
ULONGLONG ullTotalManagedSpace;
ULONGLONG ullRemainingFreeSpace;
} VDS_STORAGE_POOL_PROP, *PVDS_STORAGE_POOL_PROP;
//
// Storage pool drive extent
//
typedef struct _VDS_STORAGE_POOL_DRIVE_EXTENT
{
VDS_OBJECT_ID id;
ULONGLONG ullSize;
BOOL bUsed;
} VDS_STORAGE_POOL_DRIVE_EXTENT;
//
// --- Interface definitions ---
//
//
// IVdsHwProvider:
// This interface exposes hardware provider specific functions.
// Implemented by: provider object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(d99bdaae-b13a-4178-9fdb-e27f16b4603e),
pointer_default(unique)
]
interface IVdsHwProvider : IUnknown
{
// QuerySubSystems:
// A subsystem is a RAID box, which can have more than one RAID
// controller (failover). RAID controllers can also be connected to
// the host directly. In this case, each controller itself is a
// storage system.
[helpstring("method QuerySubSystems")]
HRESULT QuerySubSystems(
[out] IEnumVdsObject **ppEnum
);
// Reenumerate:
// For providers that cannot automatically detect new subsystems,
// this method needs to be called to find new subsystems.
[helpstring("method Reenumerate")]
HRESULT Reenumerate(
void
);
// Refresh
[helpstring("method Refresh")]
HRESULT Refresh(
void
);
}
//
// IVdsHwProviderType:
//
// Implemented by: provider object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(3e0f5166-542d-4fc6-947a-012174240b7e),
pointer_default(unique)
]
interface IVdsHwProviderType : IUnknown
{
[helpstring("method GetProviderType")]
HRESULT GetProviderType(
[out] VDS_HWPROVIDER_TYPE *pType
);
}
//
// IVdsHwProviderType2:
//
// Implemented by: provider object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(8190236f-c4d0-4e81-8011-d69512fcc984),
pointer_default(unique)
]
interface IVdsHwProviderType2 : IUnknown
{
[helpstring("method GetProviderType2")]
HRESULT GetProviderType2(
[out] VDS_HWPROVIDER_TYPE *pType
);
}
//
// IVdsHwProviderStoragePools:
//
// Implemented by: provider object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(d5b5937a-f188-4c79-b86c-11c920ad11b8),
pointer_default(unique)
]
interface IVdsHwProviderStoragePools : IUnknown
{
[helpstring("method QueryStoragePools")]
HRESULT QueryStoragePools(
[in] ULONG ulFlags,
[in] ULONGLONG ullRemainingFreeSpace,
[in,unique] VDS_POOL_ATTRIBUTES *pPoolAttributes,
[out] IEnumVdsObject **ppEnum
);
[helpstring("method CreateLunInStoragePool")]
HRESULT CreateLunInStoragePool(
[in] VDS_LUN_TYPE type,
[in] ULONGLONG ullSizeInBytes,
[in] VDS_OBJECT_ID StoragePoolId,
[in,string] LPWSTR pwszUnmaskingList,
[in,unique] VDS_HINTS2 *pHints2,
[out] IVdsAsync **ppAsync
);
[helpstring("method QueryMaxLunCreateSizeInStoragePool")]
HRESULT QueryMaxLunCreateSizeInStoragePool(
[in] VDS_LUN_TYPE type,
[in] VDS_OBJECT_ID StoragePoolId,
[in,unique] VDS_HINTS2 *pHints2,
[out] ULONGLONG *pullMaxLunSize
);
}
//
// IVdsSubSystem:
//
// Implemented by: subsystem object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(6fcee2d3-6d90-4f91-80e2-a5c7caaca9d8),
pointer_default(unique)
]
interface IVdsSubSystem : IUnknown
{
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_SUB_SYSTEM_PROP *pSubSystemProp
);
[helpstring("method GetProvider")]
HRESULT GetProvider(
[out] IVdsProvider **ppProvider
);
[helpstring("method QueryControllers")]
HRESULT QueryControllers(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method QueryLuns")]
HRESULT QueryLuns(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method QueryDrives")]
HRESULT QueryDrives(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method GetDrive")]
HRESULT GetDrive(
[in] SHORT sBusNumber,
[in] SHORT sSlotNumber,
[out] IVdsDrive **ppDrive
);
// Reenumerate:
// For subsystems that cannot automatically detect new spindle arrival,
// departure, this method needs to be called to find new spindle.
[helpstring("method Reenumerate")]
HRESULT Reenumerate(
void
);
//
// Sets the controller states to be either "online" or "offline."
// Note that all the controllers of the current subsystem
// must be on one and only one of the two arrays.
//
[helpstring("method SetControllerStatus")]
HRESULT SetControllerStatus(
[in, size_is(lNumberOfOnlineControllers)]
VDS_OBJECT_ID *pOnlineControllerIdArray,
[in] LONG lNumberOfOnlineControllers,
[in, size_is(lNumberOfOfflineControllers)]
VDS_OBJECT_ID *pOfflineControllerIdArray,
[in] LONG lNumberOfOfflineControllers
);
[helpstring("method CreateLun")]
HRESULT CreateLun(
[in] VDS_LUN_TYPE type,
[in] ULONGLONG ullSizeInBytes,
[in, size_is(lNumberOfDrives), unique]
VDS_OBJECT_ID *pDriveIdArray,
[in] LONG lNumberOfDrives,
[in,string] LPWSTR pwszUnmaskingList,
// for enclosures that support hardware lun masking,
// this is a list of computer names that should be
// able to see the LUN; otherwise, it's ignored.
// "*": everybody can see it;
// "": nobody can see it.
[in,unique] VDS_HINTS *pHints,
[out] IVdsAsync **ppAsync
);
[helpstring("method ReplaceDrive")]
HRESULT ReplaceDrive(
[in] VDS_OBJECT_ID DriveToBeReplaced,
[in] VDS_OBJECT_ID ReplacementDrive
);
[helpstring("method SetStatus")]
HRESULT SetStatus(
[in] VDS_SUB_SYSTEM_STATUS status
);
[helpstring("method QueryMaxLunCreateSize")]
HRESULT QueryMaxLunCreateSize(
[in] VDS_LUN_TYPE type,
[in, size_is(lNumberOfDrives), unique]
VDS_OBJECT_ID *pDriveIdArray,
[in] LONG lNumberOfDrives,
[in,unique] VDS_HINTS *pHints,
[out] ULONGLONG *pullMaxLunSize
);
}
//
// IVdsSubSystem2:
//
// Implemented by: subsystem object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(be666735-7800-4a77-9d9c-40f85b87e292),
pointer_default(unique)
]
interface IVdsSubSystem2 : IUnknown
{
[helpstring("method GetProperties2")]
HRESULT GetProperties2(
[out] VDS_SUB_SYSTEM_PROP2 *pSubSystemProp2
);
[helpstring("method GetDrive2")]
HRESULT GetDrive2(
[in] SHORT sBusNumber,
[in] SHORT sSlotNumber,
[in] ULONG ulEnclosureNumber,
[out] IVdsDrive **ppDrive
);
[helpstring("method CreateLun2")]
HRESULT CreateLun2(
[in] VDS_LUN_TYPE type,
[in] ULONGLONG ullSizeInBytes,
[in, size_is(lNumberOfDrives), unique]
VDS_OBJECT_ID *pDriveIdArray,
[in] LONG lNumberOfDrives,
[in,string] LPWSTR pwszUnmaskingList,
// for enclosures that support hardware lun masking,
// this is a list of computer names that should be
// able to see the LUN; otherwise, it's ignored.
// "*": everybody can see it;
// "": nobody can see it.
[in,unique] VDS_HINTS2 *pHints2,
[out] IVdsAsync **ppAsync
);
[helpstring("method QueryMaxLunCreateSize2")]
HRESULT QueryMaxLunCreateSize2(
[in] VDS_LUN_TYPE type,
[in, size_is(lNumberOfDrives), unique]
VDS_OBJECT_ID *pDriveIdArray,
[in] LONG lNumberOfDrives,
[in,unique] VDS_HINTS2 *pHints2,
[out] ULONGLONG *pullMaxLunSize
);
}
//
// IVdsSubSystemNaming:
// This interface is for adding the ability to set a friendly name for
// subsystems.
// Implemented by: subsystem object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(0d70faa3-9cd4-4900-aa20-6981b6aafc75),
pointer_default(unique)
]
interface IVdsSubSystemNaming : IUnknown
{
HRESULT SetFriendlyName(
[in, string] LPWSTR pwszFriendlyName
);
}
//
// IVdsSubSystemIscsi:
//
// Implemented by: subsystem object
// Implemented where: iSCSI hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(0027346f-40d0-4b45-8cec-5906dc0380c8),
pointer_default(unique)
]
interface IVdsSubSystemIscsi : IUnknown
{
[helpstring("method QueryTargets")]
HRESULT QueryTargets(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method QueryPortals")]
HRESULT QueryPortals(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method CreateTarget")]
HRESULT CreateTarget(
[in,unique,string] LPWSTR pwszIscsiName,
[in,string] LPWSTR pwszFriendlyName,
[out] IVdsAsync **ppAsync
);
[helpstring("method SetIpsecGroupPresharedKey")]
HRESULT SetIpsecGroupPresharedKey(
[in,unique] VDS_ISCSI_IPSEC_KEY *pIpsecKey
);
}
//
// IVdsSubSystemInterconnect:
//
// Implemented by: subsystem object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(9e6fa560-c141-477b-83ba-0b6c38f7febf),
pointer_default(unique)
]
interface IVdsSubSystemInterconnect : IUnknown
{
HRESULT GetSupportedInterconnects(
[out] ULONG *pulSupportedInterconnectsFlag
);
}
//
// IVdsControllerPort:
//
// Implemented by: controllerport object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(18691d0d-4e7f-43e8-92e4-cf44beeed11c),
pointer_default(unique)
]
interface IVdsControllerPort : IUnknown
{
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_PORT_PROP *pPortProp
);
[helpstring("method GetController")]
HRESULT GetController(
[out] IVdsController **ppController
);
[helpstring("method QueryAssociatedLuns")]
HRESULT QueryAssociatedLuns(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method Reset")]
HRESULT Reset(
void
);
[helpstring("method SetStatus")]
HRESULT SetStatus(
[in] VDS_PORT_STATUS status
);
}
//
// IVdsController:
//
// Implemented by: controller object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(cb53d96e-dffb-474a-a078-790d1e2bc082),
pointer_default(unique)
]
interface IVdsController : IUnknown
{
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_CONTROLLER_PROP *pControllerProp
);
[helpstring("method GetSubSystem")]
HRESULT GetSubSystem(
[out] IVdsSubSystem **ppSubSystem
);
// GetPortProperties:
// If a port on a controller failed, all paths using this port fail.
// Deprecated by IVdsControllerPort::GetProperties()
[helpstring("method GetPortProperties")]
HRESULT GetPortProperties(
[in] SHORT sPortNumber,
[out] VDS_PORT_PROP *pPortProp
);
[helpstring("method FlushCache")]
HRESULT FlushCache(
void
);
[helpstring("method InvalidateCache")]
HRESULT InvalidateCache(
void
);
[helpstring("method Reset")]
HRESULT Reset(
void
);
// Deprecated by IVdsControllerPort::QueryAssociatedLuns()
[helpstring("method QueryAssociatedLuns")]
HRESULT QueryAssociatedLuns(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method SetStatus")]
HRESULT SetStatus(
[in] VDS_CONTROLLER_STATUS status
);
}
//
// IVdsControllerControllerPort:
// This interface is to add the ability to enumerate Controller ports for a
// class implementing the IVdsController interface.
// Implemented by: controller object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(ca5d735f-6bae-42c0-b30e-f2666045ce71),
pointer_default(unique)
]
interface IVdsControllerControllerPort : IUnknown
{
[helpstring("method QueryControllerPorts")]
HRESULT QueryControllerPorts(
[out] IEnumVdsObject **ppEnum
);
}
//
// IVdsDrive:
//
// Implemented by: drive object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(ff24efa4-aade-4b6b-898b-eaa6a20887c7),
pointer_default(unique)
]
interface IVdsDrive : IUnknown
{
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_DRIVE_PROP *pDriveProp
);
[helpstring("method GetSubSystem")]
HRESULT GetSubSystem(
[out] IVdsSubSystem **ppSubSystem
);
// QueryExtents:
// A spindle can contribute to more than one LUNs, which could be surfaced
// to different computers. All LUNs are returned.
[helpstring("method QueryExtents")]
HRESULT QueryExtents(
[out, size_is(,*plNumberOfExtents)]
VDS_DRIVE_EXTENT **ppExtentArray,
[out] LONG *plNumberOfExtents
);
[helpstring("method SetFlags")]
HRESULT SetFlags(
[in] ULONG ulFlags
);
[helpstring("method ClearFlags")]
HRESULT ClearFlags(
[in] ULONG ulFlags
);
[helpstring("method SetStatus")]
HRESULT SetStatus(
[in] VDS_DRIVE_STATUS status
);
}
//
// IVdsDrive2:
//
// Implemented by: drive object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(60b5a730-addf-4436-8ca7-5769e2d1ffa4),
pointer_default(unique)
]
interface IVdsDrive2 : IUnknown
{
[helpstring("method GetProperties2")]
HRESULT GetProperties2(
[out] VDS_DRIVE_PROP2 *pDriveProp2
);
}
//
// IVdsLun
// Only LUNs exposed by RAID controllers implement this interface.
// Implemented by: disk(LUN) object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(3540a9c7-e60f-4111-a840-8bba6c2c83d8),
pointer_default(unique)
]
interface IVdsLun : IUnknown
{
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_LUN_PROP *pLunProp
);
[helpstring("method GetSubSystem")]
HRESULT GetSubSystem(
[out] IVdsSubSystem **ppSubSystem
);
[helpstring("method GetIdentificationData")]
HRESULT GetIdentificationData(
[out] VDS_LUN_INFORMATION *pLunInfo
);
// QueryActiveControllers:
// The model is that all controllers can control a LUN. One or more of
// them are active, and the rest are inactive.
// Deprecated by IVdsLunControllerPorts::QueryActiveControllerPorts()
[helpstring("method QueryActiveControllers")]
HRESULT QueryActiveControllers(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method Extend")]
HRESULT Extend(
[in] ULONGLONG ullNumberOfBytesToAdd,
[in, size_is(lNumberOfDrives), unique]
VDS_OBJECT_ID *pDriveIdArray,
[in] LONG lNumberOfDrives,
[out] IVdsAsync **ppAsync
);
[helpstring("method Shrink")]
HRESULT Shrink(
[in] ULONGLONG ullNumberOfBytesToRemove,
[out] IVdsAsync **ppAsync
);
[helpstring("method QueryPlexes")]
HRESULT QueryPlexes(
[out] IEnumVdsObject **ppEnum
);
// AddPlex:
// Add a LUN as a plex to this LUN. The added LUN is no longer a LUN
// (cannot be accessed from outside).
//
// If a mirrored LUN is added, each plex of it is added.
//
[helpstring("method AddPlex")]
HRESULT AddPlex(
[in] VDS_OBJECT_ID lunId,
[out] IVdsAsync **ppAsync
);
[helpstring("method RemovePlex")]
HRESULT RemovePlex(
[in] VDS_OBJECT_ID plexId,
[out] IVdsAsync **ppAsync
);
// Recover:
// This method is used to trigger a recover process. High-end RAID
// subsystems may be able to do this automatically, but low-end
// ones (like storport) may need this method to explicitly start
// the process.
[helpstring("method Recover")]
HRESULT Recover(
[out] IVdsAsync **ppAsync
);
// SetMask: (hardware lun masking)
// Mask/Unmask the LUN. pwszUnmaskingList is a list of nodes separated by
// ";". These nodes should be granted access to the LUN.
//
// If the value is "*", all computers on the network are to be
// granted access to the LUN. If the value is "", no computers are to
// be granted access to the LUN.
//
// For Fibre Channel networks, each entry is a World-Wide Name
// (WWN) of each port to which the LUN is unmasked, formatted as
// a 64-bit uppercased hexadecimal string (16 characters long),
// most significant bit first.
//
// For iSCSI networks, each entry is an iSCSI name of each target
// to which the LUN is unmasked. A LUN unmasked to a particular target
// is considered to be associated with that target.
//
// Notes to Implementers
//
// The unmasking list can contain the same WWN or iSCSI name
// twice. The caller is neither expected to remove duplicates from
// the list nor to validate the format of the WWN or iSCSI name.
// If the hardware is unable to handle the duplicates correctly,
// the provider should perform all validations and remove duplicate
// WWNs and iSCSI names from the list before processing.
//
// It used to be the case that any format could be specified, but
// we decided that was a bad thing because an application could
// never figure out what a provider would understand. So, we
// mandated that all providers must accept a WWN formatted as
// specified (or an iSCSI name in the case of iSCSI).
//
// However, we don<6F>t require that providers should only accept
// this format. If a provider is able to translate or interpret
// another type of name, then it<69>s still fine. For instance,
// if a provider understands WWN formatted using lowercase
// characters instead of uppercase, then it is free to accept
// them and return success (it<69>s also free to return failure
// as well). The only stipulation is that the provider must
// understand the WWN when it<69>s formatted as specified above.
//
// This method works only if the LUN's enclosure supports hardware
// lun masking.
//
[helpstring("method SetMask")]
HRESULT SetMask(
[in,string] LPWSTR pwszUnmaskingList
);
// Delete:
// Delete the LUN.
[helpstring("method Delete")]
HRESULT Delete(
void
);
//
// Sets the list of controllers "Active" and "Inactive" for this
// LUN. Note that all the controllers of the current subsystem
// must be on one and only one of the two arrays.
//
// Deprecated by IVdsLunControllerPorts::AssociateControllerPorts()
[helpstring("method AssociateControllers")]
HRESULT AssociateControllers(
[in, unique, size_is(lNumberOfActiveControllers)]
VDS_OBJECT_ID *pActiveControllerIdArray,
[in] LONG lNumberOfActiveControllers,
[in, unique, size_is(lNumberOfInactiveControllers)]
VDS_OBJECT_ID *pInactiveControllerIdArray,
[in] LONG lNumberOfInactiveControllers
);
[helpstring("method QueryHints")]
HRESULT QueryHints(
[out] VDS_HINTS *pHints
);
[helpstring("method ApplyHints")]
HRESULT ApplyHints(
[in] VDS_HINTS *pHints
);
[helpstring("method SetStatus")]
HRESULT SetStatus(
[in] VDS_LUN_STATUS status
);
[helpstring("method QueryMaxLunExtendSize")]
HRESULT QueryMaxLunExtendSize(
[in, size_is(lNumberOfDrives), unique]
VDS_OBJECT_ID *pDriveIdArray,
[in] LONG lNumberOfDrives,
[out] ULONGLONG *pullMaxBytesToBeAdded
);
}
//
// IVdsLun2
// Only LUNs exposed by RAID controllers implement this interface.
// Implemented by: disk(LUN) object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(e5b3a735-9efb-499a-8071-4394d9ee6fcb),
pointer_default(unique)
]
interface IVdsLun2 : IUnknown
{
[helpstring("method QueryHints2")]
HRESULT QueryHints2(
[out] VDS_HINTS2 *pHints2
);
[helpstring("method ApplyHints2")]
HRESULT ApplyHints2(
[in] VDS_HINTS2 *pHints2
);
}
//
// IVdsLunNaming:
// This interface is for adding the ability to set a friendly name for LUNs.
// Implemented by: disk(LUN) object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(907504cb-6b4e-4d88-a34d-17ba661fbb06),
pointer_default(unique)
]
interface IVdsLunNaming : IUnknown
{
HRESULT SetFriendlyName(
[in, string] LPWSTR pwszFriendlyName
);
}
//
// IVdsLunNumber:
// This interface is for adding the ability to retrieve the LUN number of a LUN.
// Implemented by: disk(LUN) object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(d3f95e46-54b3-41f9-b678-0f1871443a08),
pointer_default(unique)
]
interface IVdsLunNumber : IUnknown
{
HRESULT GetLunNumber(
[out] ULONG *pulLunNumber
);
}
//
// IVdsLunControllerPorts:
// This interface is for adding the ability to work with controller ports.
// Implemented by: disk(LUN) object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(451fe266-da6d-406a-bb60-82e534f85aeb),
pointer_default(unique)
]
interface IVdsLunControllerPorts : IUnknown
{
//
// Sets the list of controller ports "Active" and "Inactive" for this LUN.
// Note that all the controller ports of the current subsystem must be on
// one and only one of the two arrays.
//
[helpstring("method AssociateControllerPorts")]
HRESULT AssociateControllerPorts(
[in, unique, size_is(lNumberOfActiveControllerPorts)]
VDS_OBJECT_ID *pActiveControllerPortIdArray,
[in] LONG lNumberOfActiveControllerPorts,
[in, unique, size_is(lNumberOfInactiveControllerPorts)]
VDS_OBJECT_ID *pInactiveControllerPortIdArray,
[in] LONG lNumberOfInactiveControllerPorts
);
[helpstring("method QueryActiveControllerPorts")]
HRESULT QueryActiveControllerPorts(
[out] IEnumVdsObject **ppEnum
);
}
//
// IVdsLunMpio:
// This interface is for adding the ability to work with MPIO paths for a
// class implementing the IVdsLun interface. This is needed to support MPIO.
// Implemented by: disk(LUN) object
// Implemented where: non-iSCSI hardware providers supporting MPIO, common layer
// Accessed by: applications
//
[
object,
uuid(7c5fbae3-333a-48a1-a982-33c15788cde3),
pointer_default(unique)
]
interface IVdsLunMpio : IUnknown
{
//
// Returns information about the paths to the LUN. The VDS_PATH_INFO
// structure identifies that path in terms of the endpoints and the status
// of the path.
// If a provider is an iSCSI provider or if a provider does not support
// MPIO, this interface should not be implemented at all. In the case
// of iSCSI, VDS will completely ignore it since it will use the
// service's own routines to handle MPIO for iSCSI.
//
[helpstring("method GetPathInfo")]
HRESULT GetPathInfo(
[out, size_is(, *plNumberOfPaths)] VDS_PATH_INFO **ppPaths,
[out] LONG *plNumberOfPaths
);
[helpstring("method GetLoadBalancePolicy")]
HRESULT GetLoadBalancePolicy(
[out] VDS_LOADBALANCE_POLICY_ENUM *pPolicy,
[out, size_is(, *plNumberOfPaths)] VDS_PATH_POLICY **ppPaths,
[out] LONG *plNumberOfPaths
);
[helpstring("method SetLoadBalancePolicy")]
HRESULT SetLoadBalancePolicy(
[in] VDS_LOADBALANCE_POLICY_ENUM policy,
[in, unique, size_is(lNumberOfPaths)] VDS_PATH_POLICY *pPaths,
[in] LONG lNumberOfPaths
);
[helpstring("method GetSupportedLbPolicies")]
HRESULT GetSupportedLbPolicies(
[out] ULONG *pulLbFlags
);
}
//
// IVdsLunIscsi:
// This interface is for adding the ability to associate LUNs with iSCSI
// targets.
// Implemented by: disk(LUN) object
// Implemented where: iSCSI hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(0d7c1e64-b59b-45ae-b86a-2c2cc6a42067),
pointer_default(unique)
]
interface IVdsLunIscsi : IUnknown
{
[helpstring("method AssociateTargets")]
HRESULT AssociateTargets(
[in, unique, size_is(lNumberOfTargets)]
VDS_OBJECT_ID *pTargetIdArray,
[in] LONG lNumberOfTargets
);
[helpstring("method QueryAssociatedTargets")]
HRESULT QueryAssociatedTargets(
[out] IEnumVdsObject **ppEnum
);
}
// IVdsLunPlex:
//
// Implemented by: LUN plex object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(0ee1a790-5d2e-4abb-8c99-c481e8be2138),
pointer_default(unique)
]
interface IVdsLunPlex : IUnknown
{
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_LUN_PLEX_PROP *pPlexProp
);
[helpstring("method GetLun")]
HRESULT GetLun(
[out] IVdsLun **ppLun
);
[helpstring("method QueryExtents")]
HRESULT QueryExtents(
[out, size_is(,*plNumberOfExtents)]
VDS_DRIVE_EXTENT **ppExtentArray,
[out] LONG *plNumberOfExtents
);
[helpstring("method QueryHints")]
HRESULT QueryHints(
[out] VDS_HINTS *pHints
);
[helpstring("method ApplyHints")]
HRESULT ApplyHints(
[in] VDS_HINTS *pHints
);
}
//
// IVdsIscsiPortal:
//
// Implemented by: iSCSI target portal object
// Implemented where: iSCSI hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(7fa1499d-ec85-4a8a-a47b-ff69201fcd34),
pointer_default(unique)
]
interface IVdsIscsiPortal : IUnknown
{
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_ISCSI_PORTAL_PROP *pPortalProp
);
[helpstring("method GetSubSystem")]
HRESULT GetSubSystem(
[out] IVdsSubSystem **ppSubSystem
);
[helpstring("method QueryAssociatedPortalGroups")]
HRESULT QueryAssociatedPortalGroups(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method SetStatus")]
HRESULT SetStatus(
[in] VDS_ISCSI_PORTAL_STATUS status
);
[helpstring("method SetIpsecTunnelAddress")]
HRESULT SetIpsecTunnelAddress(
[in] VDS_IPADDRESS *pTunnelAddress,
[in] VDS_IPADDRESS *pDestinationAddress
);
[helpstring("method GetIpsecSecurity")]
HRESULT GetIpsecSecurity(
[in] VDS_IPADDRESS *pInitiatorPortalAddress,
[out] ULONGLONG *pullSecurityFlags
);
[helpstring("method SetIpsecSecurity")]
HRESULT SetIpsecSecurity(
[in] VDS_IPADDRESS *pInitiatorPortalAddress,
[in] ULONGLONG ullSecurityFlags,
[in,unique] VDS_ISCSI_IPSEC_KEY *pIpsecKey
);
}
//
// IVdsIscsiTarget:
//
// Implemented by: iSCSI target object
// Implemented where: iSCSI hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(aa8f5055-83e5-4bcc-aa73-19851a36a849),
pointer_default(unique)
]
interface IVdsIscsiTarget : IUnknown
{
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_ISCSI_TARGET_PROP *pTargetProp
);
[helpstring("method GetSubSystem")]
HRESULT GetSubSystem(
[out] IVdsSubSystem **ppSubSystem
);
[helpstring("method QueryPortalGroups")]
HRESULT QueryPortalGroups(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method QueryAssociatedLuns")]
HRESULT QueryAssociatedLuns(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method CreatePortalGroup")]
HRESULT CreatePortalGroup(
[out] IVdsAsync **ppAsync
);
[helpstring("method Delete")]
HRESULT Delete(
[out] IVdsAsync **ppAsync
);
[helpstring("method SetFriendlyName")]
HRESULT SetFriendlyName(
[in,string] LPWSTR pwszFriendlyName
);
[helpstring("method SetSharedSecret")]
HRESULT SetSharedSecret(
[in,unique] VDS_ISCSI_SHARED_SECRET *pTargetSharedSecret,
[in,unique,string] LPWSTR pwszInitiatorName
);
[helpstring("method RememberInitiatorSharedSecret")]
HRESULT RememberInitiatorSharedSecret(
[in,string] LPWSTR pwszInitiatorName,
[in,unique] VDS_ISCSI_SHARED_SECRET *pInitiatorSharedSecret
);
[helpstring("method GetConnectedInitiators")]
HRESULT GetConnectedInitiators(
[out,string,size_is(,*plNumberOfInitiators)]
LPWSTR **pppwszInitiatorList,
[out] LONG *plNumberOfInitiators
);
}
//
// IVdsIscsiPortalGroup:
//
// Implemented by: iSCSI portal group object
// Implemented where: iSCSI hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(fef5f89d-a3dd-4b36-bf28-e7dde045c593),
pointer_default(unique)
]
interface IVdsIscsiPortalGroup : IUnknown
{
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_ISCSI_PORTALGROUP_PROP *pPortalGroupProp
);
[helpstring("method GetTarget")]
HRESULT GetTarget(
[out] IVdsIscsiTarget **ppTarget
);
[helpstring("method QueryAssociatedPortals")]
HRESULT QueryAssociatedPortals(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method AddPortal")]
HRESULT AddPortal(
[in] VDS_OBJECT_ID portalId,
[out] IVdsAsync **ppAsync
);
[helpstring("method RemovePortal")]
HRESULT RemovePortal(
[in] VDS_OBJECT_ID portalId,
[out] IVdsAsync **ppAsync
);
[helpstring("method Delete")]
HRESULT Delete(
[out] IVdsAsync **ppAsync
);
}
//
// IVdsStoragePool:
//
// Implemented by: storage pool object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(932ca8cf-0eb3-4ba8-9620-22665d7f8450),
pointer_default(unique)
]
interface IVdsStoragePool : IUnknown
{
[helpstring("method GetProvider")]
HRESULT GetProvider(
[out] IVdsProvider **ppProvider
);
[helpstring("method GetProperties")]
HRESULT GetProperties(
[out] VDS_STORAGE_POOL_PROP *pStoragePoolProp
);
[helpstring("method GetAttributes")]
HRESULT GetAttributes(
[out] VDS_POOL_ATTRIBUTES *pStoragePoolAttributes
);
[helpstring("method QueryDriveExtents")]
HRESULT QueryDriveExtents(
[out, size_is(,*plNumberOfExtents)]
VDS_STORAGE_POOL_DRIVE_EXTENT **ppExtentArray,
[out] LONG *plNumberOfExtents
);
[helpstring("method QueryAllocatedLuns")]
HRESULT QueryAllocatedLuns(
[out] IEnumVdsObject **ppEnum
);
[helpstring("method QueryAllocatedStoragePools")]
HRESULT QueryAllocatedStoragePools(
[out] IEnumVdsObject **ppEnum
);
}
//
// IVdsMaintenance:
// Implemented by: drive object, controller object, subsystem object
// Implemented where: hardware providers, common layer
// Accessed by: applications
//
[
object,
uuid(daebeef3-8523-47ed-a2b9-05cecce2a1ae),
pointer_default(unique)
]
interface IVdsMaintenance : IUnknown
{
[helpstring("method StartMaintenance")]
HRESULT StartMaintenance(
[in] VDS_MAINTENANCE_OPERATION operation
);
[helpstring("method StopMaintenance")]
HRESULT StopMaintenance(
[in] VDS_MAINTENANCE_OPERATION operation
);
[helpstring("method PulseMaintenance")]
HRESULT PulseMaintenance(
[in] VDS_MAINTENANCE_OPERATION operation,
[in] ULONG ulCount
);
}