1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. 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 { 20 namespace 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 HMODULE module; 50 WlanOpenHandleFunc open_handle_func; 51 WlanEnumInterfacesFunc enum_interfaces_func; 52 WlanQueryInterfaceFunc query_interface_func; 53 WlanSetInterfaceFunc set_interface_func; 54 WlanFreeMemoryFunc free_memory_func; 55 WlanCloseHandleFunc close_handle_func; 56 bool initialized; 57 }; 58 59 struct WlanApiHandleTraits { 60 typedef HANDLE Handle; 61 CloseHandleWlanApiHandleTraits62 static bool CloseHandle(HANDLE handle) { 63 return WlanApi::GetInstance().close_handle_func(handle, nullptr) == 64 ERROR_SUCCESS; 65 } IsHandleValidWlanApiHandleTraits66 static bool IsHandleValid(HANDLE handle) { 67 return base::win::HandleTraits::IsHandleValid(handle); 68 } NullHandleWlanApiHandleTraits69 static HANDLE NullHandle() { 70 return base::win::HandleTraits::NullHandle(); 71 } 72 }; 73 74 typedef base::win::GenericScopedHandle< 75 WlanApiHandleTraits, 76 base::win::DummyVerifierTraits> WlanHandle; 77 78 struct WlanApiDeleter { operatorWlanApiDeleter79 inline void operator()(void* ptr) const { 80 WlanApi::GetInstance().free_memory_func(ptr); 81 } 82 }; 83 84 NET_EXPORT bool GetNetworkListImpl( 85 NetworkInterfaceList* networks, 86 int policy, 87 const IP_ADAPTER_ADDRESSES* ip_adapter_addresses); 88 89 } // namespace internal 90 91 } // namespace net 92 93 #endif // NET_BASE_NETWORK_INTERFACES_WIN_H_ 94