微軟自XP SP2之後的系統提供了關於Wireless開發的API,
據MSDN描述,此SDK提供兩個主要功能,即:管理无线网络配置和管理无线网络连接。
使用這套API也很簡單,主要步驟如下:
- 使用WlanOpenHandle、WlanCloseHandle打開或關閉一個客戶端句柄。
- 使用WlanEnumInterfaces列舉系統中可用的Wireless設備接口,主要用到的就是它返回的每個無線網卡的GUID這個參數。
- 使用WlanGetInterfaceCapability獲取關於無線網卡的性能參數,(注意這個函數在XP SP2下是不被支持的)
- 使用WlanQueryInterface獲取關於無線網卡接口的某些參數。
- 使用WlanSetInterface設置無線網卡接口某些參數。
- 使用WlanScan列舉每個無線網卡接口上找到的可用無線AP。
- 使用WlanGetAvailableNetworkList獲取有效的無線網絡信息。
- 使用WlanGetProfile、WlanSetProfile、WlanDeleteProfile管理無線網絡配置信息。
- 使用WlanConnect、WlanDisconnect連接或斷開某個無線網絡。
在我的這個程式中隻用到WlanOpenHandle、WlanCloseHandle、WlanEnumInterfaces、WlanScan、WlanGetAvailableNetworkList就可以搜索附近的無線網絡信息。
首先,要確保Wireless Zero Configuration服務是開啟狀態。
如果它被關閉就使用StartService啟動此服務:
首先先判斷服務是否以經啟動:
- INVOKE OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
- cmp eax, NULL
- je Return_Clean
- mov @hSCM, eax
- INVOKE OpenService, @hSCM, pszServiceName, SERVICE_ALL_ACCESS
- cmp eax, NULL
- je Return_Clean
- mov @hSvr, eax
- INVOKE RtlZeroMemory, addr @qss, sizeof QSS
- INVOKE QueryServiceStatus, @hSvr, addr @qss
- cmp eax, NULL
- je Return_Clean
- mov eax, @qss.dwCurrentState
- cmp eax, 4h
- jne @F
- mov @ret, 0h
- jmp Return_Clean
- @@:
啟動服務:
- INVOKE StartService, @hSvr, 0h, NULL
- cmp eax, NULL
- je Return_Clean
注意:有時候Wireless Zero Configuration服務有可能被Disable掉,這時需要將它設為自動啟動或手動啟動才能調用StartService。
加入以下代碼:
- INVOKE QueryServiceConfig, @hSvr, NULL, 0h, addr dwBytesX
- INVOKE HeapAlloc, hHeap, HEAP_ZERO_MEMORY, dwBytesX
- mov @qsc, eax
- INVOKE QueryServiceConfig, @hSvr, @qsc, dwBytesX, addr dwBytesX
- cmp eax, NULL
- je Return_Clean
- assume ebx: PQSC
- mov ebx, @qsc
- mov eax, [ebx].dwStartType
- assume ebx: nothing
- cmp eax, 4h
- jne Return_Clean
- INVOKE ChangeServiceConfig, @hSvr, 0ffffffffh, 2h, 0ffffffffh, NULL, NULL, NULL, NULL, NULL, NULL, NULL
- @@:
獲得一個客戶端句柄:
- mov @ret, 1h
- mov @pil, NULL
- mov @hCli, NULL
- VOKE GetClientVersion
- cmp eax, 0h
- je Return_Clean
- mov ebx, eax
- mov dwReturned, 0h
- lea eax, @hCli
- push eax
- lea eax, dwReturned
- push eax
- push NULL
- push ebx
- call WlanOpenHandle
- cmp eax, 0h
- jne Return_Clean
- cmp @hCli, NULL
- je Return_Clean
其中WlanOpenHandle函數參數如下(MSDN):
- DWORD WINAPI WlanOpenHandle(
- __in DWORD dwClientVersion,
- PVOID pReserved,
- __out PDWORD pdwNegotiatedVersion,
- __out PHANDLE phClientHandle
- );
值 | 意思 |
---|---|
1 |
當系統版本為Windows XP SP2時。 |
2 |
當系統版本為Vista and Windows Server 2008或更高時。 |
這個參數設為NULL.
此值可以設為NULL。
一個句柄指針,用來接收獲得的客戶端句柄.
列舉系統中的網絡接口: