iamfoolberg
驱动牛犊
驱动牛犊
  • 注册日期2009-03-31
  • 最后登录2010-02-07
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3888回复:6

求教关于wifi的ndis编程

楼主#
更多 发布于:2009-10-14 23:44
新手求教,请多包涵。

我的目标是直接控制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中设定报文类型和过滤器的代码都是不能正确运行的,也正是我需要的(尤其是报文过滤)。

hellocel
驱动牛犊
驱动牛犊
  • 注册日期2009-07-02
  • 最后登录2010-12-13
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望81点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-10-19 14:44
在WinXP(SP2)以后的版本中MS自带的protocol driver对于Set的指令应该是都不支持的,需要自己写protocol driver。
drivercoding
驱动牛犊
驱动牛犊
  • 注册日期2009-10-19
  • 最后登录2013-08-17
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望191点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-10-19 16:03
NDISUIO本来就是MS自己开发的驱动,他的功能很强,现在MS的很多测试软件都会以来与这个protocol driver。但是大多数接口都是不公开的。针对你的需求,你需要开发一个protocol driver。
zzzwwwqsqs
驱动牛犊
驱动牛犊
  • 注册日期2010-04-30
  • 最后登录2010-05-21
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-04-30 12:10
我也遇到了同样的问题,就是在XP下的wifi程序移植到WIN7上就不能使用了;据说是nwifi.sys把这个SET_OID请求拦截了,自已开发protocol driver的话,是否还要加载无线网卡厂商的driver?如果还是要加载的话,那么SET_ODI还有可能被拦截。请帮忙指点一下,谢谢了
qinhai_jsl
驱动牛犊
驱动牛犊
  • 注册日期2010-05-11
  • 最后登录2010-05-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-05-11 20:54
楼主 能留一下联系方式吗?关于wifi 我有一些问题希望指点一二 519943042 我的QQ
thanfur
驱动牛犊
驱动牛犊
  • 注册日期2007-10-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望268点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2010-07-12 10:31
引用第3楼zzzwwwqsqs于2010-04-30 12:10发表的  :
我也遇到了同样的问题,就是在XP下的wifi程序移植到WIN7上就不能使用了;据说是nwifi.sys把这个SET_OID请求拦截了,自已开发protocol driver的话,是否还要加载无线网卡厂商的driver?如果还是要加载的话,那么SET_ODI还有可能被拦截。请帮忙指点一下,谢谢了


他说对了 是nwifi.sys把这个SET_OID请求拦截 这里n表示native 在微软的系统中native 表示未公开的,内部使用的接口,结构。

你需要了解下NDIS 6.0的层次结构,并在nwifi.sys的底层来自己实现一个驱动
reginald1985
驱动牛犊
驱动牛犊
  • 注册日期2008-10-24
  • 最后登录2010-09-01
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望63点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2010-07-14 17:44
好好学习一下NDIS6.0的架构就知道结果了。本人已经实现监听功能呵~~~
游客

返回顶部