xref: /aosp_15_r20/external/cronet/net/base/network_interfaces_win.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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