1 // Copyright 2014 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_BASE_NETWORK_INTERFACES_WIN_H_ 6 #define NET_BASE_NETWORK_INTERFACES_WIN_H_ 7 8 // This file is only used to expose some of the internals 9 // of network_interfaces_win.cc to tests. 10 11 #include <winsock2.h> 12 #include <iphlpapi.h> 13 #include <wlanapi.h> 14 15 #include "base/win/scoped_handle.h" 16 #include "net/base/net_export.h" 17 #include "net/base/network_interfaces.h" 18 19 namespace net::internal { 20 21 struct NET_EXPORT WlanApi { 22 typedef DWORD (WINAPI *WlanOpenHandleFunc)( 23 DWORD, VOID*, DWORD*, HANDLE*); 24 typedef DWORD (WINAPI *WlanEnumInterfacesFunc)( 25 HANDLE, VOID*, WLAN_INTERFACE_INFO_LIST**); 26 typedef DWORD (WINAPI *WlanQueryInterfaceFunc)( 27 HANDLE, const GUID*, WLAN_INTF_OPCODE, VOID*, DWORD*, VOID**, 28 WLAN_OPCODE_VALUE_TYPE*); 29 typedef DWORD (WINAPI *WlanSetInterfaceFunc)( 30 HANDLE, const GUID*, WLAN_INTF_OPCODE, DWORD, const VOID*, VOID*); 31 typedef VOID (WINAPI *WlanFreeMemoryFunc)(VOID*); 32 typedef DWORD (WINAPI *WlanCloseHandleFunc)(HANDLE, VOID*); 33 34 WlanApi(); 35 static WlanApi& GetInstance(); 36 37 template <typename T> OpenHandleWlanApi38 DWORD OpenHandle(DWORD client_version, DWORD* cur_version, T* handle) const { 39 HANDLE temp_handle; 40 DWORD result = 41 open_handle_func(client_version, nullptr, cur_version, &temp_handle); 42 if (result != ERROR_SUCCESS) 43 return result; 44 handle->Set(temp_handle); 45 return ERROR_SUCCESS; 46 } 47 48 WlanOpenHandleFunc open_handle_func; 49 WlanEnumInterfacesFunc enum_interfaces_func; 50 WlanQueryInterfaceFunc query_interface_func; 51 WlanSetInterfaceFunc set_interface_func; 52 WlanFreeMemoryFunc free_memory_func; 53 WlanCloseHandleFunc close_handle_func; 54 bool initialized; 55 }; 56 57 struct WlanApiHandleTraits { 58 typedef HANDLE Handle; 59 CloseHandleWlanApiHandleTraits60 static bool CloseHandle(HANDLE handle) { 61 return WlanApi::GetInstance().close_handle_func(handle, nullptr) == 62 ERROR_SUCCESS; 63 } IsHandleValidWlanApiHandleTraits64 static bool IsHandleValid(HANDLE handle) { 65 return base::win::HandleTraits::IsHandleValid(handle); 66 } NullHandleWlanApiHandleTraits67 static HANDLE NullHandle() { 68 return base::win::HandleTraits::NullHandle(); 69 } 70 }; 71 72 typedef base::win::GenericScopedHandle< 73 WlanApiHandleTraits, 74 base::win::DummyVerifierTraits> WlanHandle; 75 76 struct WlanApiDeleter { operatorWlanApiDeleter77 inline void operator()(void* ptr) const { 78 WlanApi::GetInstance().free_memory_func(ptr); 79 } 80 }; 81 82 NET_EXPORT bool GetNetworkListImpl( 83 NetworkInterfaceList* networks, 84 int policy, 85 const IP_ADAPTER_ADDRESSES* ip_adapter_addresses); 86 87 } // namespace net::internal 88 89 #endif // NET_BASE_NETWORK_INTERFACES_WIN_H_ 90