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

微軟自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啟動此服務:

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

[c-sharp]   view plain copy print ?
  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.    @@:  

啟動服務:

[cpp]   view plain copy print ?
  1. INVOKE    StartService, @hSvr, 0h, NULL  
  2.    cmp    eax, NULL  
  3.     je    Return_Clean  

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

加入以下代碼:

[cpp]   view plain copy print ?
  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.    @@:  

 

獲得一個客戶端句柄:

[cpp]   view plain copy print ?
  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):

[cpp]   view plain copy print ?
  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

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

 

列舉系統中的網絡接口:

[cpp]   view plain copy print ?
  1.    
  2.  lea    eax, @pil  
  3. push    eax  
  4. push    NULL  
  5. push    @hCli  
  6. call    WlanEnumInterfaces  
  7.  cmp    eax, 0h  
  8.  jne    Return_Clean  
  9.   
  10.  mov    ebx, @pil  
  11.  mov    ecx, [ebx]  
  12.  add    ebx, 8h  
  13.    
  14.  @@:  
  15.  dec    ecx  
  16. push    ecx  
  17. push    ebx  
  18. push    pszAPName  
  19.  mov    eax, ebx  
  20.  add    eax, sizeof GUID  
  21. push    eax  
  22. push    ebx  
  23. push    @hCli  
  24. call    pfnEnumProc  
  25.  cmp    eax, 0h  
  26.   je    @F    
  27.  pop    ebx  
  28.  add    ebx, 214h  
  29.  pop    ecx  
  30.  cmp    ecx, 0h  
  31.   jg    @B  
  32.  jmp    Return_Clean  
  33.  @@:  
  34.  mov    @ret, 0h  
  35.   
  36. lean:  
  37.  cmp    @pil, NULL  
  38.   je    @F  
  39. push    @pil  
  40. call    WlanFreeMemory  
  41.  @@:       
  42.  cmp    @hCli, NULL  
  43.   je    @F  
  44. push    @hCli  
  45. call    WlanCloseHandle  
  46.  @@:           
  47.  mov    eax, @ret  
  48.  ret  

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

[c-sharp]   view plain copy print ?
  1. DWORD WINAPI WlanEnumInterfaces(  
  2.   __in          HANDLE hClientHandle,  
  3.   __in          PVOID pReserved,  
  4.   __out         PWLAN_INTERFACE_INFO_LIST* ppInterfaceList  
  5. )  

hClientHandle

使用WlanOpenHandle函數獲得的客戶端句柄。

pReserved

此值設為NULL。

ppInterfaceList

一個WLAN_INTERFACE_INFO_LIST結構指針的地址,你隻需要給它一個空指針就可以,用完後調用WlanFreeMemory釋放它。

 

掃描周圍的無線網絡:

[cpp]   view plain copy print ?
  1. push    NULL  
  2. push    NULL  
  3. push    NULL  
  4. push    pGuid  
  5. push    hWlanClient  
  6. call    WlanScan  
  7.  cmp    eax, 0h  
  8.  jne    Return_Clean  

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

[cpp]   view plain copy print ?
  1. DWORD WINAPI WlanScan(  
  2.   __in          HANDLE hClientHandle,  
  3.   __in          const GUID* pInterfaceGuid,  
  4.   __in_opt      const PDOT11_SSID pDot11Ssid,  
  5.   __in_opt      const PWLAN_RAW_DATA pIeData,  
  6.   PVOID pReserved  
  7. );  

hClientHandle

使用WlanOpenHandle函數獲得的客戶端句柄。

pInterfaceGuid

使用WlanEnumInterfaces函數得到的網絡接口GUID,指針類型。

pDot11Ssid

一個DOT11_SSID結構指針,此函數將搜索此結構指定的網絡,如果設為NULL將會搜索所有網絡。

XP SP2:  必須設為NULL.
pIeData

一个WLAN_RAW_DATA结构指針,客户端配置可能包括提供信息和802.1X认证的要求,可以設為NULL。

XP SP2:  必須設為NULL.
pReserved

必須設為NULL.

 

獲取搜索到的無線網絡列表:

