How to populate SM_GetAdapterPortAttributes to support Get-InitiatorPort command.

Hi All,
We have virtual storport miniport driver exposing as a SAS device. I did
implement the WMI support. At least I get the WMI calls. So far I added
every GUID I can see in the header in my supported list to see what all
calls I get.

I am trying to get the PowerShell command “Get-InitiatorPort” to work. When
I call this from PowerShell, I get WMI calls for the following:

  1. Call to GUID “SM_AdapterInformationQuery” – I satisfy this with
    appropriate values. Can post the details if required.
  2. Call to “MS_SM_PortInformationMethods” method with method id “2” which
    is “SM_GetAdapterPortAttributes”.

I am not quite sure what to fill in here. It is defined as below in
hbaapi.h.

The question is where can I fill-in information about the initiator port
ID. It should be 64-WWN number. But I do not see any filed here.
Is “MS_SMHBA_PORTATTRIBUTES” something similar to INQUIRY command as
“PortSpecificAttributes” field looks variable??

I did refer to WDKStorPort sample from Microsoft, but they are a FC device.
So they are using completely different WMI calls.

I would really appreciate some help.

typedef struct _SM_GetAdapterPortAttributes_OUT
{
//
ULONG HBAStatus;
#define SM_GetAdapterPortAttributes_OUT_HBAStatus_SIZE sizeof(ULONG)
#define SM_GetAdapterPortAttributes_OUT_HBAStatus_ID 3

//
MS_SMHBA_PORTATTRIBUTES PortAttributes;
#define SM_GetAdapterPortAttributes_OUT_PortAttributes_SIZE
sizeof(MS_SMHBA_PORTATTRIBUTES)
#define SM_GetAdapterPortAttributes_OUT_PortAttributes_ID 4

} SM_GetAdapterPortAttributes_OUT, *PSM_GetAdapterPortAttributes_OUT;

typedef struct _MS_SMHBA_PORTATTRIBUTES
{
//
ULONG PortType;
#define MS_SMHBA_PORTATTRIBUTES_PortType_SIZE sizeof(ULONG)
#define MS_SMHBA_PORTATTRIBUTES_PortType_ID 1

//
ULONG PortState;
#define MS_SMHBA_PORTATTRIBUTES_PortState_SIZE sizeof(ULONG)
#define MS_SMHBA_PORTATTRIBUTES_PortState_ID 2

//
ULONG PortSpecificAttributesSize;
#define MS_SMHBA_PORTATTRIBUTES_PortSpecificAttributesSize_SIZE
sizeof(ULONG)
#define MS_SMHBA_PORTATTRIBUTES_PortSpecificAttributesSize_ID 3

//
WCHAR OSDeviceName[256 + 1];
#define MS_SMHBA_PORTATTRIBUTES_OSDeviceName_ID 4

//
ULONGLONG Reserved;
#define MS_SMHBA_PORTATTRIBUTES_Reserved_SIZE sizeof(ULONGLONG)
#define MS_SMHBA_PORTATTRIBUTES_Reserved_ID 5

//
UCHAR PortSpecificAttributes[1];
#define MS_SMHBA_PORTATTRIBUTES_PortSpecificAttributes_ID 6

} MS_SMHBA_PORTATTRIBUTES, *PMS_SMHBA_PORTATTRIBUTES;

This is my GUID list:
SCSIWMIGUIDREGINFO GsWmiGuidList = {
{&GsDeviceGuid, NUMBEROFPORTS, 0},
{&GsDeviceGuid2, NUMBEROFPORTS, 0},
{&MS_SM_AdapterInformationQuery_GUID, NUMBEROFPORTS, 0x0},
{&MS_SMHBA_SAS_PHY_GUID, NUMBEROFPORTS, 0x0},
{&MS_SMHBA_SAS_Port_GUID, NUMBEROFPORTS, 0x0},
{&MS_SMHBA_PORTATTRIBUTES_GUID, NUMBEROFPORTS, 0x0},
{&MS_SMHBA_PORTLUN_GUID, NUMBEROFPORTS, 0x0},
{&MS_SMHBA_PROTOCOLSTATISTICS_GUID, NUMBEROFPORTS, 0x0},
{&MS_SMHBA_SASPHYSTATISTICS_GUID, NUMBEROFPORTS, 0x0},
{&MS_SMHBA_SCSIENTRY_GUID, NUMBEROFPORTS, 0x0},
{&MS_SM_PortInformationMethods_GUID, NUMBEROFPORTS, 0x0},
{&MS_SM_ScsiInformationMethods_GUID, NUMBEROFPORTS, 0x0}, // This
is used to support Inquiry, ReportLUNS and ReadCapacity.
{&MS_SM_EventControl_GUID, NUMBEROFPORTS, 0x0},
{&MS_SMHBA_FC_Port_GUID, NUMBEROFPORTS, 0x0},
{&MS_SMHBA_FC_PHY_GUID, NUMBEROFPORTS, 0x0},

{&MSFC_HBAPortStatistics_GUID, NUMBEROFPORTS, 0x0},
{&HBAFC3MgmtInfo_GUID, NUMBEROFPORTS, 0x0},
{&HBAScsiID_GUID, NUMBEROFPORTS, 0x0},
{&MSFC_LinkEvent_GUID, NUMBEROFPORTS, 0x0},
{&MS_SMHBA_BINDINGENTRY_GUID, NUMBEROFPORTS, 0x0},
{&MS_SM_TargetInformationMethods_GUID, NUMBEROFPORTS, 0x0},
{&MS_SM_FabricAndDomainManagementMethods_GUID, NUMBEROFPORTS, 0x0},
{&MS_SM_AdapterEvent_GUID, NUMBEROFPORTS, 0x0},
{&MS_SM_PortEvent_GUID, NUMBEROFPORTS, 0x0},
{&MS_SM_TargetEvent_GUID, NUMBEROFPORTS, 0x0},
{&MSFC_TM_GUID, NUMBEROFPORTS, 0x0},
};

Regards,
–Tapan.