我正在使用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的原型吗?
答案 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
要注意另外两件事:
DeviceIoControl
的输入缓冲区不能是const
,否则调用将因错误87(ERROR_INVALID_PARAMETER
)而失败,因为NDISUIO会尝试将数据复制回输入缓冲区(!因此,不要像some MSDN samples那样传递字符串文字。ERROR_GEN_FAILURE
)。 MSDN确实指出the NULL character should be disregarded,但措辞使它听起来是可选的,而实际上它并非如此。