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应该遵循哪个原型?
这看起来不对:
byte[] toBytes = Encoding.ASCII.GetBytes(AUB_NAME);
Windows CE非常、非常倾向于Unicode。应该是:
byte[] toBytes = Encoding.Unicode.GetBytes(AUB_NAME);
这里有点晚了,但是关于IOCTL_NDISUIO_OPEN_DEVICE
还有两件事要注意:
- 传递给
DeviceIoControl
的输入缓冲区不能是const
,否则调用将失败,错误87 (ERROR_INVALID_PARAMETER
),因为NDISUIO试图将数据复制回输入缓冲区(!)所以不要像一些MSDN示例那样传递字符串字面量。 - 输入缓冲区的长度不能包含终止NUL。如果是,NDISUIO将无法在其内部列表中找到适配器名称并返回错误31 (
ERROR_GEN_FAILURE
)。MSDN确实指出应该忽略NULL字符,但是措辞使它听起来是可选的,而实际上它不是。