现在的位置: 首页 > 综合 > 正文

使用Native Wifi API查找無線網絡信息

2013年02月13日 ⁄ 综合 ⁄ 共 2860字 ⁄ 字号 评论关闭

微軟自XP SP2之後的系統提供了關於Wireless開發的API,

據MSDN描述,此SDK提供兩個主要功能,即:管理无线网络配置和管理无线网络连接。

 

使用這套API也很簡單,主要步驟如下:

  1. 使用WlanOpenHandle、WlanCloseHandle打開或關閉一個客戶端句柄。
  2. 使用WlanEnumInterfaces列舉系統中可用的Wireless設備接口,主要用到的就是它返回的每個無線網卡的GUID這個參數。
  3. 使用WlanGetInterfaceCapability獲取關於無線網卡的性能參數,(注意這個函數在XP SP2下是不被支持的)
  4. 使用WlanQueryInterface獲取關於無線網卡接口的某些參數。
  5. 使用WlanSetInterface設置無線網卡接口某些參數。
  6. 使用WlanScan列舉每個無線網卡接口上找到的可用無線AP。
  7. 使用WlanGetAvailableNetworkList獲取有效的無線網絡信息。
  8. 使用WlanGetProfile、WlanSetProfile、WlanDeleteProfile管理無線網絡配置信息。
  9. 使用WlanConnect、WlanDisconnect連接或斷開某個無線網絡。

在我的這個程式中隻用到WlanOpenHandle、WlanCloseHandle、WlanEnumInterfaces、WlanScan、WlanGetAvailableNetworkList就可以搜索附近的無線網絡信息。

 

首先,要確保Wireless Zero Configuration服務是開啟狀態。

如果它被關閉就使用StartService啟動此服務:

首先先判斷服務是否以經啟動:

  1. INVOKE    OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS  
  2.    cmp    eax, NULL  
  3.     je    Return_Clean  
  4.    mov    @hSCM, eax  
  5.      
  6. INVOKE    OpenService, @hSCM, pszServiceName, SERVICE_ALL_ACCESS  
  7.    cmp    eax, NULL  
  8.     je    Return_Clean  
  9.    mov    @hSvr, eax  
  10.      
  11. INVOKE    RtlZeroMemory, addr @qss, sizeof QSS  
  12. INVOKE    QueryServiceStatus, @hSvr, addr @qss  
  13.    cmp    eax, NULL  
  14.     je    Return_Clean  
  15.      
  16.    mov    eax, @qss.dwCurrentState  
  17.    cmp    eax, 4h  
  18.    jne    @F  
  19.    mov    @ret, 0h  
  20.    jmp    Return_Clean  
  21.    @@:  

啟動服務:

  1. INVOKE    StartService, @hSvr, 0h, NULL  
  2.    cmp    eax, NULL  
  3.     je    Return_Clean  

注意:有時候Wireless Zero Configuration服務有可能被Disable掉,這時需要將它設為自動啟動或手動啟動才能調用StartService。

加入以下代碼:

  1. INVOKE    QueryServiceConfig, @hSvr, NULL, 0h, addr dwBytesX  
  2. INVOKE    HeapAlloc, hHeap, HEAP_ZERO_MEMORY, dwBytesX  
  3.    mov    @qsc, eax  
  4. INVOKE    QueryServiceConfig, @hSvr, @qsc, dwBytesX, addr dwBytesX  
  5.    cmp    eax, NULL  
  6.     je    Return_Clean  
  7.       
  8. assume    ebx: PQSC  
  9.    mov    ebx, @qsc  
  10.    mov    eax, [ebx].dwStartType  
  11. assume    ebx: nothing  
  12.    cmp    eax, 4h  
  13.    jne    Return_Clean  
  14. INVOKE    ChangeServiceConfig, @hSvr, 0ffffffffh, 2h, 0ffffffffh, NULL, NULL, NULL, NULL, NULL, NULL, NULL  
  15.    @@:  

 

獲得一個客戶端句柄:

  1.  mov    @ret, 1h  
  2.  mov    @pil, NULL  
  3.  mov    @hCli, NULL  
  4. VOKE    GetClientVersion  
  5.  cmp    eax, 0h  
  6.   je    Return_Clean  
  7.    
  8.  mov    ebx, eax  
  9.  mov    dwReturned, 0h  
  10.  lea    eax, @hCli  
  11. push    eax  
  12.  lea    eax, dwReturned  
  13. push    eax  
  14. push    NULL  
  15. push    ebx  
  16. call    WlanOpenHandle  
  17.  cmp    eax, 0h  
  18.  jne    Return_Clean  
  19.  cmp    @hCli, NULL  
  20.   je    Return_Clean  

其中WlanOpenHandle函數參數如下(MSDN):

  1. DWORD WINAPI WlanOpenHandle(  
  2.   __in          DWORD dwClientVersion,  
  3.   PVOID pReserved,  
  4.   __out         PDWORD pdwNegotiatedVersion,  
  5.   __out         PHANDLE phClientHandle  
  6. );  

 

dwClientVersion
意思

1

當系統版本為Windows XP SP2時。

2

當系統版本為Vista and Windows Server 2008或更高時。

pReserved

這個參數設為NULL.

pdwNegotiatedVersion

此值可以設為NULL。

phClientHandle

一個句柄指針,用來接收獲得的客戶端句柄.

 

列舉系統中的網絡接口:

  1.    

抱歉!评论已关闭.