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