[cpp]   view plain copy print ?
  1.          lea    eax, @pil  
  2.         push    eax  
  3.         push    NULL  
  4.         push    1h  
  5.         push    pGuid  
  6.         push    hWlanClient  
  7.         call    WlanGetAvailableNetworkList  
  8.          cmp    eax, 0h  
  9.          jne    Return_Clean  
  10.                    
  11.          mov    ebx, @pil  
  12.          mov    ecx, [ebx]  
  13.          add    ebx, 8h  
  14.            
  15.          @@:  
  16.          dec    ecx  
  17.         push    ecx  
  18.         push    ebx  
  19.           
  20.          mov    edx, ebx  
  21.          add    ebx, 516  
  22.          add    edx, 25ch  
  23.   .if pszAPName == NULL  
  24.         push    ebx  
  25.         push    edx  
  26.       INVOKE    lstrlen, ebx  
  27.          pop    edx  
  28.          pop    ebx  
  29.     .if eax > 0h  
  30.       INVOKE    WlanPrintInfo, pszAdapterName, ebx, edx  
  31.          mov    @ret, 0h  
  32.     .endif  
  33.   .else  
  34.         push    ebx  
  35.         push    edx  
  36.       INVOKE    lstrcmpi, pszAPName, ebx  
  37.          pop    edx  
  38.          pop    ebx  
  39.     .if eax == 0h  
  40.       INVOKE    WlanPrintInfo, pszAdapterName, ebx, edx  
  41.          mov    @ret, 0h     
  42.     .endif  
  43.   .endif  
  44.         ;offset 604 is wlanSignalQuality  
  45.          pop    ebx  
  46.          add    ebx, 274h  
  47.          pop    ecx  
  48.          cmp    ecx, 0h  
  49.           jg    @B  
  50.          jmp    Return_Clean  
  51.          @@:            
  52.            
  53. Return_Clean:  
  54.          cmp    @pil, NULL  
  55.           je    @F  
  56.         push    @pil  
  57.         call    WlanFreeMemory  
  58.          @@:       
  59.          mov    eax, @ret  
  60.          ret  

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

[c-sharp]   view plain copy print ?
  1. DWORD WINAPI WlanGetAvailableNetworkList(  
  2.   __in          HANDLE hClientHandle,  
  3.   __in          const GUID* pInterfaceGuid,  
  4.   __in          DWORD dwFlags,  
  5.   PVOID pReserved,  
  6.   __out         PWLAN_AVAILABLE_NETWORK_LIST* ppAvailableNetworkList  
  7. );  

hClientHandle

使用WlanOpenHandle函數獲得的客戶端句柄。

pInterfaceGuid

使用WlanEnumInterfaces函數得到的網絡接口GUID,指針類型。

dwFlags
意思

WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES
0x00000001

包括所有可用的网络列表中特设的网络配置,包括配置文件不可见。

WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES
0x00000002

包括所有可用的网络列表中隐藏的网络配置,包括配置文件不可见。

pReserved

必須設為NULL.

ppAvailableNetworkList

一個WLAN_AVAILABLE_NETWORK_LIST結構指針的地址,用來接收找到的網絡信息列表,你隻需要給它一個空指針就可以,用完後調用WlanFreeMemory釋放它。

 

最後,設用WlanPrintInfo打印搜索到的信息:

 

[cpp]   view plain copy print ?
  1. WlanPrintInfo proc pszAdapterName:DWORD, pszAPName:DWORD, dwSignalQuality:DWORD  
  2.   LOCAL @arry[100h]: BYTE  
  3.   LOCAL @floatDWORD  
  4.     
  5.        mov    @float, 0h  
  6.     INVOKE    RtlZeroMemory, addr @arry, 100h  
  7.     INVOKE    WideCharToMultiByte, 0h, 0h, pszAdapterName, 100h, addr @arry, 100h, 0h, 0h  
  8.       
  9.        mov    ebx, dwSignalQuality  
  10.        mov    eax, [ebx]  
  11.        and    eax, 7fh  
  12.        mov    ecx, [ebx]  
  13.        and    ecx, 7fh  
  14.        mov    edx, -100  
  15.       test    eax, 1h  
  16.         jz    @F  
  17.        mov    @float, 352eh  
  18.        @@:  
  19.        shr    eax, 1h  
  20.        add    edx, eax  
  21.     INVOKE    wsprintf, addr szPrintBuffer, addr szPrintFormat, addr @arry, pszAPName, ecx, edx, addr @float  
  22.     INVOKE    lstrlen, addr szPrintBuffer  
  23.        mov    edx, eax  
  24.     INVOKE    WriteFile, hStdOut, addr szPrintBuffer, edx, addr dwBytesX, NULL   
  25.        ret  
  26. WlanPrintInfo endp  

 

初始化WlanAPI,本例中我是使用LoadLibrary和GetProcAddress調用Wlan API的。所以需要以下步驟:

