windows ce - DeviceIoControl (IOCTL_NDISUIO_OPEN_DEVICE)在WIN

本文关键字:DEVICE OPEN WIN NDISUIO windows DeviceIoControl IOCTL ce | 更新日期: 2023-09-27 17:50:40

我在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);

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

上述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紧凑框架中的deviceiocontrol API应该遵循哪个原型?

windows ce - DeviceIoControl (IOCTL_NDISUIO_OPEN_DEVICE)在WIN

这看起来不对:

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

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

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

这里有点晚了,但是关于IOCTL_NDISUIO_OPEN_DEVICE还有两件事要注意:

  1. 传递给DeviceIoControl的输入缓冲区不能是const,否则调用将失败,错误87 (ERROR_INVALID_PARAMETER),因为NDISUIO试图将数据复制回输入缓冲区(!)所以不要像一些MSDN示例那样传递字符串字面量。
  2. 输入缓冲区的长度不能包含终止NUL。如果是,NDISUIO将无法在其内部列表中找到适配器名称并返回错误31 (ERROR_GEN_FAILURE)。MSDN确实指出应该忽略NULL字符,但是措辞使它听起来是可选的,而实际上它不是。