`
yexin218
  • 浏览: 971066 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

关于Win7 Native WiFi的一点疑惑【成功创建一个MAC】

阅读更多

刚才测试了Win7自带的无线网卡驱动使用的NDIS版本号。虽然之前不能肯定,但是一直觉得是6.20,因为他能支持virutal wifi 中的hosted network.这个应该是6.20才可能支持的,但是不完全肯定,主要理由是因为我使用OID_DOT11_CREATE_MAC 这个OID时,虽然返回成功,但是没有返回DOT11_MAC_INFO 因为返回的的缓冲区可读数据为0.所以疑惑就在这里:

写道
Virtual WiFi allows an 802.11 miniport driver to connect to, or host, multiple simultaneous connections on a single wireless interface. Beginning with Windows 7, an 802.11 miniport driver must support Virtual WiFi. You must compile or recompile the driver with the NTDDI_VERSION macro set to >= NTDDI_WIN7. In addition, the driver must support NDIS version 6.20.

 现在既然是6.20的版本,而且OID_DOT11_CREATE_MAC返回Success的状态。可是就是没有返回创建New MAC的信息,包括端口号和MAC地址。

Oid =  	OID_GEN_DRIVER_VERSION;
	    Status = filterDoInternalRequest(pFilter,
	                                 NdisRequestQueryInformation,
									 Oid,
									 &InformationBuffer,
									 sizeof(InformationBuffer),
									 sizeof(InformationBuffer),
									 MethodId,
									 &BytesProcessed); 
		if(Status == NDIS_STATUS_SUCCESS){
          DEBUGP(DL_TEST,("Delete a new mac successfully!\n"));
          VersionHighByte = (InformationBuffer & 0xFF00) >> 8;
		  VersionLowByte = (InformationBuffer & 0x00FF);
		  DEBUGP(DL_TEST,("Ndis version:High %x, and Low: %x\n",VersionHighByte,VersionLowByte));
		}

 返回的值高位=0x6,低位=0x14(20)

所以现在的唯一的方法就是返回OID_GEN_SUPPORTED_LIST。 看看返回链表中是否有OID_DOT11_CREATE_MAC。

一般在驱动中都会定义该驱动支持的OID链表:

 UINT supportedOIDs[] =   
 {   
     //   
     // General required OIDs.   
     //   
    
     OID_GEN_SUPPORTED_LIST,   
     OID_GEN_HARDWARE_STATUS,   
     OID_GEN_MEDIA_SUPPORTED,   
     OID_GEN_MEDIA_IN_USE,   
     OID_GEN_MAXIMUM_LOOKAHEAD,   
     OID_GEN_MAXIMUM_FRAME_SIZE,   
     OID_GEN_LINK_SPEED,   
};

 当有需要返回整个链表的时候:

 case OID_GEN_SUPPORTED_LIST:   
             infoSizeNeeded = sizeof(supportedOIDs);  
             NdisMoveMemory(   
                             InformationBuffer,   
                             (PVOID)supportedOIDs,   
                             sizeof(supportedOIDs)   
                             );   
    
                 break;   

 所以返回的list的size和关于数组的指针。虽然知道每个OID的是uint类型的,可是现在怎么把他们打印出来,成了问题。如果直接*(information+4*i),参考 General Operational Characteristics ,估计是数字,而不是字符。这是MSDN的描述:

写道
As a query, the OID_GEN_SUPPORTED_LIST OID specifies an array of OIDs for objects that the miniport driver or a NIC supports. Objects include general, media-specific, and implementation-specific objects.

 最后一句没有明白。

--------------------------------------------2009-12-13------UPDATE-----------------------------------------

之前,由于锁的问题,而我却以为是内存分配的问题。所以对于DOT11_MAC_INFO,使用ULONG informationBuffer来保存,显然空间不够,unsigned long 应该是8个Bytes,而sizeof(DOT11_MAC_INFO) =16.

所以今天测试的时候返回了如下的状态:

写道
NDIS_STATUS_INVALID_LENGTH or NDIS_STATUS_BUFFER_TOO_SHORT
The value specified in the InformationBufferLength member of the NDIS_OID_REQUEST-structured buffer at OidRequest does not match the requirements for the given OID_XXX code. If the information buffer is too small, the BytesNeeded member contains the correct value for InformationBufferLength on return from NdisOidRequest.

 所以需要申请额外的空间:

Oid = OID_DOT11_CREATE_MAC;//OID used to create a new MAC
      
        pFilter = CONTAINING_RECORD(Link, MS_FILTER, FilterModuleLink);
        
        pMacInfo =  (PDOT11_MAC_INFO)NdisAllocateMemoryWithTagPriority(pFilter->FilterHandle, sizeof(DOT11_MAC_INFO), FILTER_ALLOC_TAG, LowPoolPriority);
		NdisZeroMemory(pMacInfo,sizeof(DOT11_MAC_INFO));
	    DEBUGP(DL_TEST,("sizeof DOT11_MAC_INFO is%u!\n",sizeof(DOT11_MAC_INFO)));
		Status = filterDoInternalRequest(pFilter,
	                                  NdisRequestMethod,
									  Oid,
									  pMacInfo,
									  sizeof(DOT11_MAC_INFO),
									  sizeof(DOT11_MAC_INFO),
									  MethodId,
									  &BytesProcessed); 
		 if(Status == NDIS_STATUS_SUCCESS){
           DEBUGP(DL_TEST,("Creae a new mac successfully!\n"));
		   if(BytesProcessed > 0){
            DEBUGP(DL_TEST,("Prot Number is %u\n",pMacInfo->uNdisPortNumber));
            DEBUGP(DL_TEST,("Mac Address is %x-%x-%x-%x-%x-%x\n",pMacInfo->MacAddr[0],pMacInfo->MacAddr[1],pMacInfo->MacAddr[2],pMacInfo->MacAddr[3],pMacInfo->MacAddr[4],pMacInfo->MacAddr[5]));
		   }
		 }else if(Status ==  NDIS_STATUS_OPEN_LIST_FULL)
		 {
          DEBUGP(DL_TEST,("Status is NDIS_STATUS_OPEN_LIST_FULL !\n"));
		 }
		 else
		 {
           DEBUGP(DL_TEST,("Creae a new mac Fail!\n"));
		 } 

 

这下子,好了,可以返回:

00000026    50.94353104    NDISLWF:    
00000027    50.94354630    ==>Filter IO Control dispatch   
00000028    50.94360352    NDISLWF:    
00000029    50.94364929    The input length is 44, and inputdata isRequest from user mode to crate a new MAC.   
00000030    50.94365311        
00000031    50.94380951    NDISLWF:    
00000032    50.94382858    ==>filterDoInternalRequest   
00000033    51.13080597    NDISLWF:    
00000034    51.13083649    BytesProcessed = 16   
00000035    51.13090897    NDISLWF:    
00000036    51.13092422    Creae a new mac successfully!   
00000037    51.13094711    NDISLWF:    
00000038    51.13096237    Prot Number is 1    
00000039    51.13098145    NDISLWF:    
00000040    51.13098526    Filter IO Control dispatch<====   

这个测试没有打印出MAC 地址。

可是奇怪的是,创建成功之后,估计是没有删除,但是没有到达可以创建MAC的上限,当我第二次测试的时候,想把MAC打印出来的时候,发现返回的BytesProcessed=0.可是仍然是创建成功的,当然这个时候没有portnumber了。跟之前的状况有点相似了

-------------------继续更新---------------------

其实不小心犯了一个错误,忘记了将返回的内容写进InformationBuffer:

00000019 23.88084602 Filter IO Control dispatch<==== 
00000020 24.11517906 NDISLWF:  
00000021 24.11519814 ==>Filter IO Control dispatch 
00000022 24.11523628 NDISLWF:  
00000023 24.11548042 The input length is 44, and inputdata isRequest from user mode to crate a new MAC. 
00000024 24.11548805   
00000025 24.11552620 NDISLWF:  
00000026 24.11553955 sizeof DOT11_MAC_INFO is16! 
00000027 24.11557198 NDISLWF:  
00000028 24.11559105 ==>filterDoInternalRequest 
00000029 24.27196312 NDISLWF:  
00000030 24.27199936 Creae a new mac successfully! 
00000031 24.27202034 NDISLWF:  
00000032 24.27203941 Prot Number is 1 
00000033 24.27205467 NDISLWF:  
00000034 24.27209473 Mac Address is 0-14-78-7a-2-a2
 
00000035 24.27212715 NDISLWF:  
00000036 24.27213287 Filter IO Control dispatch<==== 

 



 
 那么接下来就是删除等后续动作了,删除就有些失望了:




 
 估计是该驱动不支持?这个不是很可能,因为它已经支持了OID_DOT11_CREATE_MAC,必定支持OID_DOT11_DELETE_MAC.另外查询没有问题:6.20.

  • 大小: 89.9 KB
  • 大小: 85.6 KB
分享到:
评论
1 楼 yexin218 2010-01-04  
Successfylly get ndis version! And Version Info:
Version of Ndis Driver is 6.20
Input your command,like: help
>create
Successfylly Create A new MAC
Port Number is 1, and Mac address is 0-14-78-7a-88-b7
不是所有的都一样的!!

相关推荐

    Native Wifi C#示例

    "Native Wifi C#示例"是关于利用C#编程语言与Windows操作系统内置的Native Wifi API(wlanapi.dll)进行交互的实践教程。这个API允许开发者直接控制和管理无线网络连接,提供了比.NET Framework提供的`System.Net....

    native wifi连接网络

    描述中的“包含了wlanhelper类”,表明在提供的压缩包文件中,可能有一个名为`WlanHelper`的类,这个类可能是对Native WiFi API的封装,使得开发者能够更方便地调用API函数。通常,这样的类会包含一些方法,如扫描...

    win7,win10react-native 环境配置

    React Native 是一个开源框架,由Facebook开发,用于构建原生移动应用程序。它允许开发者使用JavaScript和React库来编写代码,同时享受到与原生应用相似的性能。本教程将详细介绍在Windows 7和Windows 10操作系统上...

    native wifi api 编程

    本文将深入探讨Native WiFi API的基本概念、编程接口、使用方法,并结合实例介绍如何利用它实现一个基于室内Wi-Fi定位的程序。 一、Native WiFi API基础 1.1 Native WiFi API概述 Native WiFi API是Windows Vista...

    Native wifi 连接无线网有密码无密码

    Native Wifi API 是 Windows 操作系统提供的一种编程接口,允许开发者直接与无线网络硬件进行交互,实现对无线网络连接的控制。这种API在VC++(Visual C++)环境中特别有用,因为它可以集成到C++应用程序中,为用户...

    wifi.rar_C# WiFi_CSHARP wifi_VS 2010_WIFI--Distance_native Wi

    标题中的“wifi.rar_C# WiFi_CSHARP wifi_VS 2010_WIFI--Distance_native Wi”表明这是一个关于使用C#编程语言开发的WiFi相关项目,特别提到了“native Wi”,意味着它可能涉及到Windows操作系统底层的WiFi接口。...

    C#win7wifi热点定时关机

    标题中的"C# Win7 WiFi热点定时关机"指的是使用C#编程语言开发的一个应用程序,该程序功能是在Windows 7操作系统中创建一个WiFi热点,并且具备定时自动关闭计算机的能力。这个程序可能被设计为帮助用户在特定时间...

    MyRouter win7变wifi热点

    【标题】"MyRouter win7变wifi热点"指的是利用MyRouter工具将Windows 7系统转换为无线网络热点,使得其他设备可以通过Wi-Fi连接并共享该电脑的网络连接。这一功能在没有路由器或需要临时共享网络时非常实用。 ...

    易语言源码易语言win7下架设wifi源码.rar

    这个压缩包文件"易语言源码易语言win7下架设wifi源码.rar"包含了一个使用易语言编写的程序,用于在Windows 7操作系统下设置和管理无线网络连接,即创建WiFi热点。 易语言的特点在于其直观的语法,它采用接近自然...

    wifi native api + qt扫描连接程序demo

    windows下c++操作wifi的demo,使用官方wifi native api编写的demo程序,结合Qt信号槽使用,注意点看这里https://blog.csdn.net/baidu_30570701/article/details/103207045

    ReactNative组件用于利用ReactART创建动画圆形进度条

    ReactART是React的一个扩展库,它为React Native提供了一个2D图形渲染层,使得开发者能够在移动平台上创建丰富的图形,包括自定义的动画和图表。 本篇将详细讲解如何利用React Native组件与ReactART来创建动画圆形...

    react-native-wifi-manager

    这是用于创建本机WiFi Manager包装器的WIP。 入门 $ npm install react-native-wifi-manager --save 大多是自动安装 $ react-native link react-native-wifi-manager 手动安装 的iOS 在XCode的项目导航器中,...

    SQL Native Client (win 7 x64 \ x32)

    解决在win7 x64\x32下面安装sql native client 不成功的

    Dell Latitude 3490 使用 UEFI安装Win7.docx

    3. 驱动安装完成后,就可以按照正常流程继续安装 Win7:在安装驱动完成后,系统将继续安装 Win7,並需要创建 ESP 和 MSR 分区,以便正确安装 Win7。 四、ESP 和 MSR 分区 在安装 Win7 时,需要创建 ESP 和 MSR ...

    reactnative一个基于React的创建原生APP的框架

    react-native:一个基于 React 的创建原生APP的框架

    windows下QT编写的连接wifi程序

    总的来说,"windows下QT编写的连接wifi程序"项目结合了Qt的便利性和Windows Native WiFi API的底层控制能力,为开发人员提供了一种有效的方式,以图形化界面实现无线网络的管理和连接。理解这些技术可以帮助你创建更...

    Android Native TCP C语言实现Server创建和Client连接

    每个连接请求都会创建一个新的线程,这样服务器就能同时处理多个客户端的请求。 7. **Android中的异步调用** 在Android应用中,由于主线程不能进行阻塞操作,所以服务器的监听和客户端的连接通常会在后台线程或者...

    Win10可用的Microsoft SQL Server 2008 Native Client

    在本场景中,"Navicat"被提及,这是一个流行的数据管理工具,用户可以使用它通过SQL Server 2008 Native Client来远程或本地管理SQL Server数据库。 SQL Server 2008 Native Client包含了以下关键特性: 1. **ODBC...

    React Native 的 WiFi 连接管理器

    React Native 的 WiFi 管理器 (react-native-wifi-manager) 列出、连接并获取设备上 WiFi 连接的状态。 安装 首先需要安装 react-native-wifi-manager: npm install react-native-wifi-manager --save 在 android/...

Global site tag (gtag.js) - Google Analytics