[cpp]   view plain copy print ?
  1. WlanInitialize proc  
  2.   LOCAL @ret: DWORD  
  3.   
  4.        mov    @ret, 1h  
  5.     INVOKE    LoadLibrary, addr szWlanLibrary  
  6.        cmp    eax, NULL  
  7.         je    Return_Code  
  8.        mov    hWlanModule, eax  
  9.          
  10.     INVOKE    GetProcAddress, hWlanModule, addr szWlanAllocateMemory  
  11.        cmp    eax, NULL  
  12.         je    Return_Code  
  13.        mov    WlanAllocateMemory, eax  
  14.     INVOKE    GetProcAddress, hWlanModule, addr szWlanFreeMemory  
  15.        cmp    eax, NULL  
  16.         je    Return_Code  
  17.        mov    WlanFreeMemory, eax  
  18.     INVOKE    GetProcAddress, hWlanModule, addr szWlanOpenHandle  
  19.        cmp    eax, NULL  
  20.         je    Return_Code  
  21.        mov    WlanOpenHandle, eax  
  22.     INVOKE    GetProcAddress, hWlanModule, addr szWlanCloseHandle  
  23.        cmp    eax, NULL  
  24.         je    Return_Code  
  25.        mov    WlanCloseHandle, eax  
  26.     INVOKE    GetProcAddress, hWlanModule, addr szWlanEnumInterfaces  
  27.        cmp    eax, NULL  
  28.         je    Return_Code  
  29.        mov    WlanEnumInterfaces, eax  
  30.     INVOKE    GetProcAddress, hWlanModule, addr szWlanGetInterfaceCapability  
  31.        mov    WlanGetInterfaceCapability, eax  
  32.        ;and    @val, eax ;This function is not supported for Windows XP SP2.  
  33.     INVOKE    GetProcAddress, hWlanModule, addr szWlanQueryInterface  
  34.        cmp    eax, NULL  
  35.         je    Return_Code  
  36.        mov    WlanQueryInterface, eax  
  37.     INVOKE    GetProcAddress, hWlanModule, addr szWlanSetInterface  
  38.        cmp    eax, NULL  
  39.         je    Return_Code  
  40.        mov    WlanSetInterface, eax  
  41.     INVOKE    GetProcAddress, hWlanModule, addr szWlanScan  
  42.        cmp    eax, NULL  
  43.         je    Return_Code  
  44.        mov    WlanScan, eax  
  45.     INVOKE    GetProcAddress, hWlanModule, addr szWlanGetAvailableNetworkList  
  46.        cmp    eax, NULL  
  47.         je    Return_Code  
  48.        mov    WlanGetAvailableNetworkList, eax  
  49.     INVOKE    GetProcAddress, hWlanModule, addr szWlanGetProfile  
  50.        cmp    eax, NULL  
  51.         je    Return_Code  
  52.        mov    WlanGetProfile, eax  
  53.     INVOKE    GetProcAddress, hWlanModule, addr szWlanSetProfile  
  54.        cmp    eax, NULL  
  55.         je    Return_Code  
  56.        mov    WlanSetProfile, eax  
  57.     INVOKE    GetProcAddress, hWlanModule, addr szWlanDeleteProfile  
  58.        cmp    eax, NULL  
  59.         je    Return_Code  
  60.        mov    WlanDeleteProfile, eax  
  61.     INVOKE    GetProcAddress, hWlanModule, addr szWlanConnect  
  62.        cmp    eax, NULL  
  63.         je    Return_Code  
  64.        mov    WlanConnect, eax  
  65.     INVOKE    GetProcAddress, hWlanModule, addr szWlanDisconnect  
  66.        cmp    eax, NULL  
  67.         je    Return_Code  
  68.        mov    WlanDisconnect, eax  
  69.        mov    @ret, 0h  
  70.           
  71. turn_Code:  
  72.        mov    eax, @ret  
  73.        ret  
  74. WlanInitialize endp  
  75.   
  76. WlanUninitialize proc  
  77.        cmp    hWlanModule, NULL  
  78.         je    @F  
  79.     INVOKE    FreeLibrary, hWlanModule  
  80.        @@:           
  81.        mov    WlanAllocateMemory, NULL  
  82.        mov    WlanFreeMemory, NULL  
  83.        mov    WlanOpenHandle, NULL  
  84.        mov    WlanCloseHandle, NULL  
  85.        mov    WlanEnumInterfaces, NULL  
  86.        mov    WlanGetInterfaceCapability, NULL  
  87.        mov    WlanQueryInterface, NULL  
  88.        mov    WlanSetInterface, NULL  
  89.        mov    WlanScan, NULL  
  90.        mov    WlanGetAvailableNetworkList, NULL  
  91.        mov    WlanGetProfile, NULL  
  92.        mov    WlanSetProfile, NULL  
  93.        mov    WlanDeleteProfile, NULL  
  94.        mov    WlanConnect, NULL  
  95.        mov    WlanDisconnect, NULL  
  96.        mov    eax, 0h  
  97.        ret  
  98. WlanUninitialize endp  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值