• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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