0

I have a problem with translating PowerShell script to C#.

I'm following Exploring NDIS WMI classes article and I'm trying to rewrite sample PowerShell to C#.. More precisely I've a problem with correctly translate Get-NdisObjectHeader, Get-NdisWmiHeader to inParams. First PS code and then my failure code in C#.

PowerShell:

$Adapters =  Get-WmiObject -Namespace root\wmi -Class` MSNdis_ReceiveScaleCapabilities;

## $Adapters[4];
## under 4.element I’ve got my desired adapter InstanceName: „Adapter 0”

function Get-NdisObjectHeader 
{ 
    param( 
        $revision = 1, 
        $type     = 0x02, 
        $size     = 0xffff 
    ) 
    $hdr = ([wmiclass]'root\wmi:MSNdis_ObjectHeader').CreateInstance() 
    $hdr.Revision      = $revision 
    $hdr.Type          = $type 
    $hdr.Size          = $size 
    return $hdr 
}

function Get-NdisWmiHeader 
{ 
    param($timeout = 5) 
    $whdr = ([wmiclass]'root\wmi:MSNdis_WmiMethodHeader').CreateInstance() 
    $whdr.Header       = Get-NdisObjectHeader 
    $whdr.PortNumber   = 0 
    $whdr.NetLuid      = 0 
    $whdr.Padding      = 0 
    $whdr.RequestId    = 0 
    $whdr.Timeout      = $timeout 
    return $whdr 
}

$whdr = Get-NdisWmiHeader;
$outParams = $Adapters[4].WmiQueryReceiveScaleCapabilities($whdr);

C#

static void Main(string[] args)
{
    String AdapterName = "Adapter 0";
    String WMIClassName = "MSNdis_ReceiveScaleCapabilities";
    string Query = "SELECT * FROM " + WMIClassName;
    var ListAdapterInstances = new ManagementObjectSearcher("root\\WMI", Query).Get();

    foreach (ManagementObject AdapterInstance in ListAdapterInstances)
    {
        String AdapterInstanceName;
        AdapterInstanceName = (String)AdapterInstance.GetPropertyValue("InstanceName");

        if (AdapterInstanceName.Contains(AdapterName))
        {
            ManagementBaseObject whdr= AdapterInstance.GetMethodParameters("WmiQueryReceiveScaleCapabilities");

            //here , I don't know how to fill correctly whdr object with NDISWmiHeader(->NDISObjectHeader).. 
            object[] NDISObjectHeader = { 1, 0x02, 0xffff };    //Get-NdisObjectHeader 
            object[] NDISWmiHeader = { NDISObjectHeader, 0, 0, 0, 0, 5 };   //Get-NdisWmiHeader

            whdr["Header"] = NDISWmiHeader;

            ManagementBaseObject outParams = AdapterInstance.InvokeMethod("WmiQueryReceiveScaleCapabilities", whdr, null);
            //
        }
    }
}

Appreciate your help. Bob

bob0123
  • 13
  • 5
  • What exception are you getting? – jt000 Mar 15 '15 at 11:57
  • Could you add the full exception (type, message, stack) to your question? Also, you seem to be missing some code in at least the C# version, where is "inParams" created? – jt000 Mar 15 '15 at 12:34
  • inParam -> whdr - fixed – bob0123 Mar 15 '15 at 12:41
  • in line: whdr["Header"] = NDISWmiHeader; debugger stops program and throw "ManagmentException was unhandled" message and in View Detail.. - {"Type mismatch "} – bob0123 Mar 15 '15 at 12:43

2 Answers2

1

Your PowerShell code can be translated as:

ManagementBaseObject hdr = new ManagementClass("root\\wmi:MSNdis_ObjectHeader").CreateInstance();

hdr["Revision"] = 1;
hdr["Type"] = 0x02;
hdr["Size"] = 0xffff;

ManagementBaseObject whdr = new ManagementClass("root\\wmi:MSNdis_WmiMethodHeader").CreateInstance();

whdr["Header"] = hdr;
whdr["PortNumber"] = 0;
whdr["NetLuid"] = 0;
whdr["Padding"] = 0;
whdr["RequestId"] = 0;
whdr["Timeout"] = 5;

// Two lines bellow are taken from Bob's answer
ManagementBaseObject inParams = AdapterInstance.GetMethodParameters("WmiQueryReceiveScaleCapabilities");

inParams["Header"] = whdr;

ManagementBaseObject outParams = AdapterInstance.InvokeMethod("WmiQueryReceiveScaleCapabilities", inParams, null);

Edit: An instance of the ManagementBaseObject type must be created via the ManagementClass.GetMethodParameters to store parameters. And this ManagementBaseObject must be passed to InvokeMethod. In PowerShell this is done implicitly by a ManagementObjectAdapter when you call a method.

My misstake was found by @bob0123. So upvote his answer too.

Yoh Deadfall
  • 2,711
  • 7
  • 28
  • 32
  • make sense, but on last line: ManagementBaseObject outParams = AdapterInstance.InvokeMethod("WmiQueryReceiveScaleCapabilities", whdr, null); I've got ManagmentException was unhandled: {"Not Found"} (ErrorCode: System.Management.ManagementStatus.NotFound).. and I'm puzzled because that means that my AdapterInstance does not have WmiQueryReceiveScaleCapabilities ?, but on PowerShell everything is ok, hmm.. – bob0123 Mar 15 '15 at 13:33
1

For fully worked code I've added two more lines to version Yoh Deadfall(thanks for hint!):

ManagementBaseObject hdr = new ManagementClass("root\\wmi:MSNdis_ObjectHeader").CreateInstance();
                    hdr["Revision"] = 1;
                    hdr["Type"] = 0x02;
                    hdr["Size"] = 0xffff;

ManagementBaseObject whdr = new ManagementClass("root\\wmi:MSNdis_WmiMethodHeader").CreateInstance();
                    whdr["Header"] = hdr;
                    whdr["PortNumber"] = 0;
                    whdr["NetLuid"] = 0;
                    whdr["Padding"] = 0;
                    whdr["RequestId"] = 0;
                    whdr["Timeout"] = 5;

ManagementBaseObject inParams =  AdapterInstance.GetMethodParameters("WmiQueryReceiveScaleCapabilities");
inParams["Header"] = whdr;

ManagementBaseObject outParams = AdapterInstance.InvokeMethod("WmiQueryReceiveScaleCapabilities", inParams, null);
bob0123
  • 13
  • 5