阅读:4001回复:6
求教关于wifi的ndis编程
新手求教,请多包涵。
我的目标是直接控制wifi网卡收发以太网报文。 在WinCE和Windows XP (SP2/3)上基本上都能通过使用NDISUIO和NDISPROT来完成。 但是在Vista和Win7中就出问题了。 我的问题: 1、无线网卡的配置和数据收发是两个可以独立的过程吗? 典型的是我在win7下可以通过手工配置无线网络的方式,使得NDIS6自带的那个prottest.exe例子程序发数据。 也可以在程序中使用Native Wifi中WlanSetProfile函数等配置后发送数据。 2、Win7或Vista的NDISPROT没法在用户模式下调用吗? 我执行 if (!DeviceIoControl( hDevice, IOCTL_NDISPROT_SET_OID_VALUE, &NDISPROTSetOid, sizeof(NDISPROTSetOid), NULL, 0, &dwBytesReturned, NULL)){ return FALSE; } 时,出现31号错误。而这个代码在Windows XP (SP2/3)中可以运行。 只要使用了 IOCTL_NDISPROT_SET_OID_VALUE,就会出错。而Handle(即hDevice变量)的打开和绑定都没有问题。 由于Win7和Vista都比较新,相关信息比较少,我无法判断是什么问题:) 3、Native WiFi中怎么设置报文过滤? 就是在NDIS中可以用 BOOL setPacketFilterType(PWifiAdaptor pAdaptor, ULONG type){ DWORD dwBytesReturned = 0; BYTE pBuffer[sizeof(NDISPROT_SET_OID) + sizeof(ULONG)]; PNDISPROT_SET_OID pNDISPROTSetOid = (PNDISPROT_SET_OID) pBuffer; ULONG* pType = (ULONG*) pNDISPROTSetOid->Data; pNDISPROTSetOid->Oid = OID_GEN_CURRENT_PACKET_FILTER; *pType = type; if (!DeviceIoControl( pAdaptor->ndisuioHandle, IOCTL_NDISPROT_SET_OID_VALUE, pBuffer, sizeof(pBuffer), NULL, 0, &dwBytesReturned, NULL)){ return FALSE; } return TRUE; } 来进行设定的报文过滤。 最后附上我的两份源码: wifi.rar WinWifi是XP下的,能够正常收发数据。 VistaWifi是Vista和Win7下的,仅在Win7下测试过发送数据。 新手编程,比较烂,见笑:)VistaWifi中设定报文类型和过滤器的代码都是不能正确运行的,也正是我需要的(尤其是报文过滤)。 |
|
沙发#
发布于:2009-10-19 14:44
在WinXP(SP2)以后的版本中MS自带的protocol driver对于Set的指令应该是都不支持的,需要自己写protocol driver。
|
|
板凳#
发布于:2009-10-19 16:03
NDISUIO本来就是MS自己开发的驱动,他的功能很强,现在MS的很多测试软件都会以来与这个protocol driver。但是大多数接口都是不公开的。针对你的需求,你需要开发一个protocol driver。
|
|
地板#
发布于:2010-04-30 12:10
我也遇到了同样的问题,就是在XP下的wifi程序移植到WIN7上就不能使用了;据说是nwifi.sys把这个SET_OID请求拦截了,自已开发protocol driver的话,是否还要加载无线网卡厂商的driver?如果还是要加载的话,那么SET_ODI还有可能被拦截。请帮忙指点一下,谢谢了
|
|
地下室#
发布于:2010-05-11 20:54
楼主 能留一下联系方式吗?关于wifi 我有一些问题希望指点一二 519943042 我的QQ
|
|
6楼#
发布于:2010-07-14 17:44
好好学习一下NDIS6.0的架构就知道结果了。本人已经实现监听功能呵~~~
|
|