#ifndef _pdowmi_h_
#define _pdowmi_h_

// CName - CName
#define CNameGuid \
    { 0x0cf26b63,0x4b08,0x426d, { 0xb1,0x71,0xcd,0xbb,0x1c,0xcd,0xd1,0x1a } }

DEFINE_GUID(CName_GUID, \
            0x0cf26b63,0x4b08,0x426d,0xb1,0x71,0xcd,0xbb,0x1c,0xcd,0xd1,0x1a);


typedef struct _CName
{
    // 
    CHAR VariableData[1];
    #define CName_CName_ID 1

} CName, *PCName;

// SCSI_ADDR - SCSI_ADDR
#define SCSI_ADDRGuid \
    { 0xc74aece4,0x468b,0x4113, { 0xb0,0x06,0x0c,0xec,0xdc,0x96,0x8a,0xc4 } }

DEFINE_GUID(SCSI_ADDR_GUID, \
            0xc74aece4,0x468b,0x4113,0xb0,0x06,0x0c,0xec,0xdc,0x96,0x8a,0xc4);


typedef struct _SCSI_ADDR
{
    // 
    UCHAR PortNumber;
    #define SCSI_ADDR_PortNumber_SIZE sizeof(UCHAR)
    #define SCSI_ADDR_PortNumber_ID 1

    // 
    UCHAR ScsiPathId;
    #define SCSI_ADDR_ScsiPathId_SIZE sizeof(UCHAR)
    #define SCSI_ADDR_ScsiPathId_ID 2

    // 
    UCHAR TargetId;
    #define SCSI_ADDR_TargetId_SIZE sizeof(UCHAR)
    #define SCSI_ADDR_TargetId_ID 3

    // 
    UCHAR Lun;
    #define SCSI_ADDR_Lun_SIZE sizeof(UCHAR)
    #define SCSI_ADDR_Lun_ID 4

} SCSI_ADDR, *PSCSI_ADDR;

// PDO_INFORMATION - PDO_INFORMATION
#define PDO_INFORMATIONGuid \
    { 0xe69e581d,0x6580,0x4bc2, { 0xba,0xd1,0x7e,0xee,0x85,0x98,0x90,0x86 } }

DEFINE_GUID(PDO_INFORMATION_GUID, \
            0xe69e581d,0x6580,0x4bc2,0xba,0xd1,0x7e,0xee,0x85,0x98,0x90,0x86);


typedef struct _PDO_INFORMATION
{
    // 
    SCSI_ADDR ScsiAddress;
    #define PDO_INFORMATION_ScsiAddress_SIZE sizeof(SCSI_ADDR)
    #define PDO_INFORMATION_ScsiAddress_ID 1

    // 
    ULONGLONG PathIdentifier;
    #define PDO_INFORMATION_PathIdentifier_SIZE sizeof(ULONGLONG)
    #define PDO_INFORMATION_PathIdentifier_ID 2

    // 
    ULONGLONG ControllerIdentifier;
    #define PDO_INFORMATION_ControllerIdentifier_SIZE sizeof(ULONGLONG)
    #define PDO_INFORMATION_ControllerIdentifier_ID 3

} PDO_INFORMATION, *PPDO_INFORMATION;

// MPIO_GET_DESCRIPTOR - MPIO_GET_DESCRIPTOR
// Retrieve Object Information about a Multi-Path Disk.
#define MPIO_GET_DESCRIPTORGuid \
    { 0x85134d46,0xd17c,0x4992, { 0x83,0xf9,0x07,0x0d,0xd4,0xc4,0x8e,0x0b } }

DEFINE_GUID(MPIO_GET_DESCRIPTOR_GUID, \
            0x85134d46,0xd17c,0x4992,0x83,0xf9,0x07,0x0d,0xd4,0xc4,0x8e,0x0b);


typedef struct _MPIO_GET_DESCRIPTOR
{
    // Number of Port Objects backing the device.
    ULONG NumberPdos;
    #define MPIO_GET_DESCRIPTOR_NumberPdos_SIZE sizeof(ULONG)
    #define MPIO_GET_DESCRIPTOR_NumberPdos_ID 1

    // Name of Device.
    CName DeviceName;
    #define MPIO_GET_DESCRIPTOR_DeviceName_SIZE sizeof(CName)
    #define MPIO_GET_DESCRIPTOR_DeviceName_ID 2

    // Array of Infomation classes describing the real device.
    PDO_INFORMATION PdoInformation[1];
    #define MPIO_GET_DESCRIPTOR_PdoInformation_ID 3

} MPIO_GET_DESCRIPTOR, *PMPIO_GET_DESCRIPTOR;

#endif