سؤال

I am working on WIN CE platform, developing windows forms in C#.Net.

The DeviceIoControl API is working fine with the parameters (mentioned below) in c++ console application.

PNIC_STATISTICS structure in nuiouser.h

  global declarations :
  TCHAR PCI1_NAME[] = _T("PCI\\ManiXX1"); 
  TCHAR *AUB_NAME = NULL;       
  AUB_NAME = PCI1_NAME; 

   pNICStat = (PNIC_STATISTICS)malloc(sizeof(NIC_STATISTICS)) ;

   pNICStat->ptcDeviceName = AUB_NAME ;           //wchar_t* ptcDeviceName 

   DeviceIoControl( hUB94Port,                         //void*
                 IOCTL_NDISUIO_NIC_STATISTICS,
                 pNICStat,                         //PNIC_STATISTICS 
                 0,
                 pNICStat,                        //PNIC_STATISTICS 
                 sizeof(NIC_STATISTICS),
                 &dwReturnedBytes,
                 NULL
               );

<==============================================================================> But I'm getting problems in implementing the same with C#.Net CF for WIN-CE7

My WIN-CE Code is as follows:

Modified Structure in C#:

    [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
    public struct __NIC_STAT
    {

        ulong Size;               //  Of this structure.

        public Char[] ptcDeviceName;      //  The device name to be queried.. 

        ulong DeviceState;        //  DEVICE_STATE_XXX above
        ulong DeviceState;        //  DEVICE_STATE_XXX above
        ulong MediaType;          //  NdisMediumXXX
        ulong MediaState;         //  MEDIA_STATE_XXX above
        ulong PhysicalMediaType;
        ulong LinkSpeed;          //  In 100bits/s. 10Mb/s = 100000
        UInt64 PacketsSent;
        UInt64 PacketsReceived;
        ulong InitTime;           //  In milliseconds
        ulong ConnectTime;        //  In seconds
        UInt64 BytesSent;          //  0 - Unknown (or not supported)
        UInt64 BytesReceived;      //  0 - Unknown (or not supported)
        UInt64 DirectedBytesReceived;
        UInt64 DirectedPacketsReceived;
        ulong PacketsReceiveErrors;
        ulong PacketsSendErrors;
        ulong ResetCount;
        ulong MediaSenseConnectCount;
        ulong MediaSenseDisconnectCount; 

    } ;

From this Structure I am just filling ptcDeviceName and trying to send.

 __NIC_STAT NIC_STAT = new __NIC_STAT();

  Char[] toBytes = {'P','C','I','\\','M','a','n','i','X','X','1','\0'}

  NIC_STAT.ptcDeviceName = toBytes;        //public Char[] ptcDeviceName; in structure 
                                      // __NIC_STAT this is the same structure as 
                                      //in  nuiouser.h     


    int sz = Marshal.SizeOf(NIC_STAT.GetType());//sometimes Getting exception here

     intptr ptr = Marshal.AllocHGlobal(sz);

     Marshal.StructureToPtr((__NIC_STAT)NIC_STAT, ptr, false);

   unsafe 
   {           

         DeviceIoControl(hFileHandle,
                     IOCTL_NDISUIO_NIC_STATISTICS,
                     ref ptr,
                     0,
                     ref ptr,
                     sz,
                     ref dwReturnedBytes,
                     0);
  }//unsafe

It's corresponding prototype

  [DllImport("coredll.dll", CharSet = CharSet.Auto, SetLastError = true)]
unsafe public static extern bool DeviceIoControl(
                                                  int hDevice, 
                                                  int dwIoControlCode, 
                                                  ref intptr InBuffer,
                                                  int nInBufferSize,
                                                  ref intptr OutBuffer,
                                                  int nOutputBufferSize, 
                                                  ref int pBytesReturned,
                                                  int pOverlapped
                                                 );

In Win-CE DeviceIoControl() is getting failed, with exception and not displaying any error codes. and sometimes getting error code as 87 (INVALID PARAMETERS).

I feel ptcDeviceName is creating the problem or may be because of allocating memory for pointer (ptr) ?

In Console application we are sending ptcDeviceName as Wchar_t* but in WIN-CE so I used

public Char[] ptcDeviceName;

Can anybody tell me where I am doing wrong.?

هل كانت مفيدة؟

المحلول

You have a couple problems going on here.

First is that you seem to think a ulong is 32-bits in C#, but it's not. It'64 bits, so your struct is totally mapped wrong.

Second, I'm sure you need to be setting the struct Size member before passing it to the call.

Third, that ptcDeviceName member is a pointer to a wide character string. That means that in the struct itself it's 4 bytes. I'd likely make it an IntPtr. You then need to separately allocate the string, pin it, and put the pointer to it into that member slot. Since `StringToHGlobal doesn't exist in the CF, it would look something like this:

public struct __NIC_STAT
{
    public uint Size;
    public IntPtr ptcDeviceName;
    public uint DeviceState;
    public uint DeviceState;
    public uint MediaType;
    public uint MediaState;
    public uint PhysicalMediaType;
    public uint LinkSpeed;
    public ulong PacketsSent;
    public ulong PacketsReceived;
    public uint InitTime;
    public uint ConnectTime;
    public ulong BytesSent;
    public ulong BytesReceived;
    public ulong DirectedBytesReceived;
    public ulong DirectedPacketsReceived;
    public uint PacketsReceiveErrors;
    public uint PacketsSendErrors;
    public uint ResetCount;
    public uint MediaSenseConnectCount;
    public uint MediaSenseDisconnectCount;
};

....
var myStruct = new __NIC_STAT();
myStruct.Size = (15 * 4) + (6 * 8);
var name = "PCI\\Manixx1\0";
var nameBytes = Encoding.Unicode.GetBytes(name);
myStruct.ptcDeviceName = Marshal.AllocHGlobal(nameBytes.Length);
try
{
    Marshal.Copy(nameBytes, 0, myStruct.ptcDeviceName, nameBytes.Length);
    // make the IOCTL call, a-la
    NativeMethods.DeviceIoControl(...., ref myStruct, ....);
}
finally
{
    Marshal.FreeHGlobal(myStruct.ptcDeviceName);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top