//
// Wmi internal classes
//
class WMIEvent : __ExtrinsicEvent
{
};

//
// Embedded class that describes a multi-path drive.
//
[WMI,
guid("{cb9d55b2-d833-4a4c-8caa-4aee3f240e9a}")]
class MPIO_DRIVE_INFO {
    //
    // Number of Paths to the real device.
    //
    [WmiDataId(1)] uint32 NumberPaths;
    //
    // The MPIODisk(N).
    //
    [WmiDataId(2), MaxLen(63)] string Name;
    //
    // The real device's serial number.
    //
    [WmiDataId(3), MaxLen(63)] string SerialNumber;
    //
    // Friendly name of the DSM controlling the device.
    //
    [WmiDataId(4), MaxLen(63)] string DsmName;
};


//
// Top-level view of disk topology. 
//
[WMI, 
 Dynamic,
 Provider("WmiProv"),
 Description("Multi-Path Device List"),
 Locale("MS\\0x409"),
 guid("{9f9765ed-c3a0-451f-86c1-470a1ddd3217}")]
class MPIO_DISK_INFO
{
    [key, read] 
     string InstanceName;
    [read] boolean Active;

    //
    // The Number of mulit-path disk pdos that have been
    // created.
    //
    [WmiDataId(1),
     read,
     Description("Number of Multi-Path Drives.")
    ] uint32 NumberDrives;

    //
    // Variable-length array of DRIVE_INFO structures.
    // NOTE: Each entry will be ULONG aligned. App. writers
    // take note when iterating through the array.
    //
    [WmiDataId(2),
     read,
     Description("Multi-Path Drive Info Array."),
     WmiSizeIs("NumberDrives")
    ] MPIO_DRIVE_INFO DriveInfo[];
};

//
// Path Information. 
//
[WMI,
 guid("{b87c0fec-88b7-451d-a378-387ba61aeb89}")]
class MPIO_ADAPTER_INFORMATION {

    //
    // Path ID. The PDO_INFORMATION class includes
    // it's pathId. These values can be used to find
    // which devices are on which path.
    //
    [WmiDataId(1)] uint64 PathId;

    //
    // Adapter Location.
    //
    [WmiDataId(2)] uint8 BusNumber;
    [WmiDataId(3)] uint8 DeviceNumber;
    [WmiDataId(4)] uint8 FunctionNumber;
    [WmiDataId(5)] uint8 Pad;

    //
    // Adapter Name.
    //
    [WmiDataId(6), MaxLen(63)] string AdapterName;
};

[Dynamic,
 Provider("WmiProv"),
 WMI,
 Description("Multi-Path Path Information."),
 Locale("MS\\0x409"),
 guid("{b3a05997-2077-40a3-bf36-ebd91ff8b254}")]
class MPIO_PATH_INFORMATION {

    [key, read] 
     string InstanceName;
    [read] boolean Active;

    [WmiDataId(1),
     read,
     Description("Number of Paths in use")
    ] uint32 NumberPaths;
    
    //
    // Note that each of these are ULONGLONG aligned.
    //
    [WmiDataId(2),
     read,
     Description("Array of Adapter/Path Information."),
     WmiSizeIs("NumberPaths")
    ] MPIO_ADAPTER_INFORMATION PathList[];
    
};

[WMI,
 guid("{e732405b-b15e-4872-afd0-0df69dc1bb01}")]
class MPIO_CONTROLLER_INFO {

    //
    // Devices behind this controller will have a matching
    // ControllerId in the PDO_INFORMATION class.
    //
    [WmiDataId(1)] uint64 ControllerId; 
    [WmiDataId(2)] uint32 ControllerState; 
    [WmiDataId(3), MaxLen(63)] string AssociatedDsm;
};

[Dynamic,
 Provider("WmiProv"),
 WMI,
 Description("Array Controller Information."),
 Locale("MS\\0x409"),
 guid("{cf07da2c-e598-45d2-9d78-75c38b8164e8}")]
class MPIO_CONTROLLER_CONFIGURATION {

    [key, read]
     string InstanceName;
    [read] boolean Active;

    [WmiDataId(1),
     read,
     Description("Number of Controllers.")
    ] uint32 NumberControllers;

    //
    // Note that these are ULONGLONG aligned.
    //
    [WmiDataId(2),
     read,
     Description("Array of Controller Information Structures."),
     WmiSizeIs("NumberControllers")
    ] MPIO_CONTROLLER_INFO ControllerInfo[]; 

};

//
// Methods go here...TODO
// Move LUNS
// Set Path Verification period
// Set Fail-Back period
// 
//
// Used to Log interesting events - F.O., F.B., Config change...
//
[Dynamic,
 Provider("WMIProv"),
 WMI,
 Description("MultiPath Event Logger"),
 guid("{2abb031a-71aa-46d4-a53f-eae34051e357}"),
 locale("MS\\0x409")
]

class MPIO_EventEntry : WMIEvent
{
        [key, read]
        string InstanceName;

        [key]
        boolean Active;

        [WmiDataId(1),
         read,
         Description("Time Stamp"),
         WmiTimeStamp
        ] uint64 TimeStamp; 

        [WmiDataId(2),
        read,
        Values{"Fatal Error",
               "Error",
               "Warning",
               "Information"},
               
        DefineValues{"MPIO_FATAL_ERROR",
                     "MPIO_ERROR",
                     "MPIO_WARNING",
                     "MPIO_INFORMATION"},

        ValueMap{"1", "2", "3", "4"}
        ] uint32 Severity;
        
        [WmiDataId(3),
        read,
        MaxLen(63),
        Description("Component")
        ] string Component;

        [WmiDataId(4),
        read,
        MaxLen(63),
        Description("Event Description")
        ] string EventDescription;
};


 
