1use shared::basetsd::{UINT8, ULONG64};
7use shared::guiddef::GUID;
8use shared::ifdef::{
9 IF_INDEX, IF_LUID, IF_OPER_STATUS, NET_IF_COMPARTMENT_ID, NET_IF_CONNECTION_TYPE,
10 NET_IF_NETWORK_GUID, TUNNEL_TYPE
11};
12use shared::ipifcons::IFTYPE;
13use shared::minwindef::{BOOL, BYTE, DWORD, UCHAR, UINT};
14use shared::nldef::{NL_DAD_STATE, NL_PREFIX_ORIGIN, NL_SUFFIX_ORIGIN};
15use shared::ntdef::{CHAR, PCHAR, PWCHAR, ULONG, ULONGLONG, WCHAR};
16use shared::ws2def::SOCKET_ADDRESS;
17use ucrt::corecrt::time_t;
18pub const MAX_ADAPTER_DESCRIPTION_LENGTH: usize = 128;
19pub const MAX_ADAPTER_NAME_LENGTH: usize = 256;
20pub const MAX_ADAPTER_ADDRESS_LENGTH: usize = 8;
21pub const DEFAULT_MINIMUM_ENTITIES: usize = 32;
22pub const MAX_HOSTNAME_LEN: usize = 128;
23pub const MAX_DOMAIN_NAME_LEN: usize = 128;
24pub const MAX_SCOPE_ID_LEN: usize = 256;
25pub const MAX_DHCPV6_DUID_LENGTH: usize = 130;
26pub const MAX_DNS_SUFFIX_STRING_LENGTH: usize = 256;
27pub const BROADCAST_NODETYPE: usize = 1;
28pub const PEER_TO_PEER_NODETYPE: usize = 2;
29pub const MIXED_NODETYPE: usize = 4;
30pub const HYBRID_NODETYPE: usize = 8;
31STRUCT!{struct IP_ADDRESS_STRING {
32 String: [CHAR; 4*4],
33}}
34pub type PIP_ADDRESS_STRING = *mut IP_ADDRESS_STRING;
35pub type IP_MASK_STRING = IP_ADDRESS_STRING;
36pub type PIP_MASK_STRING = *mut IP_MASK_STRING;
37STRUCT!{struct IP_ADDR_STRING {
38 Next: *mut IP_ADDR_STRING,
39 IpAddress: IP_ADDRESS_STRING,
40 IpMask: IP_MASK_STRING,
41 Context: DWORD,
42}}
43pub type PIP_ADDR_STRING = *mut IP_ADDR_STRING;
44STRUCT!{struct IP_ADAPTER_INFO {
45 Next: *mut IP_ADAPTER_INFO,
46 ComboIndex: DWORD,
47 AdapterName: [CHAR; MAX_ADAPTER_NAME_LENGTH + 4],
48 Description: [CHAR; MAX_ADAPTER_DESCRIPTION_LENGTH + 4],
49 AddressLength: UINT,
50 Address: [BYTE; MAX_ADAPTER_ADDRESS_LENGTH],
51 Index: DWORD,
52 Type: UINT,
53 DhcpEnabled: UINT,
54 CurrentIpAddress: PIP_ADDR_STRING,
55 IpAddressList: IP_ADDR_STRING,
56 GatewayList: IP_ADDR_STRING,
57 DhcpServer: IP_ADDR_STRING,
58 HaveWins: BOOL,
59 PrimaryWinsServer: IP_ADDR_STRING,
60 SecondaryWinsServer: IP_ADDR_STRING,
61 LeaseObtained: time_t,
62 LeaseExpires: time_t,
63}}
64pub type PIP_ADAPTER_INFO = *mut IP_ADAPTER_INFO;
65pub type IP_PREFIX_ORIGIN = NL_PREFIX_ORIGIN;
66pub type IP_SUFFIX_ORIGIN = NL_SUFFIX_ORIGIN;
67pub type IP_DAD_STATE = NL_DAD_STATE;
68STRUCT!{struct IP_ADAPTER_UNICAST_ADDRESS_LH_u_s {
69 Length: ULONG,
70 Flags: DWORD,
71}}
72UNION!{union IP_ADAPTER_UNICAST_ADDRESS_LH_u {
73 [u64; 1],
74 Alignment Alignment_mut: ULONGLONG,
75 s s_mut: IP_ADAPTER_UNICAST_ADDRESS_LH_u_s,
76}}
77STRUCT!{struct IP_ADAPTER_UNICAST_ADDRESS_LH {
78 u: IP_ADAPTER_UNICAST_ADDRESS_LH_u,
79 Next: *mut IP_ADAPTER_UNICAST_ADDRESS_LH,
80 Address: SOCKET_ADDRESS,
81 PrefixOrigin: IP_PREFIX_ORIGIN,
82 SuffixOrigin: IP_SUFFIX_ORIGIN,
83 DadState: IP_DAD_STATE,
84 ValidLifetime: ULONG,
85 PreferredLifetime: ULONG,
86 LeaseLifetime: ULONG,
87 OnLinkPrefixLength: UINT8,
88}}
89pub type PIP_ADAPTER_UNICAST_ADDRESS_LH = *mut IP_ADAPTER_UNICAST_ADDRESS_LH;
90STRUCT!{struct IP_ADAPTER_UNICAST_ADDRESS_XP_u_s {
91 Length: ULONG,
92 Flags: DWORD,
93}}
94UNION!{union IP_ADAPTER_UNICAST_ADDRESS_XP_u {
95 [u64; 1],
96 Alignment Alignment_mut: ULONGLONG,
97 s s_mut: IP_ADAPTER_UNICAST_ADDRESS_XP_u_s,
98}}
99STRUCT!{struct IP_ADAPTER_UNICAST_ADDRESS_XP {
100 u: IP_ADAPTER_UNICAST_ADDRESS_XP_u,
101 Next: *mut IP_ADAPTER_UNICAST_ADDRESS_XP,
102 Address: SOCKET_ADDRESS,
103 PrefixOrigin: IP_PREFIX_ORIGIN,
104 SuffixOrigin: IP_SUFFIX_ORIGIN,
105 DadState: IP_DAD_STATE,
106 ValidLifetime: ULONG,
107 PreferredLifetime: ULONG,
108 LeaseLifetime: ULONG,
109}}
110pub type PIP_ADAPTER_UNICAST_ADDRESS_XP = *mut IP_ADAPTER_UNICAST_ADDRESS_XP;
111pub type IP_ADAPTER_UNICAST_ADDRESS = IP_ADAPTER_UNICAST_ADDRESS_LH;
112pub type PIP_ADAPTER_UNICAST_ADDRESS = *mut IP_ADAPTER_UNICAST_ADDRESS;
114pub const IP_ADAPTER_ADDRESS_DNS_ELIGIBLE: usize = 0x01;
115pub const IP_ADAPTER_ADDRESS_TRANSIENT: usize = 0x02;
116STRUCT!{struct IP_ADAPTER_ANYCAST_ADDRESS_XP_u_s {
117 Length: ULONG,
118 Flags: DWORD,
119}}
120UNION!{union IP_ADAPTER_ANYCAST_ADDRESS_XP_u {
121 [u64; 1],
122 Alignment Alignment_mut: ULONGLONG,
123 s s_mut: IP_ADAPTER_ANYCAST_ADDRESS_XP_u_s,
124}}
125STRUCT!{struct IP_ADAPTER_ANYCAST_ADDRESS_XP {
126 u: IP_ADAPTER_ANYCAST_ADDRESS_XP_u,
127 Next: *mut IP_ADAPTER_ANYCAST_ADDRESS_XP,
128 Address: SOCKET_ADDRESS,
129}}
130pub type PIP_ADAPTER_ANYCAST_ADDRESS_XP = *mut IP_ADAPTER_ANYCAST_ADDRESS_XP;
131pub type IP_ADAPTER_ANYCAST_ADDRESS = IP_ADAPTER_ANYCAST_ADDRESS_XP;
132pub type PIP_ADAPTER_ANYCAST_ADDRESS = *mut IP_ADAPTER_ANYCAST_ADDRESS;
133STRUCT!{struct IP_ADAPTER_MULTICAST_ADDRESS_XP_u_s {
134 Length: ULONG,
135 Flags: DWORD,
136}}
137UNION!{union IP_ADAPTER_MULTICAST_ADDRESS_XP_u {
138 [u64; 1],
139 Alignment Alignment_mut: ULONGLONG,
140 s s_mut: IP_ADAPTER_MULTICAST_ADDRESS_XP_u_s,
141}}
142STRUCT!{struct IP_ADAPTER_MULTICAST_ADDRESS_XP {
143 u: IP_ADAPTER_MULTICAST_ADDRESS_XP_u,
144 Next: *mut IP_ADAPTER_MULTICAST_ADDRESS_XP,
145 Address: SOCKET_ADDRESS,
146}}
147pub type PIP_ADAPTER_MULTICAST_ADDRESS_XP = *mut IP_ADAPTER_MULTICAST_ADDRESS_XP;
148pub type IP_ADAPTER_MULTICAST_ADDRESS = IP_ADAPTER_MULTICAST_ADDRESS_XP;
149pub type PIP_ADAPTER_MULTICAST_ADDRESS = *mut IP_ADAPTER_MULTICAST_ADDRESS_XP;
150STRUCT!{struct IP_ADAPTER_DNS_SERVER_ADDRESS_XP_u_s {
151 Length: ULONG,
152 Reserved: DWORD,
153}}
154UNION!{union IP_ADAPTER_DNS_SERVER_ADDRESS_XP_u {
155 [u64; 1],
156 Alignment Alignment_mut: ULONGLONG,
157 s s_mut: IP_ADAPTER_DNS_SERVER_ADDRESS_XP_u_s,
158}}
159STRUCT!{struct IP_ADAPTER_DNS_SERVER_ADDRESS_XP {
160 u: IP_ADAPTER_DNS_SERVER_ADDRESS_XP_u,
161 Next: *mut IP_ADAPTER_DNS_SERVER_ADDRESS_XP,
162 Address: SOCKET_ADDRESS,
163}}
164pub type PIP_ADAPTER_DNS_SERVER_ADDRESS_XP = *mut IP_ADAPTER_DNS_SERVER_ADDRESS_XP;
165pub type IP_ADAPTER_DNS_SERVER_ADDRESS = IP_ADAPTER_DNS_SERVER_ADDRESS_XP;
166pub type PIP_ADAPTER_DNS_SERVER_ADDRESS = *mut IP_ADAPTER_DNS_SERVER_ADDRESS_XP;
167STRUCT!{struct IP_ADAPTER_WINS_SERVER_ADDRESS_LH_u_s {
168 Length: ULONG,
169 Reserved: DWORD,
170}}
171UNION!{union IP_ADAPTER_WINS_SERVER_ADDRESS_LH_u {
172 [u64; 1],
173 Alignment Alignment_mut: ULONGLONG,
174 s s_mut: IP_ADAPTER_WINS_SERVER_ADDRESS_LH_u_s,
175}}
176STRUCT!{struct IP_ADAPTER_WINS_SERVER_ADDRESS_LH {
177 u: IP_ADAPTER_WINS_SERVER_ADDRESS_LH_u,
178 Next: *mut IP_ADAPTER_WINS_SERVER_ADDRESS_LH,
179 Address: SOCKET_ADDRESS,
180}}
181pub type PIP_ADAPTER_WINS_SERVER_ADDRESS_LH = *mut IP_ADAPTER_WINS_SERVER_ADDRESS_LH;
182pub type IP_ADAPTER_WINS_SERVER_ADDRESS = IP_ADAPTER_WINS_SERVER_ADDRESS_LH;
183pub type PIP_ADAPTER_WINS_SERVER_ADDRESS = *mut IP_ADAPTER_WINS_SERVER_ADDRESS_LH;
184STRUCT!{struct IP_ADAPTER_GATEWAY_ADDRESS_LH_u_s {
185 Length: ULONG,
186 Reserved: DWORD,
187}}
188UNION!{union IP_ADAPTER_GATEWAY_ADDRESS_LH_u {
189 [u64; 1],
190 Alignment Alignment_mut: ULONGLONG,
191 s s_mut: IP_ADAPTER_GATEWAY_ADDRESS_LH_u_s,
192}}
193STRUCT!{struct IP_ADAPTER_GATEWAY_ADDRESS_LH {
194 u: IP_ADAPTER_GATEWAY_ADDRESS_LH_u,
195 Next: *mut IP_ADAPTER_GATEWAY_ADDRESS_LH,
196 Address: SOCKET_ADDRESS,
197}}
198pub type PIP_ADAPTER_GATEWAY_ADDRESS_LH = *mut IP_ADAPTER_GATEWAY_ADDRESS_LH;
199pub type IP_ADAPTER_GATEWAY_ADDRESS = IP_ADAPTER_GATEWAY_ADDRESS_LH;
200pub type PIP_ADAPTER_GATEWAY_ADDRESS = *mut IP_ADAPTER_GATEWAY_ADDRESS_LH;
201STRUCT!{struct IP_ADAPTER_PREFIX_XP_u_s {
202 Length: ULONG,
203 Flags: DWORD,
204}}
205UNION!{union IP_ADAPTER_PREFIX_XP_u {
206 [u64; 1],
207 Alignment Alignment_mut: ULONGLONG,
208 s s_mut: IP_ADAPTER_PREFIX_XP_u_s,
209}}
210STRUCT!{struct IP_ADAPTER_PREFIX_XP {
211 u: IP_ADAPTER_PREFIX_XP_u,
212 Next: *mut IP_ADAPTER_PREFIX_XP,
213 Address: SOCKET_ADDRESS,
214 PrefixLength: ULONG,
215}}
216pub type PIP_ADAPTER_PREFIX_XP = *mut IP_ADAPTER_PREFIX_XP;
217pub type IP_ADAPTER_PREFIX = IP_ADAPTER_PREFIX_XP;
218pub type PIP_ADAPTER_PREFIX = *mut IP_ADAPTER_PREFIX_XP;
219STRUCT!{struct IP_ADAPTER_DNS_SUFFIX {
220 Next: *mut IP_ADAPTER_DNS_SUFFIX,
221 String: [WCHAR; MAX_DNS_SUFFIX_STRING_LENGTH],
222}}
223pub type PIP_ADAPTER_DNS_SUFFIX = *mut IP_ADAPTER_DNS_SUFFIX;
224pub const IP_ADAPTER_DDNS_ENABLED: DWORD = 0x00000001;
225pub const IP_ADAPTER_REGISTER_ADAPTER_SUFFIX: DWORD = 0x00000002;
226pub const IP_ADAPTER_DHCP_ENABLED: DWORD = 0x00000004;
227pub const IP_ADAPTER_RECEIVE_ONLY: DWORD = 0x00000008;
228pub const IP_ADAPTER_NO_MULTICAST: DWORD = 0x00000010;
229pub const IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG: DWORD = 0x00000020;
230pub const IP_ADAPTER_NETBIOS_OVER_TCPIP_ENABLED: DWORD = 0x00000040;
231pub const IP_ADAPTER_IPV4_ENABLED: DWORD = 0x00000080;
232pub const IP_ADAPTER_IPV6_ENABLED: DWORD = 0x00000100;
233pub const IP_ADAPTER_IPV6_MANAGE_ADDRESS_CONFIG: DWORD = 0x00000200;
234STRUCT!{struct IP_ADAPTER_ADDRESSES_LH_u_s {
235 Length: ULONG,
236 IfIndex: IF_INDEX,
237}}
238UNION!{union IP_ADAPTER_ADDRESSES_LH_u {
239 [u64; 1],
240 Alignment Alignment_mut: ULONGLONG,
241 s s_mut: IP_ADAPTER_ADDRESSES_LH_u_s,
242}}
243STRUCT!{struct IP_ADAPTER_ADDRESSES_LH {
244 u: IP_ADAPTER_ADDRESSES_LH_u,
245 Next: *mut IP_ADAPTER_ADDRESSES_LH,
246 AdapterName: PCHAR,
247 FirstUnicastAddress: PIP_ADAPTER_UNICAST_ADDRESS_LH,
248 FirstAnycastAddress: PIP_ADAPTER_ANYCAST_ADDRESS_XP,
249 FirstMulticastAddress: PIP_ADAPTER_MULTICAST_ADDRESS_XP,
250 FirstDnsServerAddress: PIP_ADAPTER_DNS_SERVER_ADDRESS_XP,
251 DnsSuffix: PWCHAR,
252 Description: PWCHAR,
253 FriendlyName: PWCHAR,
254 PhysicalAddress: [BYTE; MAX_ADAPTER_ADDRESS_LENGTH],
255 PhysicalAddressLength: ULONG,
256 Flags: ULONG,
257 Mtu: ULONG,
258 IfType: IFTYPE,
259 OperStatus: IF_OPER_STATUS,
260 Ipv6IfIndex: IF_INDEX,
261 ZoneIndices: [ULONG; 16],
262 FirstPrefix: PIP_ADAPTER_PREFIX_XP,
263 TransmitLinkSpeed: ULONG64,
264 ReceiveLinkSpeed: ULONG64,
265 FirstWinsServerAddress: PIP_ADAPTER_WINS_SERVER_ADDRESS_LH,
266 FirstGatewayAddress: PIP_ADAPTER_GATEWAY_ADDRESS_LH,
267 Ipv4Metric: ULONG,
268 Ipv6Metric: ULONG,
269 Luid: IF_LUID,
270 Dhcpv4Server: SOCKET_ADDRESS,
271 CompartmentId: NET_IF_COMPARTMENT_ID,
272 NetworkGuid: NET_IF_NETWORK_GUID,
273 ConnectionType: NET_IF_CONNECTION_TYPE,
274 TunnelType: TUNNEL_TYPE,
275 Dhcpv6Server: SOCKET_ADDRESS,
276 Dhcpv6ClientDuid: [BYTE; MAX_DHCPV6_DUID_LENGTH],
277 Dhcpv6ClientDuidLength: ULONG,
278 Dhcpv6Iaid: ULONG,
279 FirstDnsSuffix: PIP_ADAPTER_DNS_SUFFIX,
280}}
281BITFIELD!{IP_ADAPTER_ADDRESSES_LH Flags: ULONG [
282 DdnsEnabled set_DdnsEnabled[0..1],
283 RegisterAdapterSuffix set_RegisterAdapterSuffix[1..2],
284 Dhcpv4Enabled set_Dhcpv4Enabled[2..3],
285 ReceiveOnly set_ReceiveOnly[3..4],
286 NoMulticast set_NoMulticast[4..5],
287 Ipv6OtherStatefulConfig set_Ipv6OtherStatefulConfig[5..6],
288 NetbiosOverTcpipEnabled set_NetbiosOverTcpipEnabled[6..7],
289 Ipv4Enabled set_Ipv4Enabled[7..8],
290 Ipv6Enabled set_Ipv6Enabled[8..9],
291 Ipv6ManagedAddressConfigurationSupported set_Ipv6ManagedAddressConfigurationSupported[9..10],
292]}
293pub type PIP_ADAPTER_ADDRESSES_LH = *mut IP_ADAPTER_ADDRESSES_LH;
294STRUCT!{struct IP_ADAPTER_ADDRESSES_XP_u_s {
295 Length: ULONG,
296 IfIndex: DWORD,
297}}
298UNION!{union IP_ADAPTER_ADDRESSES_XP_u {
299 [u64; 1],
300 Alignment Alignment_mut: ULONGLONG,
301 s s_mut: IP_ADAPTER_ADDRESSES_XP_u_s,
302}}
303STRUCT!{struct IP_ADAPTER_ADDRESSES_XP {
304 u: IP_ADAPTER_ADDRESSES_XP_u,
305 Next: *mut IP_ADAPTER_ADDRESSES_XP,
306 AdapterName: PCHAR,
307 FirstUnicastAddress: PIP_ADAPTER_UNICAST_ADDRESS_XP,
308 FirstAnycastAddress: PIP_ADAPTER_ANYCAST_ADDRESS_XP,
309 FirstMulticastAddress: PIP_ADAPTER_MULTICAST_ADDRESS_XP,
310 FirstDnsServerAddress: PIP_ADAPTER_DNS_SERVER_ADDRESS_XP,
311 DnsSuffix: PWCHAR,
312 Description: PWCHAR,
313 FriendlyName: PWCHAR,
314 PhysicalAddress: [BYTE; MAX_ADAPTER_ADDRESS_LENGTH],
315 PhysicalAddressLength: DWORD,
316 Flags: DWORD,
317 Mtu: DWORD,
318 IfType: DWORD,
319 OperStatus: IF_OPER_STATUS,
320 Ipv6IfIndex: DWORD,
321 ZoneIndices: [DWORD; 16],
322 FirstPrefix: PIP_ADAPTER_PREFIX_XP,
323}}
324pub type PIP_ADAPTER_ADDRESSES_XP = *mut IP_ADAPTER_ADDRESSES_XP;
325pub type IP_ADAPTER_ADDRESSES = IP_ADAPTER_ADDRESSES_LH;
326pub type PIP_ADAPTER_ADDRESSES = *mut IP_ADAPTER_ADDRESSES;
328pub const GAA_FLAG_SKIP_UNICAST: ULONG = 0x0001;
329pub const GAA_FLAG_SKIP_ANYCAST: ULONG = 0x0002;
330pub const GAA_FLAG_SKIP_MULTICAST: ULONG = 0x0004;
331pub const GAA_FLAG_SKIP_DNS_SERVER: ULONG = 0x0008;
332pub const GAA_FLAG_INCLUDE_PREFIX: ULONG = 0x0010;
333pub const GAA_FLAG_SKIP_FRIENDLY_NAME: ULONG = 0x0020;
334pub const GAA_FLAG_INCLUDE_WINS_INFO: ULONG = 0x0040;
335pub const GAA_FLAG_INCLUDE_GATEWAYS: ULONG = 0x0080;
336pub const GAA_FLAG_INCLUDE_ALL_INTERFACES: ULONG = 0x0100;
337pub const GAA_FLAG_INCLUDE_ALL_COMPARTMENTS: ULONG = 0x0200;
338pub const GAA_FLAG_INCLUDE_TUNNEL_BINDINGORDER: ULONG = 0x0400;
339STRUCT!{struct IP_PER_ADAPTER_INFO_W2KSP1 {
340 AutoconfigEnabled: UINT,
341 AutoconfigActive: UINT,
342 CurrentDnsServer: PIP_ADDR_STRING,
343 DnsServerList: IP_ADDR_STRING,
344}}
345pub type PIP_PER_ADAPTER_INFO_W2KSP1 = *mut IP_PER_ADAPTER_INFO_W2KSP1;
346pub type IP_PER_ADAPTER_INFO = IP_PER_ADAPTER_INFO_W2KSP1;
347pub type PIP_PER_ADAPTER_INFO = *mut IP_PER_ADAPTER_INFO;
348STRUCT!{struct FIXED_INFO_W2KSP1 {
349 HostName: [CHAR; MAX_HOSTNAME_LEN + 4],
350 DomainName: [CHAR; MAX_DOMAIN_NAME_LEN + 4],
351 CurrentDnsServer: PIP_ADDR_STRING,
352 DnsServerList: IP_ADDR_STRING,
353 NodeType: UINT,
354 ScopeId: [CHAR; MAX_SCOPE_ID_LEN + 4],
355 EnableRouting: UINT,
356 EnableProxy: UINT,
357 EnableDns: UINT,
358}}
359pub type PFIXED_INFO_W2KSP1 = *mut FIXED_INFO_W2KSP1;
360pub type FIXED_INFO = FIXED_INFO_W2KSP1;
361pub type PFIXED_INFO = *mut FIXED_INFO;
362STRUCT!{struct IP_INTERFACE_NAME_INFO_W2KSP1 {
363 Index: ULONG,
364 MediaType: ULONG,
365 ConnectionType: UCHAR,
366 AccessType: UCHAR,
367 DeviceGuid: GUID,
368 InterfaceGuid: GUID,
369}}
370pub type PIP_INTERFACE_NAME_INFO_W2KSP1 = *mut IP_INTERFACE_NAME_INFO_W2KSP1;
371pub type IP_INTERFACE_NAME_INFO = IP_INTERFACE_NAME_INFO_W2KSP1;
372pub type PIP_INTERFACE_NAME_INFO = *mut IP_INTERFACE_NAME_INFO;