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 13 #include <iphlpapi.h> 14 #include <wlanapi.h> 15 16 #include "base/win/scoped_handle.h" 17 #include "net/base/net_export.h" 18 #include "net/base/network_interfaces.h" 19 20 namespace net::internal { 21 22 struct NET_EXPORT WlanApi { 23 typedef DWORD (WINAPI *WlanOpenHandleFunc)( 24 DWORD, VOID*, DWORD*, HANDLE*); 25 typedef DWORD (WINAPI *WlanEnumInterfacesFunc)( 26 HANDLE, VOID*, WLAN_INTERFACE_INFO_LIST**); 27 typedef DWORD (WINAPI *WlanQueryInterfaceFunc)( 28 HANDLE, const GUID*, WLAN_INTF_OPCODE, VOID*, DWORD*, VOID**, 29 WLAN_OPCODE_VALUE_TYPE*); 30 typedef DWORD (WINAPI *WlanSetInterfaceFunc)( 31 HANDLE, const GUID*, WLAN_INTF_OPCODE, DWORD, const VOID*, VOID*); 32 typedef VOID (WINAPI *WlanFreeMemoryFunc)(VOID*); 33 typedef DWORD (WINAPI *WlanCloseHandleFunc)(HANDLE, VOID*); 34 35 WlanApi(); 36 static WlanApi& GetInstance(); 37 38 template <typename T> OpenHandleWlanApi39 DWORD OpenHandle(DWORD client_version, DWORD* cur_version, T* handle) const { 40 HANDLE temp_handle; 41 DWORD result = 42 open_handle_func(client_version, nullptr, cur_version, &temp_handle); 43 if (result != ERROR_SUCCESS) 44 return result; 45 handle->Set(temp_handle); 46 return ERROR_SUCCESS; 47 } 48 49 WlanOpenHandleFunc open_handle_func; 50 WlanEnumInterfacesFunc enum_interfaces_func; 51 WlanQueryInterfaceFunc query_interface_func; 52 WlanSetInterfaceFunc set_interface_func; 53 WlanFreeMemoryFunc free_memory_func; 54 WlanCloseHandleFunc close_handle_func; 55 bool initialized; 56 }; 57 58 struct WlanApiHandleTraits { 59 typedef HANDLE Handle; 60 CloseHandleWlanApiHandleTraits61 static bool CloseHandle(HANDLE handle) { 62 return WlanApi::GetInstance().close_handle_func(handle, nullptr) == 63 ERROR_SUCCESS; 64 } IsHandleValidWlanApiHandleTraits65 static bool IsHandleValid(HANDLE handle) { 66 return base::win::HandleTraits::IsHandleValid(handle); 67 } NullHandleWlanApiHandleTraits68 static HANDLE NullHandle() { 69 return base::win::HandleTraits::NullHandle(); 70 } 71 }; 72 73 typedef base::win::GenericScopedHandle< 74 WlanApiHandleTraits, 75 base::win::DummyVerifierTraits> WlanHandle; 76 77 struct WlanApiDeleter { operatorWlanApiDeleter78 inline void operator()(void* ptr) const { 79 WlanApi::GetInstance().free_memory_func(ptr); 80 } 81 }; 82 83 NET_EXPORT bool GetNetworkListImpl( 84 NetworkInterfaceList* networks, 85 int policy, 86 const IP_ADAPTER_ADDRESSES* ip_adapter_addresses); 87 88 } // namespace net::internal 89 90 #endif // NET_BASE_NETWORK_INTERFACES_WIN_H_ 91