-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsuffixed.py
66 lines (51 loc) · 1.86 KB
/
suffixed.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import ctypes
from socket import AF_INET
NO_ERROR = 0
ERROR_NOT_ENOUGH_MEMORY = 8
ERROR_INVALID_PARAMETER = 87
ERROR_BUFFER_OVERFLOW = 111
ERROR_NO_DATA = 232
ERROR_ADDRESS_NOT_ASSOCIATED = 1228
class IP_ADAPTER_ADDRESSES(ctypes.Structure):
pass
PIP_ADAPTER_ADDRESSES = ctypes.POINTER(IP_ADAPTER_ADDRESSES)
IP_ADAPTER_ADDRESSES._fields_ = [
('__unused_1', ctypes.c_byte * (4 + 4)),
('next', PIP_ADAPTER_ADDRESSES),
('adapter_name', ctypes.c_char_p),
('__unused_2', ctypes.c_void_p * 4),
('dns_suffix', ctypes.c_wchar_p),
# A lot of other unused fields past here but we are not really interested.
]
GetAdaptersAddresses = ctypes.windll.iphlpapi.GetAdaptersAddresses
GetAdaptersAddresses.argtypes = [
ctypes.c_ulong, # Family
ctypes.c_ulong, # Flags
ctypes.c_void_p, # Reserved
PIP_ADAPTER_ADDRESSES, # AdapterAddresses
ctypes.POINTER(ctypes.c_ulong), # SizePointer
]
GetAdaptersAddresses.restype = ctypes.c_ulong
def get_suffixed_addresses():
"""Return dict of adapter GUID to local DNS suffix of adapters with local DNS suffixes."""
# Find required size first
size = ctypes.c_ulong()
res = GetAdaptersAddresses(AF_INET, 0, None, None, size)
if res != ERROR_BUFFER_OVERFLOW:
raise RuntimeError(ctypes.FormatError(res))
# Now allocate
buffer = ctypes.create_string_buffer(size.value)
addresses = ctypes.cast(buffer, PIP_ADAPTER_ADDRESSES)
res = GetAdaptersAddresses(AF_INET, 0, None, addresses, size)
if res != NO_ERROR:
raise RuntimeError(ctypes.FormatError(res))
address_list = []
while addresses:
address_list.append(addresses.contents)
addresses = addresses.contents.next
address_map = {
info.adapter_name.decode(): info.dns_suffix
for info in address_list
if info.dns_suffix
}
return address_map