在WINCE7 C#.net中DeviceIoControl(IOCTL_NDISUIO_OPEN_DEVICE)失败

时间:2014-03-17 12:32:36

标签: c# windows-ce

我正在使用WIN CE平台,在C#.Net中开发Windows窗体。成功为NDISUIO创建句柄(“UIO1:”)。

检查API:

                string AUB_NAME = "PCI\\ManiXX1";

                byte[] toBytes = Encoding.ASCII.GetBytes(AUB_NAME);              

                int IOCTL_NDIS_QUERY = new int();
                IOCTL_NDIS_QUERY = IOCTL_NDISUIO_OPEN_DEVICE;

                IoctlResult = DeviceIoControl(
                                    hFileHandle,
                                    IOCTL_NDIS_QUERY,
                                    toBytes,
                                    (int)(11 * sizeof(UInt16)),//It should be 11 or 22 bytes?
                                    null,
                                    0,
                                    ref dwReturnedBytes,
                                    0);

以上语法对应于下面提到的第一个原型。

Above API的原型:

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

当我在WIN CE机器上运行此代码时,我收到错误代码87,(参数不正确.ERROR_INVALID_PARAMETER)

我正在检查参数,我觉得这些是正确的,任何人都可以告诉我有关参数信息及其类型的信息,在C#.net Compact框架中应该遵循deviceiocontrol API的原型吗?

2 个答案:

答案 0 :(得分:2)

这对我来说不对:

byte[] toBytes = Encoding.ASCII.GetBytes(AUB_NAME);

Windows CE非常非常偏向于Unicode。应该是:

byte[] toBytes = Encoding.Unicode.GetBytes(AUB_NAME);

答案 1 :(得分:0)

这里的派对有点晚了,但IOCTL_NDISUIO_OPEN_DEVICE要注意另外两件事:

  1. 传递给DeviceIoControl的输入缓冲区不能是const,否则调用将因错误87(ERROR_INVALID_PARAMETER)而失败,因为NDISUIO会尝试将数据复制回输入缓冲区(!因此,不要像some MSDN samples那样传递字符串文字。
  2. 输入缓冲区的长度不得包括终止NUL。如果是这样,NDISUIO将无法在其内部列表中找到适配器名称并返回错误31(ERROR_GEN_FAILURE)。 MSDN确实指出the NULL character should be disregarded,但措辞使它听起来是可选的,而实际上它并非如